一、MVC的概念
MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务 逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了 代码的可维护性。
- M:主要用于封装业务数据的JavaBean(Bean) 和 业务逻辑的JavaBean(Service)及访问数据库的
DAO对象。
-
V:主要负责数据收集 和 数据展现,通常由JSP文件完成。
-
C:主要负责流程控制 和 页面跳转,通常由Servlet完成。
原始的登录验证方法:
改进的登录验证方法:
这样实现了解耦,从而具备了更好的扩展性。
二、需求
- 浏览器 进入 登录界面,输入用户名、密码,发送到服务器。
- 服务器完成数据库查询和验证,返回验证结果。
- 验证结果呈现在响应界面上。
三、代码演示
1、编写登录界面
-
创建空工程,在工程中创建javaEE模块
-
配置中设置tomcat的部署
-
编写login界面
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head><title>JSP - login</title> </head> <body> <form action="loginServlet" method="post">用户名:<input type="text" name="userName"><br>密 码:<input type="text" name="password"><br><input type="submit" value="登录"> </form> </body>
2、编写LoginServlet实现获取用户名和密码
-
编写servlet
-
LoginServlet
package com.example.login_demo.servlet;import com.example.login_demo.pojo.User; import com.example.login_demo.service.UserService;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException;@WebServlet(name = "LoginServlet", value = "/loginServlet") public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1、获取的用户名和密码String userName = request.getParameter("userName");System.out.println("获取的用户名:" + userName);String password = request.getParameter("password");System.out.println("获取的密码:" + password);} }
-
-
单元测试:
-
运行tomcat
-
访问登录界面,发送登录请求
-
3、操作数据库部分
-
数据准备,db_web数据库下准备t_user表
-
编写DbUtils,实现jdbc的封装
package com.example.login_demo.utils;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException;public class DbUtils {private static String jdbcName;private static String dbUrl;private static String dbUserName;private static String dbPassword;static {jdbcName = "com.mysql.jdbc.Driver";dbUrl = "jdbc:mysql://localhost:3306/db_web?useSSL=false";dbUserName = "root";dbPassword = "root";try {Class.forName(jdbcName);} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException {Connection connection = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);return connection;}public static void closeResource(Connection connection, PreparedStatement preparedStatement) throws SQLException {if (null != connection){connection.close();}if (null != preparedStatement){preparedStatement.close();}}}
-
原始数据类型User
package com.example.login_demo.pojo;public class User {private int id;private String userName;private String password;public User(String userName, String password) {this.userName = userName;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", password='" + password + '\'' +'}';} }
-
dao层直接操作数据库
-
UserDao接口
package com.example.login_demo.dao;import com.example.login_demo.pojo.User;public interface UserDao {//查询用户User userLogin(User user); }
-
UserDaoImpl接口实现类
package com.example.login_demo.dao;import com.example.login_demo.pojo.User; import com.example.login_demo.utils.DbUtils;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class UserDaoImpl implements UserDao {@Overridepublic User userLogin(User user) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//1、获取数据库连接connection = DbUtils.getConnection();//2、准备sql语句String sql = "select * from t_user where userName = ? and password = ?";//3、执行sql返回结果preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, user.getUserName());preparedStatement.setString(2, user.getPassword());resultSet = preparedStatement.executeQuery();if (resultSet.next()){User returnUser = new User(resultSet.getString("userName"), resultSet.getString("password"));returnUser.setId(Integer.parseInt(resultSet.getString("id")));return returnUser; //查找成功}}catch (SQLException e){e.printStackTrace();}finally {//4、释放资源try {DbUtils.closeResource(connection, preparedStatement);if (null != resultSet){resultSet.close();}} catch (SQLException e) {e.printStackTrace();}}return null;//查找失败}public static void main(String[] args) {UserDao userDao = new UserDaoImpl();User admin = userDao.userLogin(new User("admin", "12345"));System.out.println("查找到的用户:" + admin);} }
-
-
单元测试:
-
执行UserDaoImpl中的测试代码
-
4、service层实现
-
UserDaoFactory实现:简单的静态工厂实现UserDao的实例创建,实现创建和使用的解耦
package com.example.login_demo.factory;import com.example.login_demo.dao.UserDao; import com.example.login_demo.dao.UserDaoImpl;public class UserDaoFactory {public static UserDao getUserDao(){return new UserDaoImpl();} }
-
service层实现dao层调用
package com.example.login_demo.service;import com.example.login_demo.dao.UserDao; import com.example.login_demo.factory.UserDaoFactory; import com.example.login_demo.pojo.User;public class UserService {private UserDao userDao;public UserService(){this.userDao = UserDaoFactory.getUserDao();}public User userLoginService(User user){return userDao.userLogin(user);}}
5、修改Servlet,实现数据库的查找验证
-
LoginServlet
package com.example.login_demo.servlet;import com.example.login_demo.pojo.User; import com.example.login_demo.service.UserService;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException;@WebServlet(name = "LoginServlet", value = "/loginServlet") public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1、获取的用户名和密码String userName = request.getParameter("userName");System.out.println("获取的用户名:" + userName);String password = request.getParameter("password");System.out.println("获取的密码:" + password);//2、创建UserService类型的对象实现数据的校验功能UserService userService = new UserService();User user = userService.userLoginService(new User(userName, password));if (null != user){System.out.println("登录成功!");}else {System.out.println("登录失败!");}} }
-
单元测试:
6、修改Servlet,实现页面的跳转
-
修改LoginServlet,当成功时,跳转到成功界面;当失败时,跳转回登录界面并显示账号或者密码错误
package com.example.login_demo.servlet;import com.example.login_demo.pojo.User; import com.example.login_demo.service.UserService;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException;@WebServlet(name = "LoginServlet", value = "/loginServlet") public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1、获取的用户名和密码String userName = request.getParameter("userName");System.out.println("获取的用户名:" + userName);String password = request.getParameter("password");System.out.println("获取的密码:" + password);//2、创建UserService类型的对象实现数据的校验功能UserService userService = new UserService();User user = userService.userLoginService(new User(userName, password));if (null != user){System.out.println("登录成功!");//登录成功的信息放入session对象实现多个请求共享request.getSession().setAttribute("user", user);//实现客户端跳转response.sendRedirect("main.jsp");}else {System.out.println("登录失败,用户名或者密码错误!");request.setAttribute("error", "登录失败,用户名或者密码错误!");//实现服务器跳转,使用转发,共享requestRequestDispatcher requestDispatcher = request.getRequestDispatcher("login.jsp");requestDispatcher.forward(request, response);}} }
-
main.jsp
<%@ page import="com.example.login_demo.pojo.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>主页面</title>
</head>
<body>
<h1>登录成功!欢迎 <%=(User)session.getAttribute("user")%> !</h1>
</body>
</html>
-
login.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head><title>JSP - login</title> </head> <body> <form action="loginServlet" method="post">用户名:<input type="text" name="userName"><br>密 码:<input type="text" name="password"><br><span style="color: red"><%=request.getAttribute("error") == null?"":request.getAttribute("error")%></span><br><input type="submit" value="登录"> </form> </body> </html>
-
测试: