Servlet
Contents
servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
servlet的架构如下:
servlet的任务主要有
读取客户端发送的显示的数据,读取客户端发送的隐式的HTTP请求数据,处理数据并生成结果,发送显示的数据到客户端,发送隐式的HTTP响应到客户端.
servlet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
1 | public void service(ServletRequest request, |
1 | public void doGet(HttpServletRequest request, |
1 | public void doPost(HttpServletRequest request, |
一个servlet实例
1 | // 导入必需的 java 库 |
servlet的部署
默认情况下,Servlet 应用程序位于路径<Tomcat-installation-directory>/webapps/ROOT
下,且类文件放在<Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes
中。
如果有一个完全合格的类名称 com.myorg.MyServlet,那么这个 Servlet 类必须位于 WEB-INF/classes/com/myorg/MyServlet.class 中。
然后在web.xml中创建以下条目
1 | <web-app> |
servlet 表单数据
Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:
- getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。
- getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
- getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。
servlet客户端HTTP请求
Cookie[] getCookies()返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。
HttpSession getSession()
返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。
String getCharacterEncoding()返回请求主体中使用的字符编码的名称。
String getMethod()
返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
String getParameter(String name)
以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
String getRequestURI()
从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分
servlet服务端HTTP相应
String encodeRedirectURL(String url)
为 sendRedirect 方法中使用的指定的 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
boolean containsHeader(String name)
返回一个布尔值,指示是否已经设置已命名的响应报头。
void addCookie(Cookie cookie)
把指定的 cookie 添加到响应。
void reset()
清除缓冲区中存在的任何数据,包括状态码和头。
servlet 状态码
下面的方法可用于在 Servlet 程序中设置 HTTP 状态码。这些方法通过 HttpServletResponse 对象可用。
序号 | 方法 & 描述 |
---|---|
1 | public void setStatus ( int statusCode )该方法设置一个任意的状态码。setStatus 方法接受一个 int(状态码)作为参数。如果您的反应包含了一个特殊的状态码和文档,请确保在使用 PrintWriter 实际返回任何内容之前调用 setStatus。 |
2 | public void sendRedirect(String url)该方法生成一个 302 响应,连同一个带有新文档 URL 的 Location 头。 |
3 | public void sendError(int code, String message)该方法发送一个状态码(通常为 404),连同一个在 HTML 文档内部自动格式化并发送到客户端的短消息。 |
servlet 过滤器
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。
当 Web 容器启动 Web 应用程序时,它会为部署描述符中声明的每一个过滤器创建一个实例。
Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
Servlet 过滤器方法
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:
序号 | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain)该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器(此参数的意思是把请求传回过滤链)。 |
2 | public void init(FilterConfig filterConfig)web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 |
3 | public void destroy()Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 |
servlet session
Servlet 还提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象,如下所示:
1 | HttpSession sessin =request.getSession(); |
HttpSession 中的常用方法:
public Object getAttribute(String name)
该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
public void setAttribute(String name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话。
public Enumeration getAttributeNames()
该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
public long getCreationTime()
该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
public String getId()
该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
public void invalidate()
该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
Author: corn1ng
Link: https://corn1ng.github.io/2017/10/24/Servlet/
License: 知识共享署名-非商业性使用 4.0 国际许可协议