ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Servlet_day1 完整学习笔记|B/S 架构|Servlet 开发|生命周期|请求参数

Servlet_day1 完整学习笔记|B/S 架构|Servlet 开发|生命周期|请求参数 前言Servlet 是 JavaEE 最重要的底层规范是 JavaWeb 动态开发的基石。浏览器发送请求到 Tomcat 服务器由 Servlet Java 程序接收请求、执行业务逻辑、给浏览器返回响应结果。学习前置掌握 HTML、CSS、JDBC 数据库操作运行环境Tomcat 服务器。一、网络应用体系结构 C/S vs B/S1.1 C/S 客户端‑服务器模式Client‑Server代表软件QQ、微信桌面端、游戏客户端✅交互特点需要下载、安装专用客户端软件才可以使用系统。✅优点客户端本地渲染图形界面效果炫酷交互体验好。❌缺点服务端版本升级之后所有用户的客户端必须同步升级维护成本很高。1.2 B/S 浏览器‑服务器模式Browser‑Server代表网页网站、后台管理系统浏览器就是客户端不需要额外安装软件。✅交互特点只需要 PC 设备拥有浏览器即可访问系统。✅优点服务端升级更新客户端浏览器不需要做任何安装升级维护成本低。❌缺点网页浏览器能力有限界面交互效果相比原生客户端会受限。现在企业 Web 项目绝大多数使用 B/S 架构Servlet 就是 B/S 架构 Java 后端技术。二、静态 Web 应用 vs 动态 Web 应用2.1 静态 Web 应用静态 Web 资源html、css、js、图片。 浏览器请求Tomcat 直接把已经写好的 html 文件原样返回给浏览器。✅工作流程浏览器发起请求访问form.htmlTomcat 解析请求路径在 webapps 项目目录找到 form.html 静态文件直接把 html 文件内容作为响应返回浏览器。❌静态网页三大缺陷不能访问数据库无法动态读取业务数据业务变多需要编写海量 html 页面维护困难同一个 html 页面返回内容固定不能根据用户不同请求返回不一样的数据。2.2 动态 Web 应用动态 Web请求不再直接访问静态 html而是访问后端 Java 程序Servlet。 Java 程序执行业务逻辑可以操作数据库动态拼接输出网页内容再返回给浏览器。✅工作流程浏览器访问 Servlet 网络路径Tomcat 解析请求路径调用对应的 Java Servlet 程序Servlet 可以连接数据库查询数据动态拼装网页将处理后的结果响应返回浏览器。核心区别静态返回现成文件动态是程序运行生成响应内容。三、Servlet 简介Servlet 属于JavaEE 的子规范本质是运行在 Tomcat 服务器端的 Java 程序。作用接收浏览器的 http 请求处理业务生成动态网页返回客户端。开发最基础要求编写 Java 类实现javax.servlet.Servlet接口。注意Servlet 代码不能直接 main 方法运行必须交给 Tomcat 服务器来调用执行。四、手工开发第一个 Servlet无 IDE理解底层原理手工开发目的搞懂 Tomcat 如何加载 Servlet理解 web.xml 部署描述符作用。实际工作不会手写都是 IDE 工具开发。4.1 步骤 1编写实现 Servlet 接口的 Java 类核心方法service(ServletRequest request,ServletResponse response)request封装浏览器发来的全部请求信息response用于向浏览器输出响应数据import javax.servlet.*; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; public class ShowTime implements Servlet { Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { //1 设置响应MIME类型和编码告诉浏览器返回的是html网页编码GBK response.setContentType(text/html); response.setCharacterEncoding(GBK); //2 获取输出打印流向浏览器输出网页内容 PrintWriter out response.getWriter(); //3 输出html页面内容动态输出当前系统时间 out.println(html); out.println(body); out.println(h1服务器当前时间 new Date() /h1); out.println(/body); out.println(/html); out.flush(); // 输出流不需要手动close请求响应结束Tomcat自动关闭流 } //剩下init、getServletConfig、getServletInfo、destroy方法省略实现 Override public void init(ServletConfig servletConfig) throws ServletException {} Override public ServletConfig getServletConfig() { return null; } Override public String getServletInfo() { return null; } Override public void destroy() {} }4.2 编译 Java 文件编译依赖 Tomcat 提供servlet-api.jar包需要配置 CLASSPATH 环境变量指向tomcat/lib/servlet-api.jar否则编译报类找不到。4.3 部署 class 字节码文件把编译得到的.class字节码文件放入 web 项目WEB‑INF/classes目录必须保留完整包目录结构。4.4 编写 web.xml 部署描述符web.xml 告诉 Tomcat哪个类是 Servlet浏览器访问什么 URL 可以调用这个 Servlet。?xml version1.0 encodingUTF-8? web‑app !-- 1.注册Servlet -- servlet !-- servlet别名项目内全局唯一 -- servlet‑nameshowTime/servlet‑name !-- Servlet类完整全限定类名包名.类名 -- servlet‑classcom.baizhi.servlet.ShowTime/servlet‑class /servlet !-- 2.Servlet映射绑定访问URL路径 -- servlet‑mapping !-- 必须和上面servlet‑name名字完全一致 -- servlet‑nameshowTime/servlet‑name !-- url‑pattern访问路径必须以 / 开头 -- url‑pattern/suibian/url‑pattern /servlet‑mapping /web‑app访问地址格式http://localhost:端口号/项目名/url‑pattern示例http://localhost:8989/servletWeb/suibian4.5 启动 Tomcat浏览器访问运行tomcat/bin/startup.bat启动服务器浏览器输入上面地址访问。⚠️重要注意点修改 Servlet 源代码 或者修改 web.xml 配置需要重新编译、重新部署项目才会生效4.6 请求‑响应完整执行流程浏览器发送 HTTP 请求访问 Servlet 路径Tomcat 接收请求解析请求 URL 路径读取项目下web.xml配置匹配url‑pattern找到对应的 Servlet 全类名Tomcat 利用反射机制创建 Servlet 对象Tomcat 自动调用servlet.service()方法处理请求service 内部通过 PrintWriter 输出响应内容Tomcat 把响应数据返回浏览器展示页面。五、MyEclipse 工具开发 Servlet实际开发方式手工写 Servlet 只是理解原理企业开发全部使用 IDE 工具自动处理编译、部署、依赖包。步骤 1配置 MyEclipse 绑定本地 TomcatWindow → Preferences → Servers → Tomcat 7.x勾选 Enable 启用Browse 选择本地 Tomcat 安装根目录配置对应的 JDKApply 保存。步骤 2新建 JavaEE Web ProjectProject name 填写项目名字Java EE 版本选择 JavaEE6下一步勾选Generate web.xml deployment descriptor自动生成 web.xml 部署文件Finish 完成创建。步骤 3编写 Servlet 代码在 src 源码包创建 Servlet Java 类。步骤 4部署项目到 Tomcat点击工具栏 Deployment 部署按钮Add选择我们配置好的 Tomcat 服务器部署模式选择 Exploded Archive开发模式Finish黄色感叹号代表项目变更点击Redeploy重新部署。提示Successfully deployed代表部署成功。步骤 5启动 Tomcat 服务器浏览器访问测试。六、Servlet 生命周期【面试高频考点】Servlet 完整生命周期分为 3 个阶段初始化 init () → 服务 service () → 销毁 destroy ()初始化 init ()默认时机第一次浏览器请求访问 Servlet 的时候Tomcat 才创建 Servlet 对象执行 init () 初始化懒加载。可选配置web.xml 中配置load‑on‑startup数字/load‑on‑startup服务器启动就创建 Servlet 对象。提供服务 service ()每一次浏览器发送请求Tomcat 调用 service 方法处理请求。⚠️Servlet 是单例对象整个 Tomcat 里面一个 Servlet 类只会创建一个实例对象多个用户并发请求多线程共用这一个 Servlet 对象。销毁 destroy ()Tomcat 服务器正常关闭的时候执行 destroy () 方法释放资源。重点坑Servlet 单例多线程并发访问属于临界资源不要在 Servlet 里面定义成员变量多个线程同时读写成员变量会出现线程安全问题。临时数据请定义在 service 方法内部局部变量。七、Servlet 三种实现方式表格实现方式说明使用场景实现Servlet接口全部方法需要自己重写学习底层原理开发几乎不用继承GenericServlet抽象类已经实现 Servlet 接口大部分空实现不区分 http 协议极少使用继承HttpServlet抽象类【开发首选】专门针对 HTTP 协议封装继承 GenericServlet实际项目 100% 使用HttpServlet 示例代码import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; public class HttpShowDate extends HttpServlet { Override protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType(text/html); response.setCharacterEncoding(GBK); PrintWriter out response.getWriter(); out.println(htmlbody); out.println(h1 stylecolor:red;new Date()/h1); out.println(/body/html); out.flush(); } }八、URL、URI、url‑pattern 概念区分URL 统一资源定位符完整互联网访问地址。 格式http://IP地址:端口/项目名/资源路径示例http://localhost:8080/servlet_day/suibianURI 统一资源标识符去掉协议 IP 端口服务器内部资源路径。 格式/项目名/资源路径示例/servlet_day/suibianurl‑patternweb.xml 配置标签Servlet 映射的访问路径必须以/开头。九、访问 Servlet 的三种请求方式浏览器地址栏直接输入 URLGET 请求html 页面 a 超链接跳转GET 请求a href/servletWeb/suibian访问Servlet/ahtml form 表单提交可以是 GET / POST 请求form action/servlet_day/ParamServlet methodPOST 用户名:input typetext nameusername 密码:input typepassword namepassword input typesubmit value提交 /form十、获取客户端请求参数核心 APIrequest.getParameter(参数name属性值)返回 String 字符串。示例表单提交获取用户名密码Servlet 代码Override protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException { //获取表单提交参数参数名和表单input的name一一对应 String username request.getParameter(username); String password request.getParameter(password); //后台控制台打印 System.out.println(用户名username); System.out.println(密码password); response.setContentType(text/html); response.setCharacterEncoding(GBK); PrintWriter out response.getWriter(); out.println(接收用户username); }注意getParameter()接收的是表单标签name属性不是 id没有写 name 属性后台拿不到参数。十一、请求中文乱码解决方案POST 请求乱码在获取参数之前设置 request 编码request.setCharacterEncoding(GBK);GET 请求乱码GET 请求参数放在 URL 地址栏上面的 setCharacterEncoding 无效。 修改 tomcat 配置文件conf/server.xml给 Connector 节点增加属性Connector port8080 URIEncodingGBK /URIEncoding指定 GET 请求 URL 参数的解码字符集。十二、Servlet 整合 JDBCServlet 业务中需要操作数据库步骤将mysql‑connector‑java.jar或者ojdbc.jar数据库驱动放入项目WEB‑INF/lib在 service 方法内部调用 JDBCUtil 工具类获取连接执行 CRUD查询到的数据通过 PrintWriter 输出到网页上展示。不建议在 Servlet 直接写大量 JDBC 代码后续会抽离 DAO 层。十三、Servlet 开发常见错误码排查【面试 排错必看】表格状态码错误含义排查思路404资源找不到1. 访问 URL 路径写错2. 项目没有部署成功3.web.xml 的 url‑pattern 配置错误大小写敏感500服务器内部代码异常Java 代码运行抛出异常看 Tomcat 控制台堆栈报错日志定位代码 bug405方法不允许1. 没有正确继承 HttpServlet2.service 方法重写签名写错3. 请求方式不匹配知识点小结C/S 需要客户端软件B/S 使用浏览器访问JavaWeb 属于 B/S 架构。静态 Web 返回现成 html 文件动态 Web 执行 Servlet Java 程序生成页面可以访问数据库。Servlet 是 Tomcat 调用的 Java 程序生命周期init()初始化 → service()服务 → destroy()销毁Servlet 是单例禁止定义成员变量防止线程安全问题。开发优先继承HttpServletrequest.getParameter()获取表单提交参数注意 POST、GET 中文乱码处理。状态码404 找不到资源、500 代码异常、405 请求方法错误。✨课后练习编写 Servlet接收表单用户名密码后台控制台打印练习区分 404、500 错误熟悉排错思路。 以上为本篇 Servlet 学习笔记若有更好的建议欢迎评论区商讨交流欢迎各位大佬指正、补充不同实现思路。学习提示Servlet 是 JavaWeb 底层理解请求与响应模型对后续学习 Filter、Listener、SpringMVC 非常重要。
返回列表