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/

作者:泰斗贤若如
微信公众号:去有风的地方飞翔
Github:https://github.com/zyx110
有事微信:zyxt1637039050
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

我不能保证我所说的都是对的,但我能保证每一篇都是用心去写的,我始终认同: “分享的越多,你的价值增值越大”,我们一同在分享中进步,在分享中成长,越努力越幸运。再分享一句话“十年前你是谁,一年前你是谁,甚至昨天你是谁,都不重要。重要的是,今天你是谁,以及明天你将成为谁。”
人生赢在转折处,改变从现在开始!
支持我的朋友们记得点波推荐哦,您的肯定就是我前进的动力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?