MVC 模式代表 Model-View-Controller(模型-视图-控制器)模式。
这种模式用于应用程序的分层开发。
- Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) - 视图代表模型包含的数据的可视化。
- Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
这次是在之前验证用户登录的基础上,转换成MVC设计模式实现,可先参考我之前的文章。
1.通过重写HttpServlet的doGet、doPost方法实现验证用户登录
2.简单生成随机验证码(使用session实现用户登录)
1.User.java(实体类)
/**
* 实体类
* @author linxiaomin
*/
public class User {
private Integer id;
private String name;
private String pwd;
private String nickname;
private Date birthday;
public User(){ //无参构造
}
public User(Integer id){ //构造方法
this.id=id;
}
public User(Integer id, String name, String pwd, String nickname, Date birthday) {
this.id = id;
this.name = name;
this.pwd = pwd;
this.nickname = nickname;
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
2.UserService.java
/**
* 判断登录是否成功
* 如果成功保存用户信息
* @author linxiaomin
* @date 2020/04/21 8:55
*/
public class UserService {
public User login(String loginName, String pwd){
//通过loginName条件到数据库中查询此用户信息
User saveUser = new User(1,"admin","1234","昵称",null);
if(saveUser != null && saveUser.getName().equals(loginName) && saveUser.getPwd().equals(pwd)){
return saveUser;
}else{
return null;
}
}
}
3.CaptcheController.java (验证码功能 )
StrUtil.java (验证码功能中需要用到的随机生成多个字符的字符串的工具)
该步骤的代码较多,请直接复制我这篇文章中的代码。
4.login.jsp (登录页面)
<%@ page import="java.net.URLDecoder" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"
errorPage="../../errorPage.jsp" pageEncoding="UTF-8" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%
String err = request.getParameter("err");
if(err != null) {
err = URLDecoder.decode(err, "UTF-8");
%>
<%=err%>
<%
}
%>
form action='./login' name='submit' method='post'>
登录名称:<input type='text' name='loginName'/><br>
登录密码:<input type='password' name='loginPwd'/><br>
验 证 码:<input type='text' name='validCode'><img src='./Captche' width=120 height=80 /><br>
<input type='submit' name='btnLogin'value='登录'/><input type="reset" value="取消"><br>
5.errorPage.jsp(报错页面)
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
对不起,程序在开小差,原因是:<%= exception.getMessage() %>
<%
exception.printStackTrace();
%>
</body>
</html>
6.fail.jsp(登录失败页面)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录失败,原因:<%=request.getAttribute("msg")%> 请重新<a href="login">登录</a>
</body>
</html>
7.main.jsp(主页面)
<%@ page import="cn.edu.mju.project1.entity.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这是主界面,欢迎:<%=((User)session.getAttribute("user")).getLogin_name()%>
</body>
</html>
8.MainController.java(转发到主页面功能)
package cn.edu.mju.project1.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/main")
public class MainController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 准备主界面中的数据,放置到req对象里面,即请求转发到main.jsp
req.getRequestDispatcher("/WEB-INF/template/main.jsp").forward(req, resp);
}
}
9.LoginController.java(登录验证功能)
package cn.edu.mju.hotelManagement01.controller;
import cn.edu.mju.hotelManagement01.entity.User;
import cn.edu.mju.hotelManagement01.service.impl.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
/**
* 登录验证功能
* @author : linxiaomin
*/
@WebServlet("/login")
public class LoginController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/template/login.jsp").forward(req,resp);//请求转发到login.jsp页面
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Servlet获取jsp中loginName属性,loginPwd属性,validCode属性的值,即用户输入的值
String loginName = req.getParameter("loginName");
String loginPwd = req.getParameter("loginPwd");
String validCode = req.getParameter("validCode");
//获取session中code属性的值,即随机验证码
String saveCode = (String)req.getSession().getAttribute("code");
String str = null;
//比较获取session的随机验证码和用户输入的验证码,这边用saveCode比validCode,所以saveCode不为空
if(saveCode != null){
if(saveCode.equals(validCode)){
UserService service = new UserService();
User user = service.judgeLogin(loginName, loginPwd);
if(user != null){
//设置session中user的值
req.getSession().setAttribute("user", user);
//重定向到/main
resp.sendRedirect("./main");
}else{
loginFail(req,resp,"账号或密码错误");
}
}else{
loginFail(req,resp,"验证码错误");
}
}else{
loginFail(req,resp,"请输入验证码");
}
}
private void loginFail(HttpServletRequest req, HttpServletResponse resp, String str) throws ServletException, IOException {
//下面两句代码是跳转到fail页面
//req.setAttribute("msg",str);
//req.getRequestDispatcher("/WEB-INF/template/fail.jsp").forward(req,resp);
//若不想跳转到失败页面,则重定向到登录页面
resp.sendRedirect("./login?err=" + URLEncoder.encode(str,"UTF-8"));
}
}
10.运行程序后,在浏览器中输入http://localhost:8081/login


版权声明:本文为kkkjy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。