JavaWeb 语法与 Demo实用版说明这份文档面向 Java 初学者和后端开发入门者重点整理 JavaWeb 最常见的知识点HTTP、Tomcat、Servlet、Request、Response、Cookie、Session、JSP、Filter、Listener、MVC 思想和常见 Demo。内容偏实战不追求历史包袱的全覆盖。1. JavaWeb 是什么JavaWeb 就是用 Java 开发 Web 应用。你可以先把它理解成前端发请求服务器接收请求Java 代码处理业务返回响应给前端常见场景登录注册商品列表下单文件上传后台管理系统JavaWeb 是你后面学 Spring MVC、Spring Boot 的基础。2. Web 基础概念一个 Web 项目最常见的流程浏览器输入 URL浏览器发起 HTTP 请求Tomcat 接收请求Servlet/Controller 处理请求访问数据库或业务代码把结果响应给浏览器3. HTTP 协议HTTP 是浏览器和服务器通信的协议。3.1 常见请求方法GET查询数据POST提交数据PUT修改数据DELETE删除数据3.2 GET 和 POST 的区别GET参数通常放在 URL 后面POST参数通常放在请求体里GET更适合查询POST更适合提交复杂数据3.3 请求报文请求报文一般包含请求行请求头请求体例子GET /user?id1 HTTP/1.1 Host: localhost:8080 User-Agent: Chrome3.4 响应报文响应报文一般包含状态行响应头响应体例子HTTP/1.1 200 OK Content-Type: text/html;charsetUTF-83.5 常见状态码200成功302重定向404资源不存在500服务器内部错误4. TomcatTomcat 是一个 Web 服务器也是 Servlet 容器。作用运行 JavaWeb 项目接收 HTTP 请求调用 Servlet 处理请求返回响应你可以理解成浏览器不会直接调用 Java 类浏览器是通过 Tomcat 间接调用 JavaWeb 代码5. ServletServlet 是 JavaWeb 最核心的基础之一用来处理请求和响应。5.1 第一个 Servletimportjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;WebServlet(/hello)publicclassHelloServletextendsHttpServlet{OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.setContentType(text/html;charsetUTF-8);resp.getWriter().write(Hello Servlet);}}访问http://localhost:8080/项目名/hello5.2 代码解释WebServlet(/hello)配置访问路径HttpServletServlet 基类doGet()处理 GET 请求doPost()处理 POST 请求5.3 doPost 示例OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.setContentType(text/plain;charsetUTF-8);resp.getWriter().write(POST request success);}6. Servlet 生命周期Servlet 生命周期由容器管理。常见方法init()初始化service()处理请求destroy()销毁通常开发中你更常重写doGet()doPost()流程第一次请求时创建 Servlet 对象调用初始化方法每次请求调用 service/doGet/doPost服务器关闭时销毁7. 请求对象 HttpServletRequestHttpServletRequest用来获取请求数据。7.1 获取请求参数Stringusernamereq.getParameter(username);Stringpasswordreq.getParameter(password);7.2 获取多个参数String[]hobbiesreq.getParameterValues(hobby);7.3 获取请求方式Stringmethodreq.getMethod();7.4 获取请求路径Stringurireq.getRequestURI();Stringurlreq.getRequestURL().toString();7.5 获取请求头Stringagentreq.getHeader(User-Agent);7.6 请求转发req.setAttribute(msg,登录成功);req.getRequestDispatcher(/success.jsp).forward(req,resp);说明转发发生在服务器内部浏览器地址栏不会变可以共享 request 域数据Demo登录参数获取WebServlet(/login)publicclassLoginServletextendsHttpServlet{OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{req.setCharacterEncoding(UTF-8);Stringusernamereq.getParameter(username);Stringpasswordreq.getParameter(password);if(admin.equals(username)123456.equals(password)){req.setAttribute(msg,登录成功);req.getRequestDispatcher(/success.jsp).forward(req,resp);}else{req.setAttribute(msg,用户名或密码错误);req.getRequestDispatcher(/login.jsp).forward(req,resp);}}}8. 响应对象 HttpServletResponseHttpServletResponse用来给浏览器返回数据。8.1 返回字符串resp.setContentType(text/plain;charsetUTF-8);resp.getWriter().write(操作成功);8.2 返回 HTMLresp.setContentType(text/html;charsetUTF-8);resp.getWriter().write(h1Hello Web/h1);8.3 重定向resp.sendRedirect(/项目名/index.jsp);说明重定向是浏览器行为地址栏会变不能共享 request 域数据8.4 设置响应状态码resp.setStatus(200);8.5 设置响应头resp.setHeader(Content-Type,text/plain;charsetUTF-8);9. 请求转发和重定向的区别9.1 请求转发req.getRequestDispatcher(/success.jsp).forward(req,resp);特点服务器内部跳转地址栏不变request 可共享一次请求9.2 重定向resp.sendRedirect(/success.jsp);特点浏览器重新发起请求地址栏变化request 不共享两次请求10. ServletContextServletContext表示整个 Web 应用上下文。作用多个 Servlet 共享数据读取全局配置获取资源路径10.1 共享数据ServletContextapplicationgetServletContext();application.setAttribute(count,100);ObjectcountgetServletContext().getAttribute(count);11. 域对象JavaWeb 常见域对象request一次请求内有效session一次会话内有效application整个应用内有效11.1 request 域req.setAttribute(name,张三);Objectnamereq.getAttribute(name);11.2 session 域req.getSession().setAttribute(user,admin);Objectuserreq.getSession().getAttribute(user);11.3 application 域getServletContext().setAttribute(appName,demo);12. CookieCookie 是服务器保存在浏览器端的小数据。常见用途记住用户名追踪会话简单状态保存12.1 创建 CookieCookiecookienewCookie(username,admin);cookie.setMaxAge(60*60);resp.addCookie(cookie);12.2 获取 CookieCookie[]cookiesreq.getCookies();if(cookies!null){for(Cookiecookie:cookies){System.out.println(cookie.getName()cookie.getValue());}}说明Cookie 存在浏览器端不要用 Cookie 存敏感明文信息13. SessionSession 是服务器端会话技术。常见用途保存登录用户信息保存验证码保存购物车状态13.1 存数据HttpSessionsessionreq.getSession();session.setAttribute(loginUser,admin);13.2 取数据Objectuserreq.getSession().getAttribute(loginUser);13.3 删除数据req.getSession().removeAttribute(loginUser);13.4 销毁 Sessionreq.getSession().invalidate();Demo登录状态校验WebServlet(/profile)publicclassProfileServletextendsHttpServlet{OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Objectuserreq.getSession().getAttribute(loginUser);if(usernull){resp.sendRedirect(/login.jsp);return;}resp.getWriter().write(当前用户user);}}14. JSPJSP 是早期 JavaWeb 用来写页面的技术。现在很多前后端分离项目已经很少直接用 JSP但你需要知道它是什么。14.1 第一个 JSP% page contentTypetext/html;charsetUTF-8 languagejava % html head titleJSP Demo/title /head body h1Hello JSP/h1 /body /html14.2 JSP 表达式% 当前时间 new java.util.Date() %14.3 获取 request 域数据${msg}说明现代项目里你更常见的是前后端分离 JSONJSP 主要是历史基础和部分老项目还在用15. EL 表达式EL 用来简化 JSP 获取数据。${user} ${sessionScope.loginUser} ${requestScope.msg}好处比 Java 脚本片段更简洁页面更清晰16. JSTLJSTL 是 JSP 标签库用来写循环、判断等。16.1 导入标签库% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %16.2 if 判断c:if test${not empty user} 欢迎你${user} /c:if16.3 forEach 循环c:forEach items${list} varitem ${item}br /c:forEach17. Filter 过滤器Filter 用来对请求进行统一拦截处理。常见用途登录校验编码统一处理权限校验日志统计17.1 编码过滤器 Demoimportjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;WebFilter(/*)publicclassEncodingFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{request.setCharacterEncoding(UTF-8);response.setContentType(text/html;charsetUTF-8);chain.doFilter(request,response);}}17.2 登录校验过滤器 DemoWebFilter(/admin/*)publicclassLoginFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq(HttpServletRequest)request;HttpServletResponseresp(HttpServletResponse)response;Objectuserreq.getSession().getAttribute(loginUser);if(usernull){resp.sendRedirect(req.getContextPath()/login.jsp);return;}chain.doFilter(request,response);}}说明chain.doFilter()表示放行不调用就会拦截住请求18. Listener 监听器Listener 用来监听 Web 应用、Session、Request 的创建和销毁等事件。18.1 ServletContextListenerimportjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.annotation.WebListener;WebListenerpublicclassAppListenerimplementsServletContextListener{OverridepublicvoidcontextInitialized(ServletContextEventsce){System.out.println(Web 应用启动);}OverridepublicvoidcontextDestroyed(ServletContextEventsce){System.out.println(Web 应用关闭);}}常见用途项目启动时初始化配置加载缓存启动统计逻辑19. MVC 思想MVC 是 JavaWeb 里很重要的设计思想。Model数据和业务模型View页面展示Controller控制请求流程在传统 JavaWeb 中Servlet 充当 ControllerJavaBean/Service/DAO 充当 ModelJSP 充当 View作用分层清晰职责分离更容易维护20. JavaBeanJavaBean 是一种规范化的普通 Java 类。特点私有属性公共 getter/setter通常有无参构造例子publicclassUser{privateIntegerid;privateStringusername;privateStringpassword;publicUser(){}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.idid;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.usernameusername;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.passwordpassword;}}21. 三层架构JavaWeb 常见三层Controller接收请求Service处理业务逻辑DAO访问数据库流程浏览器 - Servlet - Service - DAO - 数据库这也是后面 Spring Boot 项目里最常见的基础结构。22. 综合 Demo登录案例22.1 login.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title登录/title /head body form actionlogin methodpost 用户名input typetext nameusernamebr 密码input typepassword namepasswordbr button typesubmit登录/button /form p${msg}/p /body /html22.2 LoginServletWebServlet(/login)publicclassLoginServletextendsHttpServlet{OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{req.setCharacterEncoding(UTF-8);Stringusernamereq.getParameter(username);Stringpasswordreq.getParameter(password);if(admin.equals(username)123456.equals(password)){req.getSession().setAttribute(loginUser,username);resp.sendRedirect(req.getContextPath()/index.jsp);}else{req.setAttribute(msg,用户名或密码错误);req.getRequestDispatcher(/login.jsp).forward(req,resp);}}}22.3 index.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title首页/title /head body h2欢迎你${sessionScope.loginUser}/h2 /body /html23. 文件上传和下载基础认识23.1 文件上传文件上传通常需要表单设置enctypemultipart/form-data服务端解析文件流表单例子formactionuploadmethodpostenctypemultipart/form-datainputtypefilenamefilebuttontypesubmit上传/button/form23.2 文件下载resp.setContentType(application/octet-stream);resp.setHeader(Content-Disposition,attachment;filenametest.txt);说明现代项目常借助框架或工具类来处理上传下载JavaWeb 阶段知道原理即可24. Ajax 基础认识Ajax 是浏览器异步请求服务器的方式。好处不刷新整个页面只更新部分内容例子fetch(/user?id1).then(resres.text()).then(dataconsole.log(data));这也是你以后做前后端分离的基础。25. JavaWeb 开发常见问题25.1 中文乱码解决思路请求设置编码响应设置编码过滤器统一处理req.setCharacterEncoding(UTF-8);resp.setContentType(text/html;charsetUTF-8);25.2 404常见原因路径写错Servlet 没配置成功项目没部署25.3 500常见原因Java 代码报错空指针SQL 异常25.4 Session 丢失常见原因浏览器禁用了 CookieSession 超时服务端重启26. JavaWeb 和 Spring Boot 的关系你可以这样理解JavaWeb 是基础Spring MVC / Spring Boot 是更高级、更现代的开发方式传统 JavaWeb 里你常写ServletJSPFilterListenerSpring Boot 里你更常写ControllerServiceInterceptor配置类REST API但它们底层很多概念是相通的比如请求和响应会话和 Cookie过滤和拦截MVC 分层27. 新手最该掌握的 JavaWeb 知识优先级从高到低HTTP 基础ServletRequest / ResponseCookie / SessionFilterMVC 和三层架构JSP / EL / JSTLListener28. 总结JavaWeb 不是为了让你一直手写 Servlet 和 JSP而是为了让你理解 Web 应用最基础的运行方式。你至少要搞清楚这几个点请求是怎么进来的参数是怎么拿到的响应是怎么返回的登录状态是怎么保存的过滤器是怎么统一处理请求的MVC 为什么要分层这些理解透了后面学 Spring Boot 会顺很多。
JavaWeb语法与Demo
JavaWeb 语法与 Demo实用版说明这份文档面向 Java 初学者和后端开发入门者重点整理 JavaWeb 最常见的知识点HTTP、Tomcat、Servlet、Request、Response、Cookie、Session、JSP、Filter、Listener、MVC 思想和常见 Demo。内容偏实战不追求历史包袱的全覆盖。1. JavaWeb 是什么JavaWeb 就是用 Java 开发 Web 应用。你可以先把它理解成前端发请求服务器接收请求Java 代码处理业务返回响应给前端常见场景登录注册商品列表下单文件上传后台管理系统JavaWeb 是你后面学 Spring MVC、Spring Boot 的基础。2. Web 基础概念一个 Web 项目最常见的流程浏览器输入 URL浏览器发起 HTTP 请求Tomcat 接收请求Servlet/Controller 处理请求访问数据库或业务代码把结果响应给浏览器3. HTTP 协议HTTP 是浏览器和服务器通信的协议。3.1 常见请求方法GET查询数据POST提交数据PUT修改数据DELETE删除数据3.2 GET 和 POST 的区别GET参数通常放在 URL 后面POST参数通常放在请求体里GET更适合查询POST更适合提交复杂数据3.3 请求报文请求报文一般包含请求行请求头请求体例子GET /user?id1 HTTP/1.1 Host: localhost:8080 User-Agent: Chrome3.4 响应报文响应报文一般包含状态行响应头响应体例子HTTP/1.1 200 OK Content-Type: text/html;charsetUTF-83.5 常见状态码200成功302重定向404资源不存在500服务器内部错误4. TomcatTomcat 是一个 Web 服务器也是 Servlet 容器。作用运行 JavaWeb 项目接收 HTTP 请求调用 Servlet 处理请求返回响应你可以理解成浏览器不会直接调用 Java 类浏览器是通过 Tomcat 间接调用 JavaWeb 代码5. ServletServlet 是 JavaWeb 最核心的基础之一用来处理请求和响应。5.1 第一个 Servletimportjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;WebServlet(/hello)publicclassHelloServletextendsHttpServlet{OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.setContentType(text/html;charsetUTF-8);resp.getWriter().write(Hello Servlet);}}访问http://localhost:8080/项目名/hello5.2 代码解释WebServlet(/hello)配置访问路径HttpServletServlet 基类doGet()处理 GET 请求doPost()处理 POST 请求5.3 doPost 示例OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.setContentType(text/plain;charsetUTF-8);resp.getWriter().write(POST request success);}6. Servlet 生命周期Servlet 生命周期由容器管理。常见方法init()初始化service()处理请求destroy()销毁通常开发中你更常重写doGet()doPost()流程第一次请求时创建 Servlet 对象调用初始化方法每次请求调用 service/doGet/doPost服务器关闭时销毁7. 请求对象 HttpServletRequestHttpServletRequest用来获取请求数据。7.1 获取请求参数Stringusernamereq.getParameter(username);Stringpasswordreq.getParameter(password);7.2 获取多个参数String[]hobbiesreq.getParameterValues(hobby);7.3 获取请求方式Stringmethodreq.getMethod();7.4 获取请求路径Stringurireq.getRequestURI();Stringurlreq.getRequestURL().toString();7.5 获取请求头Stringagentreq.getHeader(User-Agent);7.6 请求转发req.setAttribute(msg,登录成功);req.getRequestDispatcher(/success.jsp).forward(req,resp);说明转发发生在服务器内部浏览器地址栏不会变可以共享 request 域数据Demo登录参数获取WebServlet(/login)publicclassLoginServletextendsHttpServlet{OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{req.setCharacterEncoding(UTF-8);Stringusernamereq.getParameter(username);Stringpasswordreq.getParameter(password);if(admin.equals(username)123456.equals(password)){req.setAttribute(msg,登录成功);req.getRequestDispatcher(/success.jsp).forward(req,resp);}else{req.setAttribute(msg,用户名或密码错误);req.getRequestDispatcher(/login.jsp).forward(req,resp);}}}8. 响应对象 HttpServletResponseHttpServletResponse用来给浏览器返回数据。8.1 返回字符串resp.setContentType(text/plain;charsetUTF-8);resp.getWriter().write(操作成功);8.2 返回 HTMLresp.setContentType(text/html;charsetUTF-8);resp.getWriter().write(h1Hello Web/h1);8.3 重定向resp.sendRedirect(/项目名/index.jsp);说明重定向是浏览器行为地址栏会变不能共享 request 域数据8.4 设置响应状态码resp.setStatus(200);8.5 设置响应头resp.setHeader(Content-Type,text/plain;charsetUTF-8);9. 请求转发和重定向的区别9.1 请求转发req.getRequestDispatcher(/success.jsp).forward(req,resp);特点服务器内部跳转地址栏不变request 可共享一次请求9.2 重定向resp.sendRedirect(/success.jsp);特点浏览器重新发起请求地址栏变化request 不共享两次请求10. ServletContextServletContext表示整个 Web 应用上下文。作用多个 Servlet 共享数据读取全局配置获取资源路径10.1 共享数据ServletContextapplicationgetServletContext();application.setAttribute(count,100);ObjectcountgetServletContext().getAttribute(count);11. 域对象JavaWeb 常见域对象request一次请求内有效session一次会话内有效application整个应用内有效11.1 request 域req.setAttribute(name,张三);Objectnamereq.getAttribute(name);11.2 session 域req.getSession().setAttribute(user,admin);Objectuserreq.getSession().getAttribute(user);11.3 application 域getServletContext().setAttribute(appName,demo);12. CookieCookie 是服务器保存在浏览器端的小数据。常见用途记住用户名追踪会话简单状态保存12.1 创建 CookieCookiecookienewCookie(username,admin);cookie.setMaxAge(60*60);resp.addCookie(cookie);12.2 获取 CookieCookie[]cookiesreq.getCookies();if(cookies!null){for(Cookiecookie:cookies){System.out.println(cookie.getName()cookie.getValue());}}说明Cookie 存在浏览器端不要用 Cookie 存敏感明文信息13. SessionSession 是服务器端会话技术。常见用途保存登录用户信息保存验证码保存购物车状态13.1 存数据HttpSessionsessionreq.getSession();session.setAttribute(loginUser,admin);13.2 取数据Objectuserreq.getSession().getAttribute(loginUser);13.3 删除数据req.getSession().removeAttribute(loginUser);13.4 销毁 Sessionreq.getSession().invalidate();Demo登录状态校验WebServlet(/profile)publicclassProfileServletextendsHttpServlet{OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Objectuserreq.getSession().getAttribute(loginUser);if(usernull){resp.sendRedirect(/login.jsp);return;}resp.getWriter().write(当前用户user);}}14. JSPJSP 是早期 JavaWeb 用来写页面的技术。现在很多前后端分离项目已经很少直接用 JSP但你需要知道它是什么。14.1 第一个 JSP% page contentTypetext/html;charsetUTF-8 languagejava % html head titleJSP Demo/title /head body h1Hello JSP/h1 /body /html14.2 JSP 表达式% 当前时间 new java.util.Date() %14.3 获取 request 域数据${msg}说明现代项目里你更常见的是前后端分离 JSONJSP 主要是历史基础和部分老项目还在用15. EL 表达式EL 用来简化 JSP 获取数据。${user} ${sessionScope.loginUser} ${requestScope.msg}好处比 Java 脚本片段更简洁页面更清晰16. JSTLJSTL 是 JSP 标签库用来写循环、判断等。16.1 导入标签库% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %16.2 if 判断c:if test${not empty user} 欢迎你${user} /c:if16.3 forEach 循环c:forEach items${list} varitem ${item}br /c:forEach17. Filter 过滤器Filter 用来对请求进行统一拦截处理。常见用途登录校验编码统一处理权限校验日志统计17.1 编码过滤器 Demoimportjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;WebFilter(/*)publicclassEncodingFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{request.setCharacterEncoding(UTF-8);response.setContentType(text/html;charsetUTF-8);chain.doFilter(request,response);}}17.2 登录校验过滤器 DemoWebFilter(/admin/*)publicclassLoginFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq(HttpServletRequest)request;HttpServletResponseresp(HttpServletResponse)response;Objectuserreq.getSession().getAttribute(loginUser);if(usernull){resp.sendRedirect(req.getContextPath()/login.jsp);return;}chain.doFilter(request,response);}}说明chain.doFilter()表示放行不调用就会拦截住请求18. Listener 监听器Listener 用来监听 Web 应用、Session、Request 的创建和销毁等事件。18.1 ServletContextListenerimportjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.annotation.WebListener;WebListenerpublicclassAppListenerimplementsServletContextListener{OverridepublicvoidcontextInitialized(ServletContextEventsce){System.out.println(Web 应用启动);}OverridepublicvoidcontextDestroyed(ServletContextEventsce){System.out.println(Web 应用关闭);}}常见用途项目启动时初始化配置加载缓存启动统计逻辑19. MVC 思想MVC 是 JavaWeb 里很重要的设计思想。Model数据和业务模型View页面展示Controller控制请求流程在传统 JavaWeb 中Servlet 充当 ControllerJavaBean/Service/DAO 充当 ModelJSP 充当 View作用分层清晰职责分离更容易维护20. JavaBeanJavaBean 是一种规范化的普通 Java 类。特点私有属性公共 getter/setter通常有无参构造例子publicclassUser{privateIntegerid;privateStringusername;privateStringpassword;publicUser(){}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.idid;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.usernameusername;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.passwordpassword;}}21. 三层架构JavaWeb 常见三层Controller接收请求Service处理业务逻辑DAO访问数据库流程浏览器 - Servlet - Service - DAO - 数据库这也是后面 Spring Boot 项目里最常见的基础结构。22. 综合 Demo登录案例22.1 login.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title登录/title /head body form actionlogin methodpost 用户名input typetext nameusernamebr 密码input typepassword namepasswordbr button typesubmit登录/button /form p${msg}/p /body /html22.2 LoginServletWebServlet(/login)publicclassLoginServletextendsHttpServlet{OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{req.setCharacterEncoding(UTF-8);Stringusernamereq.getParameter(username);Stringpasswordreq.getParameter(password);if(admin.equals(username)123456.equals(password)){req.getSession().setAttribute(loginUser,username);resp.sendRedirect(req.getContextPath()/index.jsp);}else{req.setAttribute(msg,用户名或密码错误);req.getRequestDispatcher(/login.jsp).forward(req,resp);}}}22.3 index.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title首页/title /head body h2欢迎你${sessionScope.loginUser}/h2 /body /html23. 文件上传和下载基础认识23.1 文件上传文件上传通常需要表单设置enctypemultipart/form-data服务端解析文件流表单例子formactionuploadmethodpostenctypemultipart/form-datainputtypefilenamefilebuttontypesubmit上传/button/form23.2 文件下载resp.setContentType(application/octet-stream);resp.setHeader(Content-Disposition,attachment;filenametest.txt);说明现代项目常借助框架或工具类来处理上传下载JavaWeb 阶段知道原理即可24. Ajax 基础认识Ajax 是浏览器异步请求服务器的方式。好处不刷新整个页面只更新部分内容例子fetch(/user?id1).then(resres.text()).then(dataconsole.log(data));这也是你以后做前后端分离的基础。25. JavaWeb 开发常见问题25.1 中文乱码解决思路请求设置编码响应设置编码过滤器统一处理req.setCharacterEncoding(UTF-8);resp.setContentType(text/html;charsetUTF-8);25.2 404常见原因路径写错Servlet 没配置成功项目没部署25.3 500常见原因Java 代码报错空指针SQL 异常25.4 Session 丢失常见原因浏览器禁用了 CookieSession 超时服务端重启26. JavaWeb 和 Spring Boot 的关系你可以这样理解JavaWeb 是基础Spring MVC / Spring Boot 是更高级、更现代的开发方式传统 JavaWeb 里你常写ServletJSPFilterListenerSpring Boot 里你更常写ControllerServiceInterceptor配置类REST API但它们底层很多概念是相通的比如请求和响应会话和 Cookie过滤和拦截MVC 分层27. 新手最该掌握的 JavaWeb 知识优先级从高到低HTTP 基础ServletRequest / ResponseCookie / SessionFilterMVC 和三层架构JSP / EL / JSTLListener28. 总结JavaWeb 不是为了让你一直手写 Servlet 和 JSP而是为了让你理解 Web 应用最基础的运行方式。你至少要搞清楚这几个点请求是怎么进来的参数是怎么拿到的响应是怎么返回的登录状态是怎么保存的过滤器是怎么统一处理请求的MVC 为什么要分层这些理解透了后面学 Spring Boot 会顺很多。