JavaWeb入门-SMBMS

SMBMS

这个小项目主要是javaWeb的一个回顾,这个博客只讲了部分功能(主要是用户管理模块),因为其他功能都是大同小异,加上本人比较懒,都是一些sql语句的不同,就没有写。

主要参考狂神javaWeb最后的视频讲解,边写边回顾javaWeb的一些知识点

还有这个项目的前端是直接拿过来用的,不是自己写的…

项目简介:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.环境搭建

首先是基本环境的搭建

1.1 数据库的创建和连接

在这里插入图片描述

1.2 导入相关依赖

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
  </dependencies>

1.3 基本框架搭建

创建dao层(数据持久层),pojo( 简单的Java对象 ),Service(业务层),servlet(服务器层),tools(工具层),filter(过滤层)

dao层主要进行数据库操作,Service(业务层)调用dao层,并将获得的数据传给servlet层,

servlet层负责前后端交互,从前端获取数据,传到后端,并将后端获取的数据返回给前端

service层捕获异常,进行事务处理

事务处理:调用不同dao的多个方法,必须使用同一个connection(connection作为参数传递)事务完成之后,需要在service层进行connection的关闭,在dao层关闭(PreparedStatement和ResultSet对象)

pojo层主要是与数据库对应的一些对象

过滤器层首先要写编码过滤层,防止前后端编码不一致乱码情况
在这里插入图片描述

package cn.smbms.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncoding implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

}

注册

  <filter>
    <filter-name>CharacterEncoding</filter-name>
    <filter-class>cn.smbms.filter.CharacterEncoding</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

1.4 编写数据库连接资源文件

在这里插入图片描述

driver=com.mysql.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8
user=root
password=445133469

2. 基础类编写

2.1 pojo层

就是按照数据库创建对象

User类

package cn.smbms.pojo;

import java.util.Date;

public class User {
	private Integer id; //id 
	private String userCode; //用户编码
	private String userName; //用户名称
	private String userPassword; //用户密码
	private Integer gender;  //性别
	private Date birthday;  //出生日期
	private String phone;   //电话
	private String address; //地址
	private Integer userRole;    //用户角色
	private Integer createdBy;   //创建者
	private Date creationDate; //创建时间
	private Integer modifyBy;     //更新者
	private Date modifyDate;   //更新时间
	
	private Integer age;//年龄
	
	private String userRoleName;    //用户角色名称
	
	//此处省略所有的get和set方法 因为太多太占篇幅了 大家写的时候加上就行了
	
    
}

2.2 操作数据库的基类–静态类

BaseDao类

package cn.smbms.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class BaseDao {
	
	static{//静态代码块,在类加载的时候执行
		init();
	}
	
	private static String driver;
	private static String url;
	private static String user;
	private static String password;
	
	//初始化连接参数,从配置文件里获得
	public static void init(){
		Properties params=new Properties();
		String configFile = "database.properties";
		InputStream is= BaseDao.class.getClassLoader().getResourceAsStream(configFile);
		try {
			params.load(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
		driver=params.getProperty("driver");
		url=params.getProperty("url");
		user=params.getProperty("user");
		password=params.getProperty("password");

	}   
	
	
	/**
	 * 获取数据库连接
	 * @return
	 */
	public static Connection getConnection(){
		Connection connection = null;
		try {
			Class.forName(driver);
			connection = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return connection;
	}
	/**
	 * 查询操作
	 */
	public static ResultSet execute(Connection connection,PreparedStatement pstm,ResultSet rs,
			String sql,Object[] params) throws Exception{
		pstm = connection.prepareStatement(sql);
		for(int i = 0; i < params.length; i++){
			pstm.setObject(i+1, params[i]);
		}
		rs = pstm.executeQuery();
		return rs;
	}
	/**
	 * 更新操作
	 */
	public static int execute(Connection connection,PreparedStatement pstm,
			String sql,Object[] params) throws Exception{
		int updateRows = 0;
		pstm = connection.prepareStatement(sql);
		for(int i = 0; i < params.length; i++){
			pstm.setObject(i+1, params[i]);
		}
		updateRows = pstm.executeUpdate();
		return updateRows;
	}
	
	/**
	 * 释放资源
	 */
	public static boolean closeResource(Connection connection,PreparedStatement pstm,ResultSet rs){
		boolean flag = true;
		if(rs != null){
			try {
				rs.close();
				rs = null;//GC回收
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				flag = false;
			}
		}
		if(pstm != null){
			try {
				pstm.close();
				pstm = null;//GC回收
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				flag = false;
			}
		}
		if(connection != null){
			try {
				connection.close();
				connection = null;//GC回收
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				flag = false;
			}
		}
		
		return flag;
	}

}

这个类主要是数据库操作的方法,面对不同的数据库操作,只需要传入不同的参数即可,需要注意的就是静态初始化代码块,(静态代码块,在类被加载时会运行,且只运行一次),主要是获取database.properties文件里的信息

3. 登录界面

接下来开始进入主题,首先是登录页面的编写

在这里插入图片描述

3.1 欢迎页设置

web.xml中有一个属性是welcome-file-list , 用于当用户在url中输入工程名称或者输入web容器url(如http://localhost:8080/)时直接跳转的页面

  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>

3.2 前端

看login.jsp的主题代码无非就是那个登录的表格,我们应该做的就是去获取表格中的数据,传到后端,然后与数据库中数据对比,如果正确,登录成功,错误的话提示登录失败

在这里插入图片描述

3.3 LoginServlet

简单说一下Servlet类的编写,就是继承HttpServlet类,重写doGet和doPost方法,两个方法只需要重写一个,两个方法互相调用即可

package cn.smbms.servlet.user;

import cn.smbms.pojo.User;
import cn.smbms.service.user.UserService;
import cn.smbms.service.user.UserServiceImpl;
import cn.smbms.tools.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println("login ============ " );
		//获取用户名和密码
		String userCode = request.getParameter("userCode");
		String userPassword = request.getParameter("userPassword");
		//调用service方法,进行用户匹配
		UserService userService = new UserServiceImpl();
		User user = userService.login(userCode,userPassword);
		if(null != user){//登录成功
			//放入session
			request.getSession().setAttribute(Constants.USER_SESSION, user);
			//页面跳转(frame.jsp)
			response.sendRedirect("jsp/frame.jsp");
		}else{
			//页面跳转(login.jsp)带出提示信息--转发
			request.setAttribute("error", "用户名或密码不正确");
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}

	}


}

1.request.getparam() 获取前端数据

2.调用业务层

3.匹配成功的话设置session,页面重定向,否则,提示错误(设置页面error属性)

在这里插入图片描述

request.getSession().setAttribute(Constants.USER_SESSION, user);

因为这个session属性常用,所以我们将它放在工具类的常量类中

package cn.smbms.tools;

public class Constants {
	public final static String USER_SESSION = "userSession";
}
知识回顾:Session

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Seesion对象;
  • 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
  • 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……

Session和cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务创建;

我们可以把数据存到当前用户数据存到session中

参考文档: https://www.cnblogs.com/xdp-gacl/p/3855702.html

3.4 UserService

service层捕获异常,进行事务处理

事务处理:调用不同dao的多个方法,必须使用同一个connection(connection作为参数传递)

事务完成之后,需要在service层进行connection的关闭,在dao层关闭(PreparedStatement和ResultSet对象)

根据servlet层,service层主要是调用dao层查找servlet层传来数据的相关用户,并于servlet层的数据进行对比

UserService

public interface UserService {
	//用户登录
	public User login(String userCode, String userPassword);
}

UserServiceImp

@Override
	public User login(String userCode, String userPassword) {
		// TODO Auto-generated method stub
		Connection connection = null;
		User user = null;
		try {
			connection = BaseDao.getConnection();
			user = userDao.getLoginUser(connection, userCode);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			BaseDao.closeResource(connection, null, null);
		}
		
		//匹配密码
		if(null != user){
			if(!user.getUserPassword().equals(userPassword))
				user = null;
		}
		
		return user;
	}

3.5 UserDao

Dao层获取数据库数据

package cn.smbms.dao.user;

import cn.smbms.pojo.User;

import java.sql.Connection;
import java.util.List;

public interface UserDao {
//	通过userCode获取User
	public User getLoginUser(Connection connection, String userCode)throws Exception;
}
@Override
	public User getLoginUser(Connection connection, String userCode)
			throws Exception {
		// TODO Auto-generated method stub
		PreparedStatement pstm = null;
		ResultSet rs = null;
		User user = null;
		if(null != connection){
			String sql = "select * from smbms_user where userCode=?";
			Object[] params = {userCode};
			rs = BaseDao.execute(connection, pstm, rs, sql, params);
			if(rs.next()){
				user = new User();
				user.setId(rs.getInt("id"));
				user.setUserCode(rs.getString("userCode"));
				user.setUserName(rs.getString("userName"));
				user.setUserPassword(rs.getString("userPassword"));
				user.setGender(rs.getInt("gender"));
				user.setBirthday(rs.getDate("birthday"));
				user.setPhone(rs.getString("phone"));
				user.setAddress(rs.getString("address"));
				user.setUserRole(rs.getInt("userRole"));
				user.setCreatedBy(rs.getInt("createdBy"));
				user.setCreationDate(rs.getTimestamp("creationDate"));
				user.setModifyBy(rs.getInt("modifyBy"));
				user.setModifyDate(rs.getTimestamp("modifyDate"));
			}
			BaseDao.closeResource(null, pstm, rs);
		}
		return user;
	}

调用数据库基础类,传入相应参数即可

3.6 注册servlet

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.smbms.servlet.user.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
  </servlet-mapping>

这个在这里说一下后面就不想说了

配置Tmocat,测试运行

4.用户管理页面(重点)

在这里插入图片描述

用户管理页面大概分成了五块

  1. 查询板块
  2. 用户列表显示
  3. 用户操作
  4. 添加用户
  5. 分页显示

4.1 查询和用户列表

4.1.1 前端
<!--用户-->
            <table class="providerTable" cellpadding="0" cellspacing="0">
                <tr class="firstTr">
                    <th width="10%">用户编码</th>
                    <th width="20%">用户名称</th>
                    <th width="10%">性别</th>
                    <th width="10%">年龄</th>
                    <th width="10%">电话</th>
                    <th width="10%">用户角色</th>
                    <th width="30%">操作</th>
                </tr>
                   <c:forEach var="user" items="${userList}" varStatus="status">
					<tr>
						<td><span>${user.userCode}</span></td>
						<td><span>${user.userName}</span></td>
						<td>
							<span>
								<c:if test="${user.gender==1}">男</c:if>
								<c:if test="${user.gender==2}">女</c:if>
							</span>
						</td>
						<td><span>${user.age}</span></td>
						<td><span>${user.phone}</span></td>
						<td><span>${user.userRoleName}</span></td>
						<td>
						<span><a class="viewUser" href="javascript:;" userid=${user.id } username=${user.userName}><img src="${pageContext.request.contextPath}/images/read.png" alt="查看" title="查看"/></a></span>
						<span><a class="modifyUser" href="javascript:;" userid=${user.id } username=${user.userName}><img src="${pageContext.request.contextPath }/images/xiugai.png" alt="修改" title="修改"/></a></span>
						<span><a class="deleteUser" href="javascript:;" userid=${user.id } username=${user.userName}><img src="${pageContext.request.contextPath }/images/schu.png" alt="删除" title="删除"/></a></span>
						</td>
					</tr>
				</c:forEach>
			</table>
知识回顾:jstl

<c:> 这是jstl的语法 jstl是jsp的标准标签库

引用核心标签库的语法如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

在这里插入图片描述

了解常用的就行

在这里插入图片描述

${变量名} EL表达式

当EL表达式中的变量不给定范围时,则默认在page范围查找,然后依次在request、session、application范围查找

4.1.2 UserServlet

思路:获取数据库用户数据,并设置Session属性userList

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
    	String method = request.getParameter("method");
    	if(method == "query"){
			//查询用户列表
            String queryUserName = request.getParameter("queryname");
            String temp = request.getParameter("queryUserRole");
            int queryUserRole = 0;
            UserService userService = new UserServiceImpl();
            List<User> userList = null;
            if(queryUserName == null){
                queryUserName = "";
            }
            if(temp != null && !temp.equals("")){
                queryUserRole = Integer.parseInt(temp);
            }

            userList = userService.getUserList(queryUserName,queryUserRole,currentPageNo, pageSize);
            request.setAttribute("userList", userList);
            List<Role> roleList = null;
            RoleService roleService = new RoleServiceImpl();
            roleList = roleService.getRoleList();
            request.setAttribute("roleList", roleList);
            request.setAttribute("queryUserName", queryUserName);
            request.setAttribute("queryUserRole", queryUserRole);
            request.setAttribute("totalPageCount", totalPageCount);
            request.setAttribute("totalCount", totalCount);
            request.setAttribute("currentPageNo", currentPageNo);
            request.getRequestDispatcher("userlist.jsp").forward(request, response);
        }
}

因为用户列表是和用户查询是一体的,所以刚点进去默认就是查找所有用户(没有参数),这里需要提一下这里前端的一个技巧

在这里插入图片描述

?后面是会传递给后端的参数,可以通过request.getParamter获取 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZviYcLTh-1595233313041)(C:\Users\WIN10\AppData\Roaming\Typora\typora-user-images\1595127942221.png)]

这样做当你加载这个页面时,后端收到这个参数就会先执行一次查询,将当前所有用户传给前端

写完一个Servlet,先去注册它

4.1.3 UserService
public List<User> getUserList(String queryUserName,int queryUserRole) {
		// TODO Auto-generated method stub
		Connection connection = null;
		List<User> userList = null;
		try {
			connection = BaseDao.getConnection();
			userList = userDao.getUserList(connection, queryUserName,queryUserRole,currentPageNo,pageSize);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			BaseDao.closeResource(connection, null, null);
		}
		return userList;
	}
4.1.4 UserDao 查询
public List<User> getUserList(Connection connection, String userName)
			throws Exception {
		// TODO Auto-generated method stub
		PreparedStatement pstm = null;
		ResultSet rs = null;
		List<User> userList = new ArrayList<User>();
		if(connection != null){
			StringBuffer sql = new StringBuffer();
			sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
			List<Object> list = new ArrayList<Object>();
            
            //判断字符串是否为空或null
			if(!StringUtils.isNullOrEmpty(userName)){
				sql.append(" and u.userName like ?");
				list.add("%"+userName+"%");
			}
			if(userRole > 0){
				sql.append(" and u.userRole = ?");
				list.add(userRole);
			}
			
			Object[] params = list.toArray();
			System.out.println("sql ----> " + sql.toString());
			rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
			while(rs.next()){
				User _user = new User();
				_user.setId(rs.getInt("id"));
				_user.setUserCode(rs.getString("userCode"));
				_user.setUserName(rs.getString("userName"));
				_user.setGender(rs.getInt("gender"));
				_user.setBirthday(rs.getDate("birthday"));
				_user.setPhone(rs.getString("phone"));
				_user.setUserRole(rs.getInt("userRole"));
				_user.setUserRoleName(rs.getString("userRoleName"));
				userList.add(_user);
			}
			BaseDao.closeResource(null, pstm, rs);
		}
		return userList;
	}

这个查询用了连接查询以及模糊查询(名字),通过判断参数改变sql语句,并把参数存到一个List中

4.2 分页管理

现在执行查询之后页面并没有实现分页,而是全部显示在了一页,所以接下来还是实现分页查询,就是在前面的用户查询中加入分页查询

4.2.1 前端

在这里插入图片描述
在这里插入图片描述

4.2.2 创建页码工具类

其中包括当前页码,总页码,页码容量,总数量,以及他们的get和set方法

set方法需要根据相关的计算自己定义

package cn.smbms.tools;

public class PageSupport {
	//当前页码-来自于用户输入
	private int currentPageNo = 1;
	
	//总数量(表)
	private int totalCount = 0;
	
	//页面容量
	private int pageSize = 0;
	
	//总页数=totalCount/pageSize(+1)
	private int totalPageCount = 1;

	public int getCurrentPageNo() {
		return currentPageNo;
	}

	public void setCurrentPageNo(int currentPageNo) {
		if(currentPageNo > 0){
			this.currentPageNo = currentPageNo;
		}
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		if(totalCount > 0){
			this.totalCount = totalCount;
			//设置总页数
			this.setTotalPageCountByRs();
		}
	}
	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		if(pageSize > 0){
			this.pageSize = pageSize;
		}
	}

	public int getTotalPageCount() {
		return totalPageCount;
	}

	public void setTotalPageCount(int totalPageCount) {
		this.totalPageCount = totalPageCount;
	}
	
	public void setTotalPageCountByRs(){
		if(this.totalCount % this.pageSize == 0){
			this.totalPageCount = this.totalCount / this.pageSize;
		}else if(this.totalCount % this.pageSize > 0){
			this.totalPageCount = this.totalCount / this.pageSize + 1;
		}else{
			this.totalPageCount = 0;
		}
	}
	
}

还有常量类

public final static int pageSize = 5;
4.2.3 UserServlet
private void query(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//查询用户列表
    	String queryUserName = request.getParameter("queryname");
		String temp = request.getParameter("queryUserRole");
		String pageIndex = request.getParameter("pageIndex");
		int queryUserRole = 0;
		UserService userService = new UserServiceImpl();
		List<User> userList = null;
    	//当前页码
    	int currentPageNo = 1;
		if(queryUserName == null){
			queryUserName = "";
		}
		if(temp != null && !temp.equals("")){
			queryUserRole = Integer.parseInt(temp);
		}

		if(pageIndex != null){
    		try{
    			currentPageNo = Integer.valueOf(pageIndex);
    		}catch(NumberFormatException e){
    			response.sendRedirect("error.jsp");
    		}
    	}	
    	//总数量(表)	
    	int totalCount	= userService.getUserCount(queryUserName,queryUserRole);
    	
    	PageSupport pages=new PageSupport();
    	//当前页码
    	pages.setCurrentPageNo(currentPageNo);
    	//页面容量
    	pages.setPageSize(Constants.pageSize);
    	//总容量
    	pages.setTotalCount(totalCount);
    	
    	//总页码
    	int totalPageCount = pages.getTotalPageCount();
    	
    	//控制首页和尾页(下一页和上一页)
    	if(currentPageNo < 1){
    		currentPageNo = 1;
    	}else if(currentPageNo > totalPageCount){
    		currentPageNo = totalPageCount;
    	}
		
		
		userList = userService.getUserList(queryUserName,queryUserRole,currentPageNo, pageSize);
		request.setAttribute("userList", userList);
		List<Role> roleList = null;
		RoleService roleService = new RoleServiceImpl();
		roleList = roleService.getRoleList();
		request.setAttribute("roleList", roleList);
		request.setAttribute("queryUserName", queryUserName);
		request.setAttribute("queryUserRole", queryUserRole);
		request.setAttribute("totalPageCount", totalPageCount);
		request.setAttribute("totalCount", totalCount);
		request.setAttribute("currentPageNo", currentPageNo);
		request.getRequestDispatcher("userlist.jsp").forward(request, response);
	}
4.2.4 UserService
public int getUserCount(String queryUserName, int queryUserRole) {
		// TODO Auto-generated method stub
		Connection connection = null;
		int count = 0;
		try {
			connection = BaseDao.getConnection();
			count = userDao.getUserCount(connection, queryUserName,queryUserRole);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			BaseDao.closeResource(connection, null, null);
		}
		return count;
	}

修改一下之前的获取用户列表查询,把分页查询加进去

public List<User> getUserList(String queryUserName,int queryUserRole,int currentPageNo, int pageSize) {
		// TODO Auto-generated method stub
		Connection connection = null;
		List<User> userList = null;
		try {
			connection = BaseDao.getConnection();
			userList = userDao.getUserList(connection, queryUserName,queryUserRole,currentPageNo,pageSize);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			BaseDao.closeResource(connection, null, null);
		}
		return userList;
	}
4.2.5 UserDao

获取查询人数

public int getUserCount(Connection connection, String userName, int userRole)
			throws Exception {
		// TODO Auto-generated method stub
		PreparedStatement pstm = null;
		ResultSet rs = null;
		int count = 0;
		if(connection != null){
			StringBuffer sql = new StringBuffer();
			sql.append("select count(1) as count from smbms_user u,smbms_role r where u.userRole = r.id");
			List<Object> list = new ArrayList<Object>();
			if(!StringUtils.isNullOrEmpty(userName)){
				sql.append(" and u.userName like ?");
				list.add("%"+userName+"%");
			}
			if(userRole > 0){
				sql.append(" and u.userRole = ?");
				list.add(userRole);
			}
			Object[] params = list.toArray();
			rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
			if(rs.next()){
				count = rs.getInt("count");
			}
			BaseDao.closeResource(null, pstm, rs);
		}
		return count;
	}

加入分页查询后的用户列表查询

public List<User> getUserList(Connection connection, String userName,int userRole,int currentPageNo, int pageSize)
			throws Exception {
		// TODO Auto-generated method stub
		PreparedStatement pstm = null;
		ResultSet rs = null;
		List<User> userList = new ArrayList<User>();
		if(connection != null){
			StringBuffer sql = new StringBuffer();
			sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
			List<Object> list = new ArrayList<Object>();
			if(!StringUtils.isNullOrEmpty(userName)){
				sql.append(" and u.userName like ?");
				list.add("%"+userName+"%");
			}
			if(userRole > 0){
				sql.append(" and u.userRole = ?");
				list.add(userRole);
			}
			sql.append(" order by creationDate DESC limit ?,?");
			currentPageNo = (currentPageNo-1)*pageSize;
			list.add(currentPageNo);
			list.add(pageSize);
			
			Object[] params = list.toArray();
			System.out.println("sql ----> " + sql.toString());
			rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
			while(rs.next()){
				User _user = new User();
				_user.setId(rs.getInt("id"));
				_user.setUserCode(rs.getString("userCode"));
				_user.setUserName(rs.getString("userName"));
				_user.setGender(rs.getInt("gender"));
				_user.setBirthday(rs.getDate("birthday"));
				_user.setPhone(rs.getString("phone"));
				_user.setUserRole(rs.getInt("userRole"));
				_user.setUserRoleName(rs.getString("userRoleName"));
				userList.add(_user);
			}
			BaseDao.closeResource(null, pstm, rs);
		}
		return userList;
	}

4.3 用户添加页面

这个功能很简单,其实无非就是从前端获取数据,然后传到后端,接着调用sql传到数据库,这里把Dao层代码贴出来就好了,其他的不过是重复上面的操作

public int add(Connection connection, User user) throws Exception {
		// TODO Auto-generated method stub
		PreparedStatement pstm = null;
		int updateRows = 0;
		if(null != connection){
			String sql = "insert into smbms_user (userCode,userName,userPassword," +
					"userRole,gender,birthday,phone,address,creationDate,createdBy) " +
					"values(?,?,?,?,?,?,?,?,?,?)";
			Object[] params = {user.getUserCode(),user.getUserName(),user.getUserPassword(),
							user.getUserRole(),user.getGender(),user.getBirthday(),
							user.getPhone(),user.getAddress(),user.getCreationDate(),user.getCreatedBy()};
			updateRows = BaseDao.execute(connection, pstm, sql, params);
			BaseDao.closeResource(null, pstm, null);
		}
		return updateRows;
	}

4.4 用户操作

<td>
    <span><a class="viewUser" href="javascript:;" userid=${user.id} username=${user.userName}>
        <img src="${pageContext.request.contextPath}/images/read.png" alt="查看" title="查看"/></a></span>
    <span><a class="modifyUser" href="javascript:;" userid=${user.id} username=${user.userName}>
        <img src="${pageContext.request.contextPath}/images/xiugai.png" alt="修改" title="修改"/></a></span>
    <span><a class="deleteUser" href="javascript:;" userid=${user.id} username=${user.userName}><img src="${pageContext.request.contextPath}/images/schu.png" alt="删除" title="删除"/></a></span>
</td>

这里重点讲一下删除操作,查看和修改差不多,修改和添加用户大同小异,查询只说一点就是,当页面重定向时要用request重定向。这里要说一下response和request重定向的区别

request和response重定向

博客地址: requset转发和response重定向的区别

删除操作

删除涉及一个很重要的东西:Ajax

$(".deleteUser").on("click",function(){
		var obj = $(this);
		if(confirm("你确定要删除用户【"+obj.attr("username")+"】吗?")){
			$.ajax({
				type:"GET",
				url:path+"/jsp/user.do",
				data:{method:"deluser",uid:obj.attr("userid")},
				dataType:"json",
				success:function(data){
					if(data.delResult == "true"){//删除成功:移除删除行
						alert("删除成功");
						obj.parents("tr").remove();
					}else if(data.delResult == "false"){//删除失败
						alert("对不起,删除用户【"+obj.attr("username")+"】失败");
					}else if(data.delResult == "notexist"){
						alert("对不起,用户【"+obj.attr("username")+"】不存在");
					}
				},
				error:function(data){
					alert("对不起,删除失败");
				}
			});
		}
	});

这里大概说一下,后面我想把它好好学一下 然后再写一篇博客,写他的时候我只知道个大概用法…

url:待载入页面的url
data:数据

dataType:数据格式

success/error:成功或失败后的回调函数

博客地址:未完待续

关于dao层和service层不再多说。这里说一下servlet层的一个东西,因为涉及到了json数据传送

private void delUser(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String id = request.getParameter("uid");
		Integer delId = 0;
		try{
			delId = Integer.parseInt(id);
		}catch (Exception e) {
			// TODO: handle exception
			delId = 0;
		}
		HashMap<String, String> resultMap = new HashMap<String, String>();
		if(delId <= 0){
			resultMap.put("delResult", "notexist");
		}else{
			UserService userService = new UserServiceImpl();
			if(userService.deleteUserById(delId)){
				resultMap.put("delResult", "true");
			}else{
				resultMap.put("delResult", "false");
			}
		}
		
		//把resultMap转换成json对象输出
		response.setContentType("application/json");
		PrintWriter outPrintWriter = response.getWriter();
		outPrintWriter.write(JSONArray.toJSONString(resultMap));
		outPrintWriter.flush();
		outPrintWriter.close();
	}

5、退出系统

在这里插入图片描述

订单管理和供应商管理和用户管理是相似的,只是操作的数据库不同,密码修改和用户修改是差不多的,只是在判断密码是多了一些判断,所以还剩最后一个退出系统

退出程序很简单,移除session中USER_SESSION属性,并返回登录页面

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//清除session
		request.getSession().removeAttribute(Constants.USER_SESSION);
		response.sendRedirect(request.getContextPath()+"/login.jsp");
	}

这里用到的是response重定向,因为没啥数据要传嘛,最后再提一嘴注册servlet

ok,结束了,这个项目很适合作为javaweb的一个入门的学习,能让初学者更深入的去了解架构,以及像这种项目的一个写的思路,但这只能作为练习项目,作为实用项目差的远远的,还有一个缺憾就是这个项目的前端都不是自己写的,本人前端很差,所以一切前端相关问题…,第一次写这种博客,写的不好的地方欢迎大家指出

g>();
if(delId <= 0){
resultMap.put(“delResult”, “notexist”);
}else{
UserService userService = new UserServiceImpl();
if(userService.deleteUserById(delId)){
resultMap.put(“delResult”, “true”);
}else{
resultMap.put(“delResult”, “false”);
}
}

	//把resultMap转换成json对象输出
	response.setContentType("application/json");
	PrintWriter outPrintWriter = response.getWriter();
	outPrintWriter.write(JSONArray.toJSONString(resultMap));
	outPrintWriter.flush();
	outPrintWriter.close();
}



### 5、退出系统

[外链图片转存中...(img-tW5JcRQf-1595233313043)]

订单管理和供应商管理和用户管理是相似的,只是操作的数据库不同,密码修改和用户修改是差不多的,只是在判断密码是多了一些判断,所以还剩最后一个退出系统



退出程序很简单,移除session中USER_SESSION属性,并返回登录页面

```java
public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//清除session
		request.getSession().removeAttribute(Constants.USER_SESSION);
		response.sendRedirect(request.getContextPath()+"/login.jsp");
	}

这里用到的是response重定向,因为没啥数据要传嘛,最后再提一嘴注册servlet

ok,结束了,这个项目很适合作为javaweb的一个入门的学习,能让初学者更深入的去了解架构,以及像这种项目的一个写的思路,但这只能作为练习项目,作为实用项目差的远远的,还有一个缺憾就是这个项目的前端都不是自己写的,本人前端很差,所以一切前端相关问题…,第一次写这种博客,写的不好的地方欢迎大家指出

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现省市区三级联动的关键是建立好数据库,并且编写好对应的 SQL 语句。以下是一个简单的数据库设计: - 省份表 province,包括字段 id 和 name。 - 城市表 city,包括字段 id、name 和省份的外键 province_id。 - 区县表 district,包括字段 id、name 和城市的外键 city_id。 接下来是建表语句: ```sql -- 省份表 CREATE TABLE `province` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 城市表 CREATE TABLE `city` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `province_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `province_id` (`province_id`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`province_id`) REFERENCES `province` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 区县表 CREATE TABLE `district` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `city_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `city_id` (`city_id`), CONSTRAINT `district_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 接下来是查询省份、城市、区县的 SQL 语句: ```sql -- 查询所有省份 SELECT id, name FROM province; -- 查询某个省份下的所有城市 SELECT id, name FROM city WHERE province_id = ?; -- 查询某个城市下的所有区县 SELECT id, name FROM district WHERE city_id = ?; ``` 在 Java Web 项目中,可以使用 Ajax 和 JSON 技术实现省市区三级联动。前端页面发送 Ajax 请求,后端通过 JDBC 连接数据库,查询对应的省份、城市、区县信息,并以 JSON 格式返回给前端页面。前端页面再解析 JSON 数据,更新页面的省份、城市、区县下拉框选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值