项目如何搭建?

考虑使用不使用Maven?依赖,jar

项目搭建

  1. 搭建Maven的Web项目

  2. 配置tomcat

  3. 测试项目能否跑起来

  4. 导依赖jar包

  <dependencies><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>8.0.22</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. 创建项目包结构
    main
    • java
    • - com.kwok- dao 持久化层
    • - filter 过滤层
    • - pojo 实体层
    • - service 业务层
    • - servlet 调用业务层
    • resources
    • db.properties 数据库配置文件
    • webapp

  1. 编写实体类

    • ORM映射: 表 - 类
  1. 编写基础公共类

    • 数据库配置文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?autoReconnect=true&useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username=root
password=123

    • 编写数据库的公共类

package com.kwok.dao;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;// 操作数据库的公共类
public class BaseDao {private static String driver;private static String url;private static String username;private static String password;// 静态代码块。类加载的时候就初始化了static {Properties properties = new Properties();// 通过类加载器读取对应的资源InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");try {properties.load(is);} catch (IOException e) {e.printStackTrace();}driver = properties.getProperty("driver");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");}// 获取数据库的连接public static Connection getConnection(){Connection connection = null;try {Class.forName(driver);connection = DriverManager.getConnection(url, username, password);} catch (Exception e) {e.printStackTrace();}return connection;}// 编写查询公共类public static ResultSet execute(Connection connection,String sql,Object[] params,ResultSet resultSet,PreparedStatement preparedStatement) throws SQLException {// 预编译的sql,在后面直接执行就可以了preparedStatement = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {// setObject,占位符从1开始,但是我们的数组从0开始!preparedStatement.setObject(i+1,params[i]);}resultSet = preparedStatement.executeQuery();return resultSet;}// 编写增删改公共方法public static int execute(Connection connection,String sql,Object[] params,PreparedStatement preparedStatement) throws SQLException {preparedStatement = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {// setObject,占位符从1开始,但是我们的数组从0开始!preparedStatement.setObject(i+1,params[i]);}int updateRows = preparedStatement.executeUpdate();return updateRows;}// 关闭连接,释放资源public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){boolean flag = true;if (resultSet!=null){try {resultSet.close();// GC回收resultSet = null;} catch (SQLException throwables) {throwables.printStackTrace();flag = false;}}if (preparedStatement!=null){try {preparedStatement.close();// GC回收preparedStatement = null;} catch (SQLException throwables) {throwables.printStackTrace();flag = false;}}if (connection!=null){try {connection.close();// GC回收connection = null;} catch (SQLException throwables) {throwables.printStackTrace();flag = false;}}return flag;}
}
    • 编写字符编码过滤器
package com.kwok.filter;import javax.servlet.*;
import java.io.IOException;public class CharacterEncodingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}
}<!--字符编码过滤器--><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.kwok.filter.CharacterEncodingFilter</filter-class></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
  1. 导入静态资源
    • webapp

登录实现

  1. 编写前端页面
  2. 设置首页
<!--设置欢迎页面-->
<welcome-file-list><welcome-file>login.jsp</welcome-file>
</welcome-file-list>
  1. 编写dao层登录用户登录接口

  1. 编写dao接口的实现类
package com.kwok.dao.user;import com.kwok.dao.BaseDao;
import com.kwok.pojo.User;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class UserDaoIml implements UserDao {// 得到要登录的用户@Overridepublic User getLoginUser(Connection connection, String userCode) throws SQLException {PreparedStatement pstm = null;ResultSet rs = null;User user = null;if (connection!=null){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;}
}
  1. 业务层接口

  1. 业务层接口的实现类
package com.kwok.service.user;import com.kwok.dao.BaseDao;
import com.kwok.dao.user.UserDao;
import com.kwok.dao.user.UserDaoIml;
import com.kwok.pojo.User;import java.sql.Connection;
import java.sql.SQLException;public class UserServiceImpl implements UserService {//业务层都会调用dao层,所以我们要引用Dao层private UserDao userDao;public UserServiceImpl(){userDao = new UserDaoIml();}@Overridepublic User login(String userCode, String password) {Connection connection = null;User user = null;try {connection = BaseDao.getConnection();// 通过业务层调用对应的具体的数据库操作user = userDao.getLoginUser(connection, userCode);} catch (SQLException throwables) {throwables.printStackTrace();}finally {BaseDao.closeResource(connection,null,null);}return user;}}
  1. 编写Servlet
package com.kwok.servlet.user;import com.kwok.pojo.User;
import com.kwok.service.user.UserServiceImpl;
import com.kwok.util.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 {// Servlet:控制层,调用业务层代码@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("进入loginServlet...");// 获取用户名和密码String userCode = req.getParameter("userCode");String userPassword = req.getParameter("userPassword");// 和数据库中密码进行对比,调用业务层;UserServiceImpl userService = new UserServiceImpl();User user = userService.login(userCode, userPassword); // 这里已经把登录的人查出来了if (user!=null){//查有此人,可以登陆// 将用户的信息放到Session中req.getSession().setAttribute(Constants.USER_SESSION,user);// 跳转到内部主页resp.sendRedirect("jsp/frame.jsp");}else {// 查无此人,无法登陆,转发回登录页面,提示错误req.setAttribute("error","用户名或密码错误!");req.getRequestDispatcher("login.jsp").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
  1. 注册Servlet
 <!--Servlet--><servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.kwok.servlet.user.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/user/login.do</url-pattern></servlet-mapping>
  1. 测试访问,确保以上功能成功

注销功能(登录功能优化)

- 思路:移除Session,返回登录页面

LogoutServlet

package com.kwok.servlet.user;import com.kwok.util.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 LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 移除用户的Sessionreq.getSession().removeAttribute(Constants.USER_SESSION);resp.sendRedirect(req.getContextPath()+"/login.jsp");// 返回登录页面}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

注册xml

 <servlet><servlet-name>LogoutServlet</servlet-name><servlet-class>com.kwok.servlet.user.LogoutServlet</servlet-class></servlet><servlet-mapping><servlet-name>LogoutServlet</servlet-name><url-pattern>/jsp/logout.do</url-pattern></servlet-mapping>

登录拦截优化实现

编写一个过滤器并注册

package com.kwok.filter;import com.kwok.pojo.User;
import com.kwok.util.Constants;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class SysFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;// 过滤器,从Session中获取用户User user = (User)request.getSession().getAttribute(Constants.USER_SESSION);if (user==null){// 已经注销了,或者未登录response.sendRedirect("/smbms/error.jsp");}else {filterChain.doFilter(req,resp);}}@Overridepublic void destroy() {}
}<!--用户登录过滤器--><filter><filter-name>SysFilter</filter-name><filter-class>com.kwok.filter.SysFilter</filter-class></filter><filter-mapping><filter-name>SysFilter</filter-name><url-pattern>/jsp/*</url-pattern></filter-mapping>

密码修改实现

1.导入前端页面

2.写项目,建议从底层往上写

3.UserDao接口

// 修改当前用户密码public int updatePwd(Connection connection,int id,String password) throws SQLException;

4.UserDao接口实现类

// 修改当前用户密码@Overridepublic int updatePwd(Connection connection, int id, String password) throws SQLException {PreparedStatement pstm = null;int execute = 0;if (connection!=null){String sql = "update smbms_user set userPassword = ? where id = ?";Object params[] = {password,id};execute = BaseDao.execute(connection, pstm, sql, params);BaseDao.closeResource(null,pstm,null);}return execute;}

5.UserService层

// 根据用户id修改密码public boolean updatePwd(int id, String pwd);

6.UserService实现类

// 根据用户id修改密码@Overridepublic boolean updatePwd(int id, String pwd) {Connection connection = null;boolean flag =false;// 修改密码try {connection = BaseDao.getConnection();if (userDao.updatePwd(connection,id,pwd)>0){flag = true;}} catch (SQLException throwables) {throwables.printStackTrace();}finally {BaseDao.closeResource(connection,null,null);}return flag;}

记得实现servlet复用,需要提取方法

package com.kwok.servlet.user;import com.kwok.pojo.User;
import com.kwok.service.user.UserService;
import com.kwok.service.user.UserServiceImpl;
import com.kwok.util.Constants;
import com.mysql.cj.util.StringUtils;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;// 实现servlet复用
public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getParameter("method");if (method.equals("savpwd")&&method!=null){this.updatePwd(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}public void updatePwd(HttpServletRequest req, HttpServletResponse resp){// 从Session里面拿ID;Object o = req.getSession().getAttribute(Constants.USER_SESSION);String newpassword = req.getParameter("newpassword");boolean flag = false;if (o!=null && newpassword!=null){UserService userService = new UserServiceImpl();flag = userService.updatePwd(((User) o).getId(), newpassword);if (flag){req.setAttribute("message","修改密码成功,请退出使用新密码登录!");// 密码修改成功,移除当前Sessionreq.getSession().removeAttribute(Constants.USER_SESSION);}else {req.setAttribute("message","密码修改失败");}}else {req.setAttribute("message","新密码有问题!");}try {req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);} catch (ServletException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

7.注册

 <servlet><servlet-name>UserServlet</servlet-name><servlet-class>com.kwok.servlet.user.UserServlet</servlet-class></servlet><servlet-mapping><servlet-name>UserServlet</servlet-name><url-pattern>/jsp/user.do</url-pattern></servlet-mapping>

8.测试

Ajax验证旧密码实现

1.阿里巴巴的fastjson

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version>
</dependency>

2.后台添加代码修改方法

package com.kwok.servlet.user;import com.alibaba.fastjson.JSONArray;
import com.kwok.pojo.User;
import com.kwok.service.user.UserService;
import com.kwok.service.user.UserServiceImpl;
import com.kwok.util.Constants;
import com.mysql.cj.util.StringUtils;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;// 实现servlet复用
public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getParameter("method");if (method.equals("savepwd")&&method!=null){this.updatePwd(req,resp);}else if (method.equals("pwdmodify")&&method!=null){this.pwdModify(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}// 修改密码public void updatePwd(HttpServletRequest req, HttpServletResponse resp){// 从Session里面拿ID;Object o = req.getSession().getAttribute(Constants.USER_SESSION);String newpassword = req.getParameter("newpassword");boolean flag = false;if (o!=null && newpassword!=null){UserService userService = new UserServiceImpl();flag = userService.updatePwd(((User) o).getId(), newpassword);if (flag){req.setAttribute("message","修改密码成功,请退出使用新密码登录!");// 密码修改成功,移除当前Sessionreq.getSession().removeAttribute(Constants.USER_SESSION);}else {req.setAttribute("message","密码修改失败");}}else {req.setAttribute("message","新密码有问题!");}try {req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);} catch (ServletException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}// 验证旧密码,Session中有用户的密码public void pwdModify(HttpServletRequest req, HttpServletResponse resp){// 从Session里面拿ID;Object o = req.getSession().getAttribute(Constants.USER_SESSION);String oldpassword = req.getParameter("oldpassword");// 万能的Map:结果集Map<String, String> resultMap = new HashMap<String,String>();if (o==null){// Session失效了,session过期了resultMap.put("result","sessionerror");}else if (StringUtils.isNullOrEmpty(oldpassword)){// 输入的密码为空resultMap.put("result","error");}else {String userPassword = ((User) o).getUserPassword(); // Session中用户的密码if (oldpassword.equals(userPassword)){resultMap.put("result","true");}else {resultMap.put("result","false");}}try {resp.setContentType("application/json");PrintWriter writer = resp.getWriter();// JSONArray 阿里巴巴的JSON工具类,转换格式的/*resultMap = ["result","sessionerror","result","true"]转Json格式 {key:value}*/writer.write(JSONArray.toJSONString(resultMap));writer.flush();writer.close();} catch (IOException e) {e.printStackTrace();}}
}

3.测试:

用户管理实现

思路:

1.导入分页的工具类

PageSupport类拷过来(静态资源)

package com.kwok.util;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;}}}

2.用户列表页面导入

    • userlist.jsp
    • rollpage.jsp

3.用户展示实现

1.获取用户数量

  • UserDao
// 根据用户名或角色查询用户总数public int getUserCount(Connection connection,String username,int userRole) throws SQLException;
  • UserDaoImpl
// 根据用户名或角色查询用户总数[最难理解的SQL]@Overridepublic int getUserCount(Connection connection, String username, int userRole) throws SQLException {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");ArrayList<Object> list = new ArrayList<Object>();// 存放我们的参数if (!StringUtils.isNullOrEmpty(username)){sql.append(" and u.userName like ?");list.add("%"+username+"%"); // index:0}if (userRole>0){sql.append(" and u.userRole = ?");list.add(userRole); // index:1}// 怎么把list转换为数组Object[] params = list.toArray();System.out.println("UserDaoIml->getUserCount"+sql.toString()); // 输出完整的sql语句rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);if (rs.next()){count = rs.getInt("count"); // 从结果集中获取最终的数量}BaseDao.closeResource(null,pstm,rs);}return count;}
  • UserService
// 查询用户总数public int getUserCount(String username,int userRole);
  • UserServiceImpl
// 查询用户总数@Overridepublic int getUserCount(String username, int userRole) {Connection connection =null;int count = 0;try {connection = BaseDao.getConnection();count = userDao.getUserCount(connection, username, userRole);} catch (SQLException throwables) {throwables.printStackTrace();}finally {BaseDao.closeResource(connection,null,null);}return count;}

2.获取用户列表

  • UserDao
// 通过条件查询-userlistpublic List<User> getUserList(Connection connection,String username,int userRole,int currentPageNo,int pageSize) throws Exception;
  • UserDaoImpl
// 通过条件查询-userlist@Overridepublic List<User> getUserList(Connection connection, String username, int userRole, int currentPageNo, int pageSize) throws Exception {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;}
  • UserService
// 根据条件查询用户列表public List<User> getUserList(String queryUserName,int queryUserRole,int currentPageNo,int pageSize);
  • UserServiceImpl
// 根据条件查询用户列表@Overridepublic List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize) {Connection connection = null;List<User> userList = null;try {connection = BaseDao.getConnection();userDao.getUserList(connection,queryUserName,queryUserRole,currentPageNo,pageSize);} catch (Exception throwables) {throwables.printStackTrace();}finally {BaseDao.closeResource(connection,null,null);}return userList;}

3.获取角色操作

为了职责统一,可以把角色的操作单独放在一个包中,并和POJO类进行对应。

  • RoleDao
package com.kwok.dao.role;import com.kwok.pojo.Role;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;public interface RoleDao {// 获取角色列表public List<Role> getRoleList(Connection connection) throws SQLException;
}
  • RoleDaoImpl
package com.kwok.dao.role;import com.kwok.dao.BaseDao;
import com.kwok.pojo.Role;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class RoleDaoImpl implements RoleDao {// 获取角色列表@Overridepublic List<Role> getRoleList(Connection connection) throws SQLException {PreparedStatement pstm = null;ResultSet resultSet = null;ArrayList<Role> rolelist = new ArrayList<Role>();if (connection!=null){String sql = "select * from smbms_role";Object[] params = {};resultSet = BaseDao.execute(connection, pstm, resultSet, sql, params);while (resultSet.next()){Role _role = new Role();_role.setId(resultSet.getInt("id"));_role.setRoleCode(resultSet.getString("roleCode"));_role.setRoleName(resultSet.getString("roleName"));rolelist.add(_role);}BaseDao.closeResource(null,pstm,resultSet);}return rolelist;}
}
  • RoleService
package com.kwok.service.role;import com.kwok.pojo.Role;import java.util.List;public interface RoleService {// 根据条件角色列表public List<Role> getRoleList();
}
  • RoleServiceImpl
package com.kwok.service.role;import com.kwok.dao.BaseDao;
import com.kwok.dao.role.RoleDao;
import com.kwok.dao.role.RoleDaoImpl;
import com.kwok.pojo.Role;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;public class RoleServiceImpl implements RoleService {// 引入Daoprivate RoleDao roleDao;public RoleServiceImpl(){roleDao = new RoleDaoImpl();}// 根据条件角色列表@Overridepublic List<Role> getRoleList() {Connection connection = null;List<Role> roleList = null;try {connection = BaseDao.getConnection();roleList = roleDao.getRoleList(connection);} catch (SQLException throwables) {throwables.printStackTrace();}finally {BaseDao.closeResource(connection,null,null);}return roleList;}
}

4.用户显示的Servlet

添加query方法:

    • 获取用户前端的数据(查询)
    • 判断请求是否需要执行,看参数的值判断
    • 为了实现分页,需要计算出当前页面和总页面,页面大小…
    • 用户列表展示
    • 返回前端
// (重点,难点)获取用户列表public void query(HttpServletRequest req, HttpServletResponse resp){// 查询用户列表// 从前端获取数据String queryUserName = req.getParameter("queryname");String temp = req.getParameter("queryUserRole");String pageIndex = req.getParameter("pageIndex");int queryUserRole = 0;// 获取用户列表UserServiceImpl userService = new UserServiceImpl();List<User> userList = null;// 第一次走这个请求,一定是第一页,页面大小固定int pageSize = 5; // 可以把这个写在配置文件中,方便后期修改int currentPageNo = 1;if (queryUserName == null){queryUserName = "";}if (temp!=null && !temp.equals("")){queryUserRole = Integer.parseInt(temp); // 给查询赋个值}if (pageIndex!=null){currentPageNo = Integer.parseInt(pageIndex);}// 获取用户的总数(分页:上一页,下一页的情况)int totalCount = userService.getUserCount(queryUserName, queryUserRole);// 总页数支持PageSupport pageSupport = new PageSupport();pageSupport.setCurrentPageNo(currentPageNo);pageSupport.setPageSize(pageSize);pageSupport.setTotalCount(totalCount);int totalPageCount = ((int)(totalCount/pageSize))+1; // 总共有几页// 控制首页和尾页// 如果页面小于1了,就显示第一页数据if (totalPageCount<1){currentPageNo = 1;}else if (currentPageNo>totalPageCount){// 当前页面大于最后一页currentPageNo = totalPageCount;}// 获取用户列表展示userList = userService.getUserList(queryUserName, queryUserRole, currentPageNo, pageSize);req.setAttribute("userList",userList);// 获取角色列表展示RoleServiceImpl roleService = new RoleServiceImpl();List<Role> roleList = roleService.getRoleList();req.setAttribute("roleList",roleList);req.setAttribute("totalCount",totalCount);req.setAttribute("currentPageNo",currentPageNo);req.setAttribute("totalPageCount",totalPageCount);req.setAttribute("queryUserName",queryUserName);req.setAttribute("queryUserRole",queryUserRole);// 返回前端try {req.getRequestDispatcher("userlist.jsp").forward(req,resp);} catch (ServletException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
小黄鸭调试法:程序员修炼之道和小黄鸭边说边分析(物体)

5.测试结果

4.增加用户实现

UserDao

// 新增用户信息public int add(Connection connection,User user) throws Exception;

UserDaoImpl

// 新增用户信息@Overridepublic int add(Connection connection, User user) throws Exception {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;}

UserService

// 新增用户信息public boolean add(User user);

UserServiceImpl

// 新增用户信息@Overridepublic boolean add(User user) {Boolean flag = false;Connection connection = null;try {connection = BaseDao.getConnection();connection.setAutoCommit(false); // 开启JDBC事务管理int updateRows = userDao.add(connection,user);connection.commit();if (updateRows > 0){flag = true;System.out.println("add success");}else {System.out.println("add faild");}} catch (Exception throwables) {throwables.printStackTrace();try {connection.rollback();} catch (SQLException e) {e.printStackTrace();}}finally {// 在service层进行connection的关闭BaseDao.closeResource(connection,null,null);}return flag;}

UserServlet

// 新增用户public void adduser(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {System.out.println("新增用户");String userCode = req.getParameter("userCode");String userName = req.getParameter("userName");String userPassword = req.getParameter("userPassword");String gender = req.getParameter("gender");String birthday = req.getParameter("birthday");String phone = req.getParameter("phone");String address = req.getParameter("address");String userRole = req.getParameter("userRole");User user = new User();user.setUserCode(userCode);user.setUserName(userName);user.setUserPassword(userPassword);user.setAddress(address);try {user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));} catch (ParseException e) {e.printStackTrace();}user.setGender(Integer.valueOf(gender));user.setPhone(phone);user.setUserRole(Integer.valueOf(userRole));user.setCreationDate(new Date());user.setCreatedBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId());System.out.println(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId());UserServiceImpl userService = new UserServiceImpl();if (userService.add(user)){resp.sendRedirect(req.getContextPath()+"/jsp/user.do?method=query");}else {req.getRequestDispatcher("useradd.jsp").forward(req,resp);}}

测试结果

5.删除用户实现

UserDao

// 删除用户信息public int deleteUserById(Connection connection,int delId) throws Exception;

UserDaoImpl

// 删除用户信息@Overridepublic int deleteUserById(Connection connection, int delId) throws Exception {PreparedStatement pstm = null;int updateRows = 0;List<Object> list = new ArrayList<Object>();if (null != connection){String sql = "delete from smbms_user where id=?";list.add(delId);Object[] params = list.toArray();System.out.println("sql->"+sql.toString());updateRows = BaseDao.execute(connection,pstm,sql,params);BaseDao.closeResource(null,pstm,null);}return updateRows;}

UserService

// 删除用户信息public boolean deleteUserById(Integer delId);

UserServiceImpl

// 删除用户信息@Overridepublic boolean deleteUserById(Integer delId) {Connection connection = null;boolean flag = false;try {connection = BaseDao.getConnection();if (userDao.deleteUserById(connection,delId) > 0){flag = true;}} catch (Exception e) {e.printStackTrace();}finally {BaseDao.closeResource(connection,null,null);}return flag;}

UserServlet

// 删除用户public void deluser(HttpServletRequest req, HttpServletResponse resp) throws IOException {System.out.println("删除用户");String id = req.getParameter("uid");Integer delId = 0;try {delId = Integer.parseInt(id);}catch (Exception e){delId = 0;}HashMap<String, String> resultMap = new HashMap<String, String>();if (delId <= 0){resultMap.put("delResult","notexist");}else {UserServiceImpl userService = new UserServiceImpl();if (userService.deleteUserById(delId)){resultMap.put("delResult","true");}else {resultMap.put("delResult","false");}}// 把resultMap转换为json对象输出resp.setContentType("application/json");PrintWriter outPrinterWriter = resp.getWriter();outPrinterWriter.write(JSONArray.toJSONString(resultMap));outPrinterWriter.flush();outPrinterWriter.close();}

测试结果

6.修改用户实现

UserDao

// 通过userId获得userpublic User getUserById(Connection connection,String id) throws Exception;// 修改用户信息public int modify(Connection connection,User user,String id) throws Exception;

UserDaoImpl

// 通过userId获得user@Overridepublic User getUserById(Connection connection, String id) throws Exception {User user = null;PreparedStatement pstm = null;ResultSet rs = null;if (null != connection){String sql = "select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.id=? and u.userRole = r.id";Object[] params = {id};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"));user.setUserRoleName(rs.getString("userRoleName"));}BaseDao.closeResource(null,pstm,rs);}return user;}// 修改用户信息@Overridepublic int modify(Connection connection, User user,String id) throws Exception {PreparedStatement pstm = null;int updateRows = 0;if (null != connection){String sql = "update smbms_user set userName=?,gender=?,birthday=?,phone=?,address=?,userRole=?,modifyBy=?,modifyDate=? where id=?";Object[] params = {user.getUserName(),user.getGender(),user.getBirthday(),user.getPhone(),user.getAddress(),user.getUserRole(),user.getModifyBy(),user.getModifyDate(),id};updateRows = BaseDao.execute(connection,pstm,sql,params);BaseDao.closeResource(null,pstm,null);}return updateRows;}

UserService

// 通过userId获得userpublic User getUserById(String id);// 修改用户信息public boolean modify(User user,String id);

UserServiceImpl

// 通过userId获得user@Overridepublic User getUserById(String id) {User user = null;Connection connection = null;try {connection = BaseDao.getConnection();user = userDao.getUserById(connection,id);} catch (Exception e) {e.printStackTrace();user = null;}finally {BaseDao.closeResource(connection,null,null);}return user;}// 修改用户信息@Overridepublic boolean modify(User user,String id) {Boolean flag = false;Connection connection = null;try {connection = BaseDao.getConnection();connection.setAutoCommit(false); // 开启JDBC事务管理int updateRows = userDao.modify(connection,user,id);connection.commit();if (updateRows > 0){flag = true;System.out.println("modify success");}else {System.out.println("modify faild");}} catch (Exception throwables) {throwables.printStackTrace();try {connection.rollback();} catch (SQLException e) {e.printStackTrace();}}finally {// 在service层进行connection的关闭BaseDao.closeResource(connection,null,null);}return flag;}

UserServlet

// 根据id获取用户信息public void getUserById(HttpServletRequest req, HttpServletResponse resp,String url) throws ServletException, IOException {String id = req.getParameter("uid");if (!StringUtils.isNullOrEmpty(id)){// 调用后台方法得到user对象UserService userService = new UserServiceImpl();User user = userService.getUserById(id);req.setAttribute("user",user);req.getRequestDispatcher(url).forward(req,resp);}}// 修改用户信息public void modify(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {String id = req.getParameter("uid");String userName = req.getParameter("userName");String gender = req.getParameter("gender");String birthday = req.getParameter("birthday");String phone = req.getParameter("phone");String address = req.getParameter("address");String userRole = req.getParameter("userRole");User user = new User();user.setUserName(userName);user.setGender(Integer.valueOf(gender));try {user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));} catch (ParseException e) {e.printStackTrace();}user.setPhone(phone);user.setAddress(address);user.setUserRole(Integer.valueOf(userRole));user.setModifyDate(new Date());user.setModifyBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId());UserServiceImpl userService = new UserServiceImpl();if (userService.modify(user,id)){resp.sendRedirect(req.getContextPath()+"/jsp/user.do?method=query");}else {req.getRequestDispatcher("usermodify.jsp").forward(req,resp);}}

7.查看用户实现

UserServlet

// 查看用户信息public void userview(HttpServletRequest req, HttpServletResponse resp,String url) throws ServletException, IOException {System.out.println("查看用户信息");String id = req.getParameter("uid");if (!StringUtils.isNullOrEmpty(id)){// 调用后台方法得到user对象UserService userService = new UserServiceImpl();User user = userService.getUserById(id);req.setAttribute("user",user);req.getRequestDispatcher(url).forward(req,resp);}}

项目所有代码:

https://gitee.com/mr-kwok/smbms

JavaWeb-smbms项目相关推荐

  1. JavaWeb 开发 06 —— smbms项目实践

    系列文章 JavaWeb 开发 01 -- 基本概念.Web服务器.HTTP.Maven JavaWeb 开发 02 -- ServletContext.读取资源.下载文件.重定向和请求转发 Java ...

  2. JavaWeb完整项目要用到的专业技能

    完成JavaWeb项目用到哪些专业技能?在经典的JavaWeb的开发模式中,我们使用Jsp技术来作为展现层的实现,其实也就是所谓的前端.Web开发中经典的MVC模式,Model-View-Contro ...

  3. 基于IDEA搭建JavaWeb入门项目结构(2021版)

    前言:对于很多从eclipse等IDE迁移到IDEA开发工具的小伙伴,对于如何在IDEA上创建JavaWeb入门项目结构不太了解.或者即使创建成功也能勉强使用也不知其所以然.针对于此,写该篇博客予以总 ...

  4. 基于JDBC的JavaWeb开发项目之——网上教务系统

    基于JDBC的JavaWeb开发项目之--网上教务系统 在这个文章里,我会详细的解释JavaWeb其中的一个框架--MVC框架来完成网上教务系统这一个项目.这个项目是使用JDBC去连接数据库,使用了J ...

  5. javaWeb毕业项目、大作业等学习项目汇总目录

    你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,或者需要毕业设计定做,大作业指导,购买付费源码等,欢迎指教: 企鹅:869192208 文章目录 前言 JavaWeb(Serv ...

  6. JavaWeb QQZone项目架构总结

    JavaWeb QQZone项目架构总结 这是学习JavaWeb过程中和以往相比做的比较复杂的小项目,是通过tymeleaf进行渲染的B/S(浏览器/服务器)小项目,课程链接:尚硅谷丨2022版Jav ...

  7. 使用Eclipse创建最简单的JavaWeb网页项目

    文章目录 JavaWeb项目前的环境配置 创建并运行第一个JavaWeb项目 JavaWeb项目前的环境配置 开始创建Javaweb项目前,首先需要: 1.下载Eclipse和Tomcat并将二者集成 ...

  8. JavaWeb综合项目——快递e栈(微信前端部分)

    文章目录 1 短信登录和退出登录 1.1 申请新的短信模板 1.2 短信登录,退出登录 2 快递列表 2.1 使用流(stream)来处理List 2.2 创建登录权限验证过滤器 2.3 微信端快递管 ...

  9. JavaWeb实战项目-登录审批功能-付强-专题视频课程

    JavaWeb实战项目-登录审批功能-134人已学习 课程介绍         在eclipse中进行web开发,熟练掌握HTML.Javaspript.CSS.JSP.Servlet.Oracle. ...

  10. JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用)

    JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用) 文章目录 JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用) 环境搭建 ...

最新文章

  1. java流类图结构_java I/O 流总结
  2. java递归获取文件名_递归打印文件名
  3. 网络营销过程中如何避免网站的过度优化情况的发生?
  4. C段渗透攻击必看的技术知识
  5. loj #143. 质数判定
  6. ubuntu18docker下安装MySQL
  7. Spring Boot集成Jasypt安全框架
  8. linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法
  9. owa_util.get_cgi_env 函数参数说明.
  10. Maven : 将 Jar 安装到本地仓库和 Jar 上传到私服
  11. Python答题:LinteCode简单题库(一)
  12. java定时器每一分钟执行一次_2行代码搞定一个定时器
  13. 从远程库克隆(转载)
  14. 如何更改springboot的tomcat版本
  15. Gradle报 skkiped gradle skipped due to earlier error
  16. ANDROID 有关高德地图 导航SDK 组件不见的问题
  17. labwindows随机数生成c语言,LabWindows/CVI虚拟仪器设计技术基本控件使用之:回调函数...
  18. DataScope v1.0 串口虚拟示波器使用
  19. Eureka的自我保护机制
  20. 植物大战僵尸修改游戏存档

热门文章

  1. react-activation缓存React.lazy异步组件问题记录
  2. 判断三角形是何种三角形的测试用例
  3. yyyy/mm/dd变成yyyy-mm-dd
  4. 浅谈cpu、缓存、内存之间的关系
  5. php修改头像接口,thinkphp修改头像
  6. 2022最新影视小程序源码+支持JSON/卡密系统
  7. 基于PHP的仿小米商城系统(完整前后台)
  8. Abp mysql guid_使用ABP框架踩过的坑系列5
  9. 织梦php模板安装教程,织梦CMS模板详细图文安装教程
  10. springboot-No7 加入异常拦截机制ExceptionHandler