Servlet
1.Servlet是什么
Servlet是Java编程语言类,用于扩展服务器的功能,这些服务器承载通过请求-响应编程模型访问的应用程序。尽管Servlet可以响应任何类型的请求,但它们通常用于扩展Web服务器托管的应用程序。对于此类应用程序,Java Servlet技术定义了HTTP特定的Servlet类。
在
javax.servlet
与javax.servlet.http
包写的servlet提供的接口和类。所有servlet必须实现Servlet
定义生命周期方法的 接口。实施通用服务时,可以使用或扩展GenericServlet
Java Servlet API随附的类。本HttpServlet
类提供的方法,如doGet
和doPost
,用于处理特定的HTTP服务。 --摘自官方文档
Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。–摘自维基百科
实际上Servlet就是一个接口。开发web应用时,一般都是继承HttpServlet(因为HttpServlet已经实现了Servlet),并重写doGet和doPost方法。当然前提是要导入Servlet的依赖。创建一个继承HttpServlet的类HelloServlet,下图是它的继承树。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-maE9G3pG-1595479012103)(C:\Users\23062\AppData\Roaming\Typora\typora-user-images\image-20200624185831959.png)]
官方文档地址:https://javaee.github.io/tutorial/toc.html
2.Servlet的作用
Servlet负责接受用户的请求,并处理请求,并将处理后的结果发送给用户(即完成响应)。
Servlet的工作过程参考以下链接:
servlet的本质是什么,它是如何工作的? - 知乎用户的回答 - 知乎 https://www.zhihu.com/question/21416727/answer/690289895
3.Servlet的生命周期
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
这是Servlet的结构,从中可以看出,Servlet的生命周期有三个阶段:
- 初始化
- 进行业务处理
- 销毁
初始化是在客户端请求Servlet所映射的路径时进行的,而进行业务处理是在请求之后,响应之前进行的。销毁是在服务器关闭之后进行的。
4.Servlet的路径映射
①路径映射:在浏览器中为了能访问到servlet等动态资源,需要将其映射为一个可以被访问的路径。
②方法:在web.xml中进行配置
eg:
<servlet>
<!-- 注册名-->
<servlet-name>hello</servlet-name>
<!-- servlet的完整类名-->
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<!--映射一个已注册的Servlet的一个对外访问路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<!--Servlet的对外访问路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
5.doPost方法和doGet方法中的request和response
①:HttpServletRequest:
- getParameter(String s):用于获取前端传来的请求的参数。
- getRequestDispatcher(String path):用于请求转发到某个资源。
- getSession():获得当前的Session对象
- setAttribute(String key, Object value):用于在一次请求中存储value
- getAttribute(String key):根据key取value
- getInputStream():获取输入流
- setCharacterEncoding(String encoding):设置请求的编码类型
②:HttpServletResponse:
- setContectType(String type):设置相应类型
- setCharacterEncoding(String encoding):设置相应的编码类型、
- getWiter():获取输出流
- addCookie(Cookie cookie):在响应中添加cookie对象
- sendRedirct(String path):重定向到某个资源
6. ServletContext对象
①ServletContext简介:
- 服务器会为每个应用创建唯一一个ServletContext对象;(应用内唯一)
- ServletContext对象的创建是在服务器启动时完成的;(出生)
- ServletContext对象的销毁是在服务器关闭时完成的。(死亡)
- ServletContext对象的作用是在整个Web应用的动态资源之间共享数据。(作用)
②获取ServletContext
- 在Servlet中获取ServletContext对象
在
void init(ServletConfig config)
中:ServletContext context = config.getServletContext();
,ServletConfig
类的getServletContext()
方法可以用来获取ServletContext
对象;
- 在GenericeServlet或HttpServlet中获取ServletContext对象
直接使用
this.getServletContext()
来获取;
③ ServletContext对象的作用
ServletContext
是JavaWeb
四大域对象(PageContext
、ServletRequest
、HttpSession
、ServletContext
)之一。- 所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据。
ServletContext
对象用来操作数据的方法
void setAttribute(String name, Object value)
用来存储一个对象,也可以称之为存储一个域属性,
例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。
请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
Object getAttribute(String name)
用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,
例如:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;
void removeAttribute(String name)
用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
Enumeration getAttributeNames()
获取所有域属性的名称;
ServletContext
获取应用初始化参数
(1)Servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备!
(2)可以配置公共的初始化参数,为所有Servlet而用!这需要使用ServletContext才能使用!
(3)还可以使用ServletContext来获取在web.xml文件中配置的应用初始化参数!注意,应用初始化参数与Servlet初始化参数不同。
<web-app ...>
...
<context-param>
<param-name>paramName1</param-name>
<param-value>paramValue1</param-value>
</context-param>
<context-param>
<param-name>paramName2</param-name>
<param-value>paramValue2</param-value>
</context-param>
</web-app>