Servlet 简明教程
2021-01-11 11:32:32 6 举报
AI智能生成
自己学习 Servlet 过程中进行的总结 开放了免费克隆,希望可以获得点赞支持,多谢你的举手之劳
作者其他创作
大纲/内容
概念
Servlet 是 JavaEE 规范之一(接口)<br>
Servlet 是 JavaWeb 三大组件之一
Servlet 程序
Filter 过滤器
Listener 监听器
Servlet 是运行在服务器上的一个 Java 程序,它可以接收客户端发来的请求并响应数据给客户端
实现 Servlet 程序<br>
编写一个实现 Servlet 接口的类
实现 service 方法,处理请求并响应数据
web.xml 配置 Servlet 程序的访问地址
<servlet></servlet><br><ul><li>为 Tomcat 配置 Servlet 程序</li></ul>
<servlet-name></servlet-name><br><ul><li>为 Servlet 程序配置别名(一般为类名)</li></ul>
<servlet-class></servlet-class><br><ul><li>配置 Servlet 程序的全类名</li></ul>
<init-param></init-param><br><ul><li>配置初始化参数<br>(每个参数均需要一对 <init-param></init-param>)</li></ul>
<param-name></param-name><br><ul><li>参数名</li></ul>
<param-value></param-value><br><ul><li>参数值</li></ul>
<servlet-mapping></servlet-mapping><br><ul><li>为 Servlet 程序配置访问地址</li></ul>
<servlet-name></servlet-name><br><ul><li>将当前配置地址授予指定 Servlet 程序</li></ul>
<url-pattern></url-pattern><br><ul><li>配置访问地址<br>/ 服务器解析时表示为 http://ip:port/project<br>/source 服务器解析时表示为 http://ip:port/project/source</li></ul>
通过 ip 定位服务器
通过 port 定位 Tomcat
通过 project 定位工程
通过 source 定位具体 Servlet 程序
生命周期
执行 Servlet 构造器方法
执行 init 初始化方法
执行 service 方法
执行 destroy 销毁方法
请求分发处理
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;<br>
httpServletRequest.getMethod();
public void doGet() {}<br>
public void doPost() {}
继承 HttpServlet 实现 Servlet 程序<br>(在实际项目开发中)
编写类,继承 HttpServlet
重写 doGet 或 doPost 方法
web.xml 配置 Servlet 程序的访问地址
继承体系
<javax.servlet><br>Interface Servlet<br> ↑ 实现接口<br><javax.servlet><br>Class GenericServlet<br> ↑ 继承<br><javax.servlet.http><br>Class HttpServlet<br> ↑ 继承<br>Class UserDefind extend HttpServlet
Servlet 接口,负责定义 Servlet 程序的访问规范
GenericServlet 类实现了 Servlet 接口(空实现)<br>持有一个 ServletConfig 类的引用,对 ServletConfig 的使用定义了相关方法
HttpServlet 抽象类实现了 service 方法<br>并实现了请求的分发处理 String method = req.getMethod();
GET - doGet()
POST - doPost
UserDefind 用户自定义的 Servlet 程序,只需要根据业务需求重写 doGet 或 doPost 方法<br>
若重写 init 方法,须在首行添加 super.init(config);
常用类/接口
ServletConfig<br><ul><li>Servlet 程序的配置信息类</li><li><span style="font-size: inherit;">Servlet 程序和 ServletConfig 对象均由 Tomcat 负责创建</span></li><li><span style="font-size: inherit;">Servlet 程序默认为第一次访问时创建<br>每个 Servlet 程序创建时便创建一个对应的 ServletConfig 对象传递给 init 方法</span></li></ul>
String getServletName();<br><ul><li>获取 Servlet 程序别名 <servlet-name> 的值</li></ul>
String getInitParameter(String var1);<br><ul><li>获取初始化参数 init-param</li></ul>
ServletContext getServletContext();<br><ul><li>获取 ServletContext 对象</li></ul>
ServletContext<br><ul><li>ServletContext 为一个接口,表示 Servlet 上下文对象</li><li>一个 web 工程只有一个 ServletContext 对象实例</li><li><span style="font-size: inherit;">ServletContext 对象是一个域对象</span></li><li><span style="font-size: inherit;">ServletContext 在 web 工程部署启动时创建<br></span>在 web 工程停止时销毁</li></ul>
获取 web.xml 中配置的上下文参数<br><ul><li><context-param></context-param></li><li><span style="font-size: inherit;">属于整个 web 工程</span></li><li><span style="font-size: inherit;">(每个参数均需要一对 <context-param></context-param>)</span></li></ul>
<param-name></param-name><br><ul><li>参数名</li></ul>
<param-value></param-value><br><ul><li>参数值</li></ul>
ServletContext servletContext = getServletContext();<br><ul><li><b>servletContext.getInitParameter(String var1);</b></li></ul>
获取当前工程路径<br><ul><li>/project</li></ul>
ServletContext servletContext = getServletContext();<br><ul><li><b>servletContext.getContextPath();</b></li></ul>
获取工程部署后在服务器硬盘上的绝对路径<br><ul><li>映射到 web 目录(WEB-INF)</li></ul>
像 Map 一样存取数据
ServletContext servletContext = getServletContext();<br><ul><li><b style="font-size: inherit;">servletContext.getAttribute(String var1);</b></li><li><b style="font-size: inherit;">servletContext.setAttribute(String var1, Object var2);</b></li><li><b style="font-size: inherit;">servletContext.removeAttribute(String var1);</b></li></ul>
HttpServletRequest<br><ul><li>只要有请求进入 Tomcat 服务器<br>Tomcat 便会将请求携带的 HTTP 协议信息进行解析并封装到 Request 对象中<br>传递给 service 方法(doGet 或 doPost)</li><li>可以通过 HttpServletRequest 对象获取到所有请求的信息</li></ul>
getRequestURI()<br><ul><li>获取请求的资源路径</li></ul>
getRequestURL()<br><ul><li>获取请求的统一资源定位符(绝对路径)</li></ul>
getRemoteHost()<br><ul><li>获取客户端的 IP</li></ul>
getHeader(String val1)<br><ul><li>获取请求头</li></ul>
getParameter()<br><ul><li>获取请求参数</li></ul>
getParameterValues()<br><ul><li>获取请求参数(多个值时使用)</li></ul>
getMethod()<br><ul><li>获取请求方法</li></ul>
setAttribute(key, value)<br><ul><li>设置域数据</li></ul>
getAttribute(key)<br><ul><li>获取域数据</li></ul>
getRequestDispatcher()<br><ul><li>获取请求转发对象</li></ul>
<b>请求转发</b><br>指服务器收到请求后,从一个资源跳转到另一个资源的操作<br><ul><li>浏览器地址栏地址未变化</li><li>视为一次请求</li><li>共享 Request 域中数据</li><li>可以转发到 WEB-INF 目录下</li><li>不可以访问 web 工程以外的资源</li></ul>
<b>RequestDispatcher requestDispatcher = httpServletRequest.getRequestDispatcher(String val1);</b><br><ul><li>请求转发必须以 / 开头,/ 表示 http://ip:port/project/,映射到 web 目录(WEB-INF)</li></ul><b>requestDispatcher.forward(httpServletRequest, httpServletResponse);</b><br>
<b><base> 标签 <base href="http://ip:port/project/source/"></b><br><ul><li><span style="font-size: inherit;">设置当前页面中所有相对路径工作时参照的地址,以参照地址进行跳转</span></li><li><span style="font-size: inherit;">设置于 <head></head> 标签对中,通常设置在 <title> 标签之下</span></li><li><span style="font-size: inherit;">href 属性即参照的地址值<br>▲ 末尾 / 不可省略,代表路径(省略即视为资源)</span></li></ul>
HttpServletResponse<br><ul><li>只要有请求进入 Tomcat 服务器<br>Tomcat 便会创建一个 Response 对象传递给 Servlet 程序</li><li><span style="font-size: inherit;">可以通过 HttpServletResponse 对象设置需要返回给客户端的信息</span></li><li><span style="font-size: inherit;">通过流将数据传递给客户端</span></li></ul>
<b>输出流</b><br><ul><li>字节流 getOutputStream() 常用于下载(传递二进制数据)</li><li>字符流 getWrite() 常用于回传字符串(常用)</li></ul>▲ 两个流同时只能使用一个,若同时使用将报错<br>
<b>请求重定向</b><br><span style="font-size: inherit;">指客户端向服务端发起请求,服务端告知客户端访问新地址<br><ul><li>浏览器地址栏发生变化</li><li><span style="font-size: inherit;">两次请求</span></li><li><span style="font-size: inherit;">不共享 Request 域中数据</span></li><li>不能访问 WEB-INF 下的资源</li><li>可以访问 web 工程外的资源</li></ul></span><span style="font-size: inherit;"></span>
HTTP 协议
客户端与服务端之间通信,数据传输需要遵守的规则<br><ul><li>数据 -> 报文</li><li>客户端给服务端发送数据 -> 请求<br>▲ GET 请求<br>▲ POST 请求</li><li>服务端给客户端发送数据 -> 响应</li></ul>
GET 请求<br><ul><li>请求行<br>▲ 请求方式<br>▲ 请求资源路径 [?请求参数]<br>▲ 请求协议版本</li></ul><ul><li>请求头</li></ul>
<b>请求行</b><br>GET /project/source HTTP/1.1<br>--------------------------------------------<br><ul><li>请求方式 GET</li><li>请求资源路径 /project/source</li><li>请求协议版本 HTTP/1.1</li></ul>
<b>请求头(key: value)<br></b>Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*<br>Accept-Language: zh-CN<br>User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 3.0.30729; Media Center PC 6.0)<br>UA-CPU: AMD64<br>Accept-Encoding: gzip, deflate<br>Host: localhost:8080<br>Connection: Keep-Alive<br>-----------------------------------------------------------------------------------------------------------------------------------------------<br><ul><li>Accept:告知服务端,客户端可以接收的数据类型</li><li>Accept-Language:告知服务端,客户端可以接收的语言类型<br>▲ zh-CN 中文中国<br>▲ en-US 英文美国</li><li>User-Agent:浏览器信息</li><li>Accept-Encoding:告知服务端,客户端可以接收的数据编码(压缩)格式</li><li>Host:表示请求服务端的 ip:port</li><li>Connection:告知服务端如何处理请求连接<br>▲ Keep-Alive 告知服务端回传数据不要马上关闭,保持一小段时间的连接<br>▲ Closed 马上关闭</li></ul>
POST 请求<br><ul><li>请求行<br>▲ 请求方式<br>▲ 请求资源路径<br>▲ 请求协议版本</li><li><span style="font-size: inherit;">请求头</span></li><li><span style="font-size: inherit;">空行</span></li><li><span style="font-size: inherit;">请求体</span></li></ul>
<b>请求行</b><br>POST /project/source HTTP/1.1<br>--------------------------------------------<br><ul><li>请求方式 POST</li><li>请求资源路径 /project/source</li><li>请求协议版本 HTTP/1.1</li></ul>
<b>请求头(key: value)</b><br>Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*<br>Referer: http://localhost:8080/project/source/index.html<br>Accept-Language: zh-CN<br>User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 3.0.30729; Media Center PC 6.0)<br>Content-Type: application/x-www-form-urlencoded<br>UA-CPU: AMD64<br>Accept-Encoding: gzip, deflate<br>Host: localhost:8080<br>Content-Length: 26<br>Connection: Keep-Alive<br>Cache-Control: no-cache<br>---------------------------------------------------------------------------------------------------------------------------------------------------------------<br><ul><li>Referer:表示请求发起时浏览器地址栏中的地址</li><li>Content-Type:表示发送的数据类型<br>▲ application/x-www-form-urlencoded 表示提交的数据格式为 name=value&sex=male 并对其进行 url 编码(将非英文内容转换为 %xx%xx 格式)<br>▲ multipart/form-data 表示以多段的形式提交数据给服务端(以流的形式提交,用于上传)</li></ul><ul><li>Content-Length:表示发送的数据的长度</li><li>Cache-Control:表示如何控制缓存(no-cache 不缓存)</li></ul>
<b>请求体</b><br>username=name&password=word 发送给服务端的数据
响应<br><ul><li>响应行<br>▲ 响应协议版本<br>▲ 响应状态码<br>▲ 响应状态描述符<br></li><li>响应头</li><li>空行</li><li>响应体</li></ul>
<b>响应行<br></b>HTTP/1.1 200 OK
<b>响应体</b><br>Server: Apache-Coyote/1.1<br>Accept-Ranges: bytes<br>ETag: W/"375-1578903773217"<br>Last-Modified: Sat, 9 Jan 2021 08:22:53 GMT<br>Content-Type: text/html<br>Conten-Length: 375<br>Date: Sat, 9 Jan 2021 08:38:42 GMT<br>-------------------------------------------------<br><ul><li>Server:表示服务器信息</li><li>Content-Type:表示响应体的数据类型</li><li>Content-Length:表示响应体的长度</li><li>Date:请求响应的时间(格林威治时间)</li></ul>
<b>空行</b>
<b>响应体</b><br><!DOCTYPE html><br><html lang="en"><br><head><br> <meta charset="UTF-8"><br> <title>Title</title><br></head><br><body><br><form action="http://localhost:8080/project/source" method="post"><br> <input type="text" name="username"><br> <input type="password" name="password"><br> <input type="submit" value="Submit"><br></form><br></body><br></html>
MIME 类型
MIME 即 HTTP 协议中的数据类型<br><ul><li>全称:Multipurpose Internet Mail Extensions 『多功能 Internet 邮件扩充服务』</li><li>格式为:『大类型/小类型』并与某一种文件的扩展名相对应</li></ul>
常见 MIME 类型<br><ul><li>超文本标记语言文本 .html text/html</li><li>普通文本 .txt text/plain</li><li>RTF 文本 .rtf application/rtf</li><li>GIF 图形 .gif image/gif</li><li>JPEG 图形 .jpeg, .jpg image/jpeg</li><li>au 声音文件 .au audio/basic</li><li>MIDI 音乐文件 .mid, .midi audio/midi, audio/x-midi</li><li>RealAudio 音乐文件 .ra, .ram audio/x-pn-realaudio</li><li>MPEG 文件 .mpg, .mpeg video/mpeg</li><li>AVI 文件 .avi video/x-msvideo</li><li>GZIP 文件 .gz application/x-gzip</li><li>TAR 文件 .tar application/x-tar</li></ul>
收藏
0 条评论
下一页