MVC设计模式实现简单登录跳转

MVC 模式代表 Model-View-Controller(模型-视图-控制器)模式。

这种模式用于应用程序的分层开发。

  1. Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
  2. View(视图) - 视图代表模型包含的数据的可视化。
  3. 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 (验证码功能中需要用到的随机生成多个字符的字符串的工具)

该步骤的代码较多,请直接复制我这篇文章中的代码。

简单生成随机验证码(使用session实现用户登录)

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版权协议,转载请附上原文出处链接和本声明。