JavaWeb_SMBMS_密码修改验证
项目介绍:
项目视频 : BV12J411M7Sj 遇见狂神说
-------订单超市管理系统-------
dao 持久层
Service 业务层
Servlet 控制层
(1)项目搭建 准备工作 P30
-
搭建maven web项目
-
配置Tomcat
-
测试Tomcat
-
导入jar包 (jsp,Servlet,mysql,jstl,standard)
pom.xml<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <!-- JSP依赖 --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> </dependency> <!--连接mysql数据库依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!--standard标签库--> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!--jdbc --> <dependency> <groupId>org.clojure</groupId> <artifactId>java.jdbc</artifactId> <version>0.7.11</version> </dependency> <!--fastjson依赖 - 处理json字符串--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.73</version> </dependency> </dependencies>
-
创建项目包结构 (java,resources,webapp)

-
编写实体类-ORM映射:表-类 (pojo/*)
-
Bill
账单表public class Bill { private Integer id; //ID private String billCode; //账单编码 private String productName; //商品名称 private String productDesc; //商品描述 private String productUnit; //商品单位 private BigDecimal productCount;//商品数量 private BigDecimal totalPrice; //总金额 private Integer isPayment; //是否支付 private Integer providerId; //供应商ID private Integer createdBy; //创建者 private Date creationDate; //创建时间 private Integer modifyBy; //更新者 private Date modifyDate; //更新时间 private String providerName; //供应商名称 public String getProviderName() { return providerName; } public void setProviderName(String providerName) { this.providerName = providerName; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getBillCode() { return billCode; } public void setBillCode(String billCode) { this.billCode = billCode; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public String getProductDesc() { return productDesc; } public void setProductDesc(String productDesc) { this.productDesc = productDesc; } public String getProductUnit() { return productUnit; } public void setProductUnit(String productUnit) { this.productUnit = productUnit; } public BigDecimal getProductCount() { return productCount; } public void setProductCount(BigDecimal productCount) { this.productCount = productCount; } public BigDecimal getTotalPrice() { return totalPrice; } public void setTotalPrice(BigDecimal totalPrice) { this.totalPrice = totalPrice; } public Integer getIsPayment() { return isPayment; } public void setIsPayment(Integer isPayment) { this.isPayment = isPayment; } public Integer getProviderId() { return providerId; } public void setProviderId(Integer providerId) { this.providerId = providerId; } public Integer getCreatedBy() { return createdBy; } public void setCreatedBy(Integer createdBy) { this.createdBy = createdBy; } public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } public Integer getModifyBy() { return modifyBy; } public void setModifyBy(Integer modifyBy) { this.modifyBy = modifyBy; } public Date getModifyDate() { return modifyDate; } public void setModifyDate(Date modifyDate) { this.modifyDate = modifyDate; } }
-
Provider
供应商表public class Provider { private Integer id; //ID private String proCode; //供应商编码 private String proName; //供应商名称 private String proDesc; //供应商描述 private String proContact; //供应商联系人 private String proPhone; //供应商电话 private String proAddress; //供应商地址 private String proFax; //供应商传真 private Integer createdBy; //创建者 private Date creationDate; //创建时间 private Integer modifyBy; //更新者 private Date modifyDate; //更新时间 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getProCode() { return proCode; } public void setProCode(String proCode) { this.proCode = proCode; } public String getProName() { return proName; } public void setProName(String proName) { this.proName = proName; } public String getProDesc() { return proDesc; } public void setProDesc(String proDesc) { this.proDesc = proDesc; } public String getProContact() { return proContact; } public void setProContact(String proContact) { this.proContact = proContact; } public String getProPhone() { return proPhone; } public void setProPhone(String proPhone) { this.proPhone = proPhone; } public String getProAddress() { return proAddress; } public void setProAddress(String proAddress) { this.proAddress = proAddress; } public String getProFax() { return proFax; } public void setProFax(String proFax) { this.proFax = proFax; } public Integer getCreatedBy() { return createdBy; } public void setCreatedBy(Integer createdBy) { this.createdBy = createdBy; } public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } public Integer getModifyBy() { return modifyBy; } public void setModifyBy(Integer modifyBy) { this.modifyBy = modifyBy; } public Date getModifyDate() { return modifyDate; } public void setModifyDate(Date modifyDate) { this.modifyDate = modifyDate; } }
-
Role
权限表public class Role { private Integer id; //ID private String roleCode; //角色编码 private String roleName; //角色名称 private Integer createdBy; //创建者 private Date creationDate; //创建时间 private Integer modifyBy; //更新者 private Date modifyDate; //更新时间 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getRoleCode() { return roleCode; } public void setRoleCode(String roleCode) { this.roleCode = roleCode; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public Integer getCreatedBy() { return createdBy; } public void setCreatedBy(Integer createdBy) { this.createdBy = createdBy; } public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } public Integer getModifyBy() { return modifyBy; } public void setModifyBy(Integer modifyBy) { this.modifyBy = modifyBy; } public Date getModifyDate() { return modifyDate; } public void setModifyDate(Date modifyDate) { this.modifyDate = modifyDate; } }
-
User
用户表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;//用户角色名称 public String getUserRoleName() { return userRoleName; } public void setUserRoleName(String userRoleName) { this.userRoleName = userRoleName; } public Integer getAge() { /*long time = System.currentTimeMillis()-birthday.getTime(); Integer age = Long.valueOf(time/365/24/60/60/1000).IntegerValue();*/ Date date = new Date(); Integer age = date.getYear()-birthday.getYear(); return age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserCode() { return userCode; } public void setUserCode(String userCode) { this.userCode = userCode; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Integer getUserRole() { return userRole; } public void setUserRole(Integer userRole) { this.userRole = userRole; } public Integer getCreatedBy() { return createdBy; } public void setCreatedBy(Integer createdBy) { this.createdBy = createdBy; } public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } public Integer getModifyBy() { return modifyBy; } public void setModifyBy(Integer modifyBy) { this.modifyBy = modifyBy; } public Date getModifyDate() { return modifyDate; } public void setModifyDate(Date modifyDate) { this.modifyDate = modifyDate; } }
-
-
编写基础公共类
-
数据库配置文件 (db.properties)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf8
user=root
password=root -
数据库公共类 (dao/BaseDao)
dao/BaseDao/*操作数据库的公共类 -- 操作数据库的基类,静态类*/ public class BaseDao { private static String driver; private static String url; private static String user; private static String password; //静态代码块,类加载时初始化 static { Properties properties = new Properties(); //通过类加载器读取对应的资源 InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("database.properties"); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } driver = properties.getProperty("driver"); url = properties.getProperty("url"); user = properties.getProperty("user"); password = properties.getProperty("password"); } //获取数据库的连接 public static Connection getConnection(){ Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); } return connection; } /*查询 公共方法*/ public static ResultSet execute(Connection connection,PreparedStatement pstm,ResultSet rs,String sql,Object[] params) throws Exception{ //SQL预编译 pstm = connection.prepareStatement(sql); //setObject,占位符从1开始,但数组从0开始 for(int i = 0; i < params.length; i++){ //设置SQL语句中占位符参数 pstm.setObject(i+1, params[i]); } //执行SQL 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) { e.printStackTrace(); flag = false; } } if(pstm != null){ try { pstm.close(); pstm = null;//GC回收 } catch (SQLException e) { e.printStackTrace(); flag = false; } } if(connection != null){ try { connection.close(); connection = null;//GC回收 } catch (SQLException e) { e.printStackTrace(); flag = false; } } return flag; } }
-
编写字符编码过滤器并配置 (filter/CharacterEncodingFilter)
过滤器public class CharacterEncoding implements Filter { //初始化 @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } //注销 @Override public void destroy() { } }
-
-
导入静态资源 (calendar,css,images,js,jsp)
(2)项目搭建 登录功能 P31

-
编写(导入)前端页面 (webapp/login.jsp)
-
设置欢迎页面 (配置web.xml)
<welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> -
编写dao层登录用户登录接口 (dao/user/UserDao)
public interface UserDao { //登录 -- 通过userCode获取User public User getLoginUser(Connection connection, String userCode)throws Exception; }
-
编写dao层接口实现类 (dao/user/UserDaoImpl)
实现类//dao层抛出异常,让service层去捕获处理 public class UserDaoImpl implements UserDao { //登录 - 得到登录用户 @Override public User getLoginUser(Connection connection, String userCode) throws Exception { 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; } }
-
业务层接口 (service/user/UserService)
public interface UserService { //用户登录 public User login(String userCode, String userPassword); }
-
业务层实现类 (service/user/UserServiceImpl)
实现类public class UserServiceImpl implements UserService{ private UserDao userDao; public UserServiceImpl(){ userDao = new UserDaoImpl(); } @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; } }
-
编写Servlet (servlet/user/LoginServlet) - (注意需定义常量导入 util/Constants)
public class LoginServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override 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); } } }
-
注册Servlet
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.study.servlet.user.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping> -
测试访问!
使用到的页面:login.jsp(登录),jsp/frame.jsp(首页)
(3)注销及权限过滤 P32
-
登录功能优化 - 注销用户|注册 (servlet/user/LogoutServlet)
/** * 退出登录,移除session中的用户对象Constants.USER_SESSION * */ public class LogoutServlet extends HttpServlet { public LogoutServlet() { super(); } @Override public void destroy() { super.destroy(); } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //清除session request.getSession().removeAttribute(Constants.USER_SESSION); response.sendRedirect(request.getContextPath()+"/login.jsp"); } @Override public void init() throws ServletException { } }
-
登录拦截优化 - 用户登录过滤器|注册 (filter/SysFilter)
/** * 判断是否退出登录 * */ public class SysFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { //判断用户是否退出登录 - 当退出后禁止进入主页 System.out.println("-- SysFilter doFilter()"); HttpServletRequest rq = (HttpServletRequest)request; HttpServletResponse rp = (HttpServletResponse)response; //过滤器,从session中获取用户 User userSession = (User)rq.getSession().getAttribute("userSession"); if(null == userSession){ //用户以移除或注销或未登录 rp.sendRedirect(rq.getContextPath()+"/error.jsp"); }else{ chain.doFilter(request, response); } } @Override public void destroy() { } }
注册<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.study.servlet.user.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/jsp/logout.do</url-pattern> </servlet-mapping> <filter> <filter-name>SysFilter</filter-name> <filter-class>com.study.filter.SysFilter</filter-class> </filter> <filter-mapping> <filter-name>SysFilter</filter-name> <url-pattern>/jsp/*</url-pattern> </filter-mapping>
使用到的页面:error.jsp(错误)
(4)密码修改 P33

-
UserDao接口 (dao/user/UserDao)
//dao/user/UserDao添加接口 //修改密码 public int updatePwd(Connection connection, int id, String pwd)throws Exception;
-
UserDao接口实现类 (dao/user/UserDaoImpl)
实现类//dao/user/UserDaoImpl添加实现方法 //修改密码 @Override public int updatePwd(Connection connection, int id, String pwd) throws Exception { int flag = 0; PreparedStatement pstm = null; if(connection != null){ String sql = "update smbms_user set userPassword= ? where id = ?"; Object[] params = {pwd,id}; flag = BaseDao.execute(connection, pstm, sql, params); BaseDao.closeResource(null, pstm, null); } return flag; }
-
UserService接口 (service/user/UserService)
//根据userId修改密码 public boolean updatePwd(int id, String pwd);
-
UserService接口实现类 (service/user/UserServiceImpl)
实现类@Override public boolean updatePwd(int id, String pwd) { boolean flag = false; Connection connection = null; try{ connection = BaseDao.getConnection(); if(userDao.updatePwd(connection,id,pwd) > 0) flag = true; }catch (Exception e) { e.printStackTrace(); }finally{ BaseDao.closeResource(connection, null, null); } return flag; }
-
编写Servlet (servlet/user/UserServlet)
public class UserServlet extends HttpServlet { public UserServlet() { super(); } @Override public void destroy() { super.destroy(); } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { String method = request.getParameter("method"); System.out.println("* method --> " + method); /*实现Servlet复用 - 新增的操作都可以在此处调用 - 通过前端获取表单的method值*/ if(method != null && method.equals("pwdmodify")){ this.getPwdByUserId(request, response); }else if(method != null && method.equals("savepwd")){ this.updatePwd(request, response); } } //更新密码 private void updatePwd(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { Object o = request.getSession().getAttribute(Constants.USER_SESSION); String newpassword = request.getParameter("newpassword"); boolean flag = false; if(o != null && !StringUtils.isNullOrEmpty(newpassword)){ UserService userService = new UserServiceImpl(); flag = userService.updatePwd(((User)o).getId(),newpassword); if(flag){ request.setAttribute(Constants.SYS_MESSAGE, "修改密码成功,请退出并使用新密码重新登录!"); request.getSession().removeAttribute(Constants.USER_SESSION);//session注销 }else{ request.setAttribute(Constants.SYS_MESSAGE, "修改密码失败!"); } }else{ request.setAttribute(Constants.SYS_MESSAGE, "修改密码失败!"); } request.getRequestDispatcher("pwdmodify.jsp").forward(request, response); } //获取旧密码 //.....代码在下方 public void init() throws ServletException { } }
-
注册
<servlet> <servlet-name>UserServlet</servlet-name> <servlet-class>com.study.servlet.user.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/jsp/user.do</url-pattern> </servlet-mapping>
#旧密码验证 P34
优化密码修改使用 Ajax
<!--fastjson依赖-处理json字符串--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
//获取旧密码 - 配合pwdmodify.js private void getPwdByUserId(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { Object o = request.getSession().getAttribute(Constants.USER_SESSION); String oldpassword = request.getParameter("oldpassword"); Map<String, String> resultMap = new HashMap<String, String>(); if(null == o ){//session过期 resultMap.put("result", "sessionerror"); }else if(StringUtils.isNullOrEmpty(oldpassword)){//旧密码输入为空 resultMap.put("result", "error"); }else{ String sessionPwd = ((User)o).getUserPassword(); if(oldpassword.equals(sessionPwd)){ resultMap.put("result", "true"); }else{//旧密码输入不正确 resultMap.put("result", "false"); } } response.setContentType("application/json"); PrintWriter outPrintWriter = response.getWriter(); outPrintWriter.write(JSONArray.toJSONString(resultMap)); outPrintWriter.flush(); outPrintWriter.close(); }
使用到的页面:jsp/pwdmodify.jsp+jsp/js/pwdmodify.js(修改密码)


浙公网安备 33010602011771号