整体的流程与代码编写思路:
建议是从后往前
写,便于调试与debug,先编写Dao层
,主要负责与数据库交互,编写sql语句等。然后编写Servicce层
,主要负责调用Dao层,再编写Servlet层
,其也是主要调用Service和前端的一些数据交互,比如resquet和response等。
放在webapp目录下,因为是网站资源
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>系统登录 - 超市订单管理系统</title> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/css/style.css" rel="external nofollow" /> <script type="text/javascript"> /* if(top.location!=self.location){ top.location=self.location; } */ </script> </head> <body class="login_bg"> <section class="loginBox"> <header class="loginHeader"> <h1>超市订单管理系统</h1> </header> <section class="loginCont"> <form class="loginForm" action="${pageContext.request.contextPath }/login.do" name="actionForm" id="actionForm" method="post" > <div class="info">${error }</div> <div class="inputbox"> <label for="userCode">用户名:</label> <input type="text" class="input-text" id="userCode" name="userCode" placeholder="请输入用户名" required/> </div> <div class="inputbox"> <label for="userPassword">密码:</label> <input type="password" id="userPassword" name="userPassword" placeholder="请输入密码" required/> </div> <div class="subBtn"> <input type="submit" value="登录"/> <input type="reset" value="重置"/> </div> </form> </section> </section> </body> </html>
<!--设置欢迎界面--> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list>
Dao层(数据持久层)负责操作数据库,业务(比如用户登录,比对账号密码)有业务层负责。
public User getLoginUser(Connection connection, String userCode)throws Exception;
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")); } //connection设成null不让其关闭,是因为后面业务层还需要数据库连接。 BaseDao.closeResource(null, pstm, rs); } return user; }
业务层都会调用Dao层,来获取业务所需的数据。
public interface UserService { //用户登录 public User login(String userCode, String userPassword); }
public class UserServiceImpl implements UserService{ private UserDao userDao; public UserServiceImpl(){ userDao = new UserDaoImpl(); } 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; } }
public class LoginServlet extends HttpServlet { //servlet:控制层,接收用户的请求,调用业务层代码。 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //从前端获取用户名和密码(接收用户的请求) 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(Constant.USER_SESSION , user); //跳转主页(跳转到另一个页面,地址变了,所以用重定向) resp.sendRedirect("jsp/frame.jsp"); }else{//查无此人,无法登录 //转发会登录页面,顺带提示它,用户名或密码错误。((跳转到本页面,只是在本页面加了些信息(用户名或密码错误),地址没变,所以用请求转发)) req.setAttribute("error" , "用户名或密码错误");//请求可以携带数据 req.getRequestDispatcher("login.jsp").forward(req , resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
<!--servlet--> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.tong.servlet.user.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping>
前端一启动,执行login.jsp(设置成了首页),直接到web.xml中设置的login.do(servlet映射),调用对应的控制器
servlet(LoginServlet),servlet中会调用业务(UserServiceImpl),然后业务会调用想用的Dao(UserDaoImpl)来获取数据。
思路:移除session,返回登录界面;
LogoutServlet
public class LogoutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().removeAttribute(Constant.USER_SESSION); resp.sendRedirect(req.getContextPath() + "/login.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
注册
<!--注销--> <servlet> <servlet-name>LogoutServlet</servlet-name> <servlet-class>com.tong.servlet.user.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/jsp/logout.do</url-pattern> </servlet-mapping>
拦截判断的条件是
session中有无user这个属性,因为在用户注销,或还没登录
的情况下,session中没有user这个属性,如果没有,说明不是正常登录,进行拦截;只有当正常登录时,会创建session中user这个属性,此时可以正常登录。
注销后,黏贴网址,依然能登录进来,需进行拦截。
编写一个过滤器,并注册
public class SysFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; //过滤器,从session中获取用户 User user = (User) request.getSession().getAttribute(Constant.USER_SESSION); if(user == null){//session已经被移除,或者用户注销,或还没登录 response.sendRedirect("error.jsp"); }else{ chain.doFilter(req , resp); } } public void destroy() { } }
<!--用户登录过滤器--> <filter> <filter-name>SysFilter</filter-name> <filter-class>com.tong.filter.SysFilter</filter-class> </filter> <filter-mapping> <filter-name>SysFilter</filter-name> <url-pattern>/jsp/*</url-pattern> </filter-mapping>
密码修改,需要和数据库打交道,所以还需要走dao层、service层、servlet层这一条线。
public interface UserDao
里
//修改当前用户密码 //增删改返回的都是int类型,查找返回对应的实体类; public int updatePwd(Connection connection, int id, String pwd)throws Exception;
public class UserDaoImpl implements UserDao
里
public int updatePwd(Connection connection, int id, String pwd) throws Exception { // TODO Auto-generated method stub 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; }
public interface UserService
里
//根据userId修改密码 public boolean updatePwd(int id, String pwd);
public class UserServiceImpl implements UserService
里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复用 public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if(method.equals("savepwd")){ this.updatePwd(req , resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } public void updatePwd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //从session里拿Uer实体类 Object o = req.getSession().getAttribute(Constant.USER_SESSION); String newPassword = req.getParameter("newPassword"); boolean flag = false; if(o != null && newPassword != null && newPassword.length() != 0){//Uer实体类和新密码newPassword都拿到了,开始调用业务层 UserServiceImpl userService = new UserServiceImpl(); flag = userService.updatePwd(((User) o).getId(), newPassword); if(flag){ req.setAttribute("message" , "修改密码成功,请退出,使用新密码登录"); //密码修改成功,当前session。因为密码变了,session的内容自然也变了,所以需要移除,又因为密码变了需要重新登录,所以session会重新创建 req.getSession().removeAttribute(Constant.USER_SESSION); }else { req.setAttribute("message" , "密码修改失败"); } }else{ req.setAttribute("message" , "新密码有问题"); } req.getRequestDispatcher("pwdmodify.jsp").forward(req , resp); } }
到此这篇关于SMBMS超市订单管理系统的文章就介绍到这了,更多相关SMBMS超市订单管理系统内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
免责声明:本站发布的内容(图片、视频和文字)以原创、来自互联网转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系QQ:712375056 进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
Copyright © 2009-2021 56dr.com. All Rights Reserved. 特网科技 特网云 版权所有 珠海市特网科技有限公司 粤ICP备16109289号
域名注册服务机构:阿里云计算有限公司(万网) 域名服务机构:烟台帝思普网络科技有限公司(DNSPod) CDN服务:阿里云计算有限公司 中国互联网举报中心 增值电信业务经营许可证B2
建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站