Servlet代码清单
Servlet比较简单,只需要处理登录请求的LoginServlet和处理注册请求的RegisterServlet以及处理登出请求的StopServlet
LoginServlet
package com.example.GoldenManage.controller; import com.example.GoldenManage.service.UserService; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet(name = "ControlServlet", value = "/ControlServlet") public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); //满足如下条件则认为登录成功 if (UserService.LoginStatus(username, password)) { //重置登录session HttpSession session = request.getSession(); session.setAttribute("username", username); session.setAttribute("password", password); session.setAttribute("loginStatus", "true"); //登录成功跳转到首页 request.getRequestDispatcher("index.jsp").forward(request, response); }else{ request.getRequestDispatcher("login.jsp").forward(request, response); //页面转向登录继续登录 } } }
RegisterServlet
package com.example.GoldenManage.controller; import com.example.GoldenManage.model.UserModel; import com.example.GoldenManage.service.UserService; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.util.ArrayList; @WebServlet(name = "RegisterServlet", value = "/GetPermission") public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); String username = request.getParameter("name"); String password = request.getParameter("password"); String email = request.getParameter("email"); String confirm_password = request.getParameter("confirm_password"); String phone_number = request.getParameter("phone_number"); UserModel userModel=new UserModel(); userModel.setEmail(email); userModel.setUsername(username); userModel.setPassword(password); userModel.setPhone(phone_number); userModel.setRePassword(confirm_password); ArrayList<String> errorList=UserService.CheckFormDate(userModel); if(errorList.isEmpty()){ //插入数据库成功则证明注册成功 if( UserService.regiserUser(userModel)==1){ request.setAttribute("userModel", userModel); request.getRequestDispatcher("success.jsp").forward(request, response); //页面转向成功显示 } }else{ request.setAttribute("error", errorList); request.getRequestDispatcher("error.jsp").forward(request, response); //页面转向错误信息 } } }
StopServlet
package com.example.GoldenManage.controller; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet(name = "StopServlet", value = "/StopServlet") public class StopServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //假设退出成功 HttpSession session = request.getSession(); session.invalidate(); request.getRequestDispatcher("login.jsp").forward(request, response); //退出后页面跳转回登录页面 } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
Service代码清单
Servlet是不处理具体业务逻辑的,它只是依据结果返回进行页面选择,所以业务逻辑依赖Service:
package com.example.GoldenManage.service; import com.example.GoldenManage.dao.UserDao; import com.example.GoldenManage.model.UserModel; import java.util.ArrayList; public class UserService { /** * 判断当前的用户登录状态 * @return */ public static Boolean LoginStatus(String username,String password) { //使用当前用户从数据库中查数据 String realpassword= UserDao.getPasswordByUserName(username); //满足如下条件则认为登录成功 if (password.equals(realpassword) ) { return true; } return false; } /** * 表单提交验证 * @return */ public static ArrayList<String> CheckFormDate(UserModel userModel) { ArrayList<String> errorList=new ArrayList<>(); //错误信息都放到集合里,通过集合去反馈 if(null==userModel.getUsername()||"".equals(userModel.getUsername())){ errorList.add("username is empty"); } if(userModel.getPassword()==null||userModel.getPassword().length()<6||userModel.getPassword().length()>11){ errorList.add("password must between 6 and 11"); } if(userModel.getPassword()!=null&&userModel.getPassword()!=null&&!userModel.getPassword().equals(userModel.getRePassword())){ errorList.add("password !=repassword"); } if(userModel.getPhone()==null||userModel.getPhone().length()!=11){ errorList.add("phone_number is not valid"); } if(userModel.getEmail()==null||!userModel.getEmail().endsWith("com")){ errorList.add("email is not valid"); } return errorList; } /** * 注册数据 * @return */ public static int regiserUser(UserModel userModel) { int flag=UserDao.regiserUser(userModel); return flag; } }
Dao代码清单
Service不与持久化数据打交道,那么这个任务就落到了Dao身上,注意Dao的粒度一定要细,并且不掺杂任何业务逻辑,就是增删改查即可:
package com.example.GoldenManage.dao; import com.example.GoldenManage.model.UserModel; import com.example.GoldenManage.utils.JdbcUtil; import javax.xml.crypto.Data; import java.sql.*; import java.time.LocalDate; public class UserDao { /** * 通过用户名到数据库中获取凭证密码 * @param userName * @return */ public static String getPasswordByUserName(String userName) { //SQL语句 String sql = "select password from user where username = " +"'" + userName+"'"; Connection connection = JdbcUtil.getConnection(); Statement statement=null; ResultSet resultSet = null; String password=null; try { statement = connection.createStatement(); //执行语句,得到结果集 resultSet = statement.executeQuery(sql); while (resultSet.next()) { //这里只查询的密码 password = resultSet.getString(1); } resultSet.close(); connection.close();//关闭连接 } catch (SQLException e1) { e1.printStackTrace(); } return password; } /** * 插入數據 * @return */ public static int regiserUser(UserModel userModel) { int flag=0; //SQL语句 String sql = "insert into user values (?,?,?,?)"; Connection connection = JdbcUtil.getConnection(); PreparedStatement statement=null; try { statement = connection.prepareStatement(sql); statement.setString(1, userModel.getUsername()); statement.setString(2, userModel.getPhone()); statement.setString(3, userModel.getPassword()); statement.setString(4, userModel.getEmail()); //执行语句,得到结果集 flag = statement.executeUpdate(); connection.close();//关闭连接 } catch (SQLException e1) { e1.printStackTrace(); } return flag; } }
Utils代码清单
像建立数据库连接这种操作,如果每进行一次查询都写一遍代码显然很冗余,所以这种可以抽出来作为工具类:
package com.example.GoldenManage.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class JdbcUtil { public static Connection getConnection() { Connection connection; //jdbc驱动 String driver = "com.mysql.cj.jdbc.Driver"; //数据库url String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "root"; try { //注册JDBC驱动程序 Class.forName(driver); //建立连接 connection = DriverManager.getConnection(url, user, password); if (!connection.isClosed()) { System.out.println("数据库连接成功"); } return connection; } catch (ClassNotFoundException e) { System.out.println("数据库驱动没有安装"); } catch (SQLException e) { e.printStackTrace(); System.out.println("数据库连接失败"); } return null; } }
数据库表
在数据库中创建数据库和表即可,然后通过JDBC进行操作。
Model代码清单
这个Model并不是指Model层,而是一个Model对象,可以理解为一个JavaBean,事实上如我前文所提,业务层面的Model和数据层面的Model其实应该区分开,比如重复确认密码这个字段,业务层面需要,而数据层面并不需要。当然我们这里这个项目比较小就暂时用一个:
package com.example.GoldenManage.model; import lombok.Data; /* * JavaBean,也就是Model数据 * */ @Data public class UserModel { //用户名 private String username; //密码 private String password; //确认密码 private String rePassword; //邮箱号 private String email; //手机号 private String phone; }
项目展示
整个项目贯穿了所有之前学习的知识点,所以其实认真阅读我之前的博客再结合代码清单看就知道是怎么实现的了,这里我就不再讲一遍了,直接来看下项目实现,首先服务器启动时被监听打印出了启动信息:
然后我们默认请求的首页被过滤器拦截重定向到了登录页面:
用户注册
这时我们点击注册去进行注册,用户注册时填写相关注册信息即可,如果填写错误有前端JS校验:
这里我们正确输入信息:
注册成功
输入正确注册信息验证通过后,数据首先会落库:
然后转发到success.jsp页面展示出来:
用户登录
注册完之后用户就可以登录了,登录时输入正确的用户名和密码后即会被转发到首页:
请求转发到首页,可以看到地址还是登录的Servlet。
访问首页
登录之后由于有了Session,所以我们就可以通过index.jsp直接访问首页了:
用户登出
当点击【退出登录】时会跳转到退出登录确认页面,确认后销毁session,则过滤器又会对页面进行过滤了:
退出后自动跳转到用户登录页面:
总结一下
从重新编写代码设计项目到blog完成大概花了一天时间,有点长但很有价值,对古早味的Web实现和MVC架构思想有了比较深刻的理解,之后再学习框架的时候相信会如鱼得水,毕竟思想摆在那里,框架只是简化思想的落地而已,例如mybatis是对DAO的优化,springMVC是对JSP的优化,Spring是对Servlet的优化,当然不尽准确,但也可以得知,技术的演进过程是因为需求,技术会变化,但思想会一直保留,以后有时间得好好学习设计模式,那些才是干货呀。











