MVC+Servlet+JSP案例(下)

带新手玩转MVC——不讲道理就是干(下)

完整案例演示

 

案例代码

LoginServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package servlet;
 
import domain.User;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
 
/*
* 用户登录的Servlet
* */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
 
        //接收数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //从ServletContext域中获得保存用户信息集合
        List<User> list = (List<User>) this.getServletContext().getAttribute("list");
        for (User user:list){
            //判断用户名是否正确
            if (username.equals(user.getUsername())){
                //判断密码是否正确
                if (password.equals(user.getPassword())){
                    //用户名密码都正确
                    //登录成功
                    //判断记住用户名复选框是否勾选
                    String remember = req.getParameter("remember");
                    if ("true".equals(remember)){
                        //完成记住用户名的功能
                        Cookie cookie = new Cookie("username",username);
                        //设置有效路径
                        cookie.setPath("/login.jsp");
                        //设置有效时间
                        cookie.setMaxAge(60*60*24);
                        //将cookie回写到浏览器
                        resp.addCookie(cookie);
                    }
                    //将用户的信息保存到Session中
                    req.getSession().setAttribute("user",user);
                    resp.sendRedirect("/success.jsp");
                    return;
                }
            }
        }
        //登录失败
        req.setAttribute("msg","用户名或密码错误!");
        req.getRequestDispatcher("/login.jsp").forward(req,resp);
 
    }
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

CookieUtils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package utils;
 
 
 
import javax.servlet.http.Cookie;
 
 
 
public class CookieUtils {
 
    public static Cookie findCookie(Cookie[] cookies,String name){
 
        if (cookies==null){
 
            //说明客户端没有携带Cookie
 
            return null;
 
        }else {
 
            //说明客户端携带Cookie
 
            for (Cookie cookie:cookies){
 
                if (name.equals(cookie.getName())){
 
                    return cookie;
 
                }
 
            }
 
            return null;
 
        }
 
    }
 
}

success.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<%@page import="domain.User"%>
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
 
   pageEncoding="UTF-8"%>
 
<!DOCTYPE html>
 
<html>
 
<head>
 
<meta charset="UTF-8">
 
<title>登录成功</title>
 
<link rel="stylesheet" href="./css/login.css">
 
</head>
 
<body>
 
   <%
 
      if(session.getAttribute("user")!=null){
 
         User user = (User)session.getAttribute("user");
 
         System.out.println(user.getPath());
 
         // 获得绝对路径最后一个\的位置
 
         int idx = user.getPath().lastIndexOf("\\");
 
         // 获得文件上传的唯一文件名:
 
         String fileName = user.getPath().substring(idx+1);
 
   %>
 
   <div class="login">
 
      <div class="header">
 
         <h1>登录成功</h1>
 
      </div>
 
      <div class="content">
 
         <table align="center">
 
            <tr>
 
               <td align="center"><img src="/img/<%= fileName %>" /></td>
 
            </tr>
 
            <tr>
 
               <td align="center">欢迎<%= user.getNickname() %>,登录成功!</td>
 
            </tr>
 
         </table>
 
 
 
      </div>
 
   </div>
 
   <%      
 
      }else{
 
   %>
 
   <div class="login">
 
      <div class="header">
 
         <h1>您还没有登录!请先去<a href="/login.jsp">登录</a>!</h1>
 
      </div>
 
   </div>
 
   <%   
 
      }
 
   %>
 
 
 
 
 
</body>
 
</html>

特别说明

如果有朋友是按照上篇的代码一路敲过来的,这里有个问题,就是启动服务器后你必须先访问/initServlet去执行init()方法,否则你注册的信息将无法存储。

 

在这再给你教另外一种方法,就是在Web.xml中配置InitServlet,当服务器一启动,init()方法就立刻被执行,不用你再去手动访问了,操作过程如下:

第一步:找到web.xml,配置如下图所示的信息

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPEweb-appPUBLIC
 
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
 
 
 
<web-app>
 
    <servlet>
 
        <servlet-name>initServlet</servlet-name>
 
        <servlet-class>servlet.InitServlet</servlet-class>
 
        <load-on-startup>2</load-on-startup>
 
    </servlet>
 
    <servlet-mapping>
 
        <servlet-name>initServlet</servlet-name>
 
        <url-pattern>/initServlet</url-pattern>
 
    </servlet-mapping>
 
</web-app> 

第二步:去掉@WebServlet(“/initServlet”)注解

 

 

好了,这样就完成了,现在已开启服务器,就可以直接访问注册页面进行注册了。 

案例总结

写到这案例算是结束了,这里面用了MVC的设计模式,运用了JSP,Servlet里面的知识,有Web四大域对象的使用,参数的请求和接收,转发和重定向,集合的使用,还有Cookie和Session的使用,表单数据的接收,文件的上传,涉及的方面多,但不超纲,都是JavaSE中学过的部分,在这做个系统性的应用,个人认为此案例适合于初学者练手,希望能帮助到一些真正需要的朋友。

*****************************************************************************************************

我的博客园地址:https://www.cnblogs.com/zyx110/

 

posted @   泰斗贤若如  阅读(737)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示