文章目录
1. 什么是 servlet
- 全称
Server Applet
。是Java
编写的,且交服务器容器去执行的服务端程序,主要功能在于处理Http
请求。其为一个接口,用户编写实现类,将其注册到服务器容器中。 - 工作流程 : 客户端发送请求i
->
服务器根据URL
匹配对应的Servlet
处理请求->
服务器将处理完毕的内容返回给客户端(servlet 操作 Response 对象来写入结果)。
2. Servlet API
3. 编写一个Servlet
3.1 创建web工程
- 使用 maven 或 不使用 maven 均可。
3.2 引入 servlet 依赖
- 方式一:
使用maven
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
- 方式二:使用
jar
自行百度。
3.2 编写 servlet
- 注意事项 :
doGet
和doPost
不要调用父类doGet / doPost
,否则405
错误。
package com.wangnan.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet extends HttpServlet {
// 处理 GET
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget---");
}
// 处理POST
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost---");
}
}
3.3 配置 servlet
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>com.wangnan.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
4. 常用类
4.1 HttpServletRequest
服务器接收到请求,并将请求报文解析成 HttpServletRequest
对象,再调用 Servlet
的处理请求方法时候传入。
4.1.1 获得参数(post / get 均可获取)
get
请求不需要考虑传递过来的乱码怎么处理。post
请求需要通过setCharacterEncoding
来处理乱码问题。- 无论前端穿过来的是什么数据,后端接收都为
String
类型
String getParamter(String name); // 根据表单组件名称,获取提交的数据。
String[] getParamterValues(String name); // 相同 name 的多个 value
4.1.2 设置请求的编码(处理post乱码的)
void setCharacterEncoding(String name);
4.1.3 请求转发
request.getRequestDispatcher("../success.jsp").forward(request, response);
4.1.4 request 域中存取
// 存值
request.setAttribute("key", value);
// 取值
Object object = request.getAttribute("key");
4.2 . HttpServletRespone
Servlet
的处理方法中将处理结果写入 HttpServletRespone
对象,服务器调用完毕后获得 Respone
结果, 再将其转换为响应报文,返还给客户端。
4.2.1 重定向
void sendRedirect(String val);
4.2.2 Cookie
void addCookie(Cookie val);
4.2.3 设置响应类型和编码
- 会在响应头部添加
Content-Type
,告诉前端响应体当中的内容的类型和编码方式
void setContentType("text/html;charset=UTF-8");
4.2.4 响应体内容输出
PrintWriter getWriter();
5. Servlet 生命周期
当客户端⾸次发送第⼀次请求后,由容器(web
服务器(omcat
))去解析请求, 根据请求找到对应的servlet
,判断该类的对象是否存在,不存在则创建servlet
实例,调取init()
⽅法 进⾏初始化操作,初始化完成后调取service()
⽅法,由service()
判断客户端的请求⽅式,如果是get
,则执⾏doGet()
,如果是post则执行doPost()
.处理⽅法完成后,作出相应结果给客户端.单次请求处理完毕。
当⽤户发送第⼆次以后的请求时,会判断对象是否存在,但是不再执⾏init()
,⽽直接执⾏service
⽅法,调取doGet()/doPost()
⽅法
无参构造
:init
:第一次发送请求的时候才会执行。doGet/ doPost
: 每次请求的时候执行。destroy
: 服务器关闭的时候执行。
6. servlet 初始化参数
6.1 为什么使用初始化参数
- 防止硬编码,比如
request.setCharacterEncoding("UTF-8")
里面的编码指定可以放置到web.xml
中,这样当编码变动的时候,无需修改java
文件重新编译。
6.2 web.xml
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>xxx</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
6.3 servlet 中获取
@Override
public void init(ServletConfig config) throws ServletException {
sout(config.getInitParamter("encoding"));
}
7. 全局初始化参数
全部 servlet
均可获取。
7.1 web.xml
<web-app>
<context-param>
<param-name>zzz</param-name>
<param-value>ccc</param-value>
</context-param>
</web-app>
7.2 获取
@Override
public void init(ServletConfig config) throws ServletException {
sout(config.getServletContext().getInitParamter("encoding"));
}
8. Servlet 3.0 注解
使用注解的方式能省略掉 web.xml
当中的部分的配置的内容。
@WebServlet(urlPatterns = "/user", name = "testAnnoServlet", initParams = {
@WebInitParam(name = "encoding", value = "UT-8")
}, loadOnStartup = 1)
public class TestAnnoServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
String encoding = config.getInitParameter("encoding");
System.out.println(encoding);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost");
}
}
!!注意: 需要使用高版本 servlet-api
, 我在项目当中使用的是 4.0.1
版本。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>