Servlet 简介
Java Servlet
运行在Servlet
容器中,Servlet
容器负责Servlet
和客户端的通信以及调用Servlet
方法,servlet
和客户端的通信采用“请求/响应”的模式。Servlet
功能:
- 创建并返回基于客户请求的动态
html
页面 - 创建可嵌入到现有
html
页面中的部分html
页面 - 与其他服务器资源进行通信
- 创建并返回基于客户请求的动态
Servlet 容器响应客户请求的过程
Servlet
引擎检查是否已经装载并创建了该Servlet
的实例对象- 装载并创建该
Servlet
的一个实例对象:调用该Servlet
的构造器 - 调用
Servlet
实例对象的init()
方法 - 创建一个用于封装请求的
ServletRequest
对象和一个代表响应消息的ServletResponse
对象,然后调用Servlet
的Service()
方法并将请求和响应对象作为参数传递进去 - WEB应用程序被停止或者重新启动之前,
Servlet
引擎将卸载Servlet
,并在卸载前调用Servlet
的destroy()
方法
Servlet 的配置和映射
<servlet>
<!--Servelt 注册的名字-->
<servelt-name>helloServlet</servelt-name>
<!--Servlet 全类名 -->
<servlet-class>io.github.gongfukangEE.helloServlet</servlet-class>
<!-- 指定 Servlet 被创建的时机 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 需要和某一个 servlet 节点的 servlet-name 子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体的访问路径:/ 代表当前WEB的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet 生命周期的方法
- 构造器:只有第一次请求
Servlet
时,创建Servlet
的实例,调用构造器,说明Servlet
是单实例的! init
方法:只被调用一次,在创建好实例后立即被调用,用于初始化当前Servlet
service
方法:被多次调用,每次请求都会调用Service
方法,实际用于请求响应destroy
方法:只被调用一次,当前Servlet
所在的WEB应用被卸载前调用,用于释放当前Servelt
所占用的资源
ServletConfig : 封装了Servlet的配置信息,并且可以获取ServletContext
对象
<!-- 配置 Servlet 的初始化参数 -->
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
<!-- 参数值 -->
<param-value>root</param-value>
</init-param>
- 获取初始化参数
getInitParameter(String name)
:获取指定参数名的初始化参数getInitParameterNames()
:获取参数名组成的Enumeration
对象
ServletContext 接口:
可以由ServletConfig
获取
ServletContext servletContext = servletConfig.getServletContext();
Servlet
引擎为每个WEB应用程序都创建一个对应的ServletContext
对象,ServletContext
对象被包含在ServletConfig
对象中,调用ServeltConfig.getServletContext
方法可以返回ServletContext
对象的引用。<!-- 配置当前应用的初始化参数 --> <context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param>
获取初始化参数:
getInitParameter
getInitParameterNames
获取当前WEB应用的某一个文件的绝对路径
Servlet 与 HTTP
Servlet
的service()
方法用于应答请求:因为每次请求都会调用servic()
方法public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("请求来了!"); }
ServletRequset
:封装了请求信息,可以从中获取到任何请求信息ServletResponse
:封装了响应信息,如果想给用户什么响应,均可以使用该接口的方法实现
ServletRequest
- 获取请求参数
String getParameter(String name)
:根据请求参数的名字,返回参数值(单选)String[] getParameterValues(String name)
:根据请求参数的名字,返回请求参数的字符串数组(多选)Enumeration getParameterNames()
:返回参数名对应的Enumeration
对象Map getParameterMap()
:返回请求参数的键值对- 获取请求的
URI
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest; String requestURI=httpServletRequest.getRequestURI(); System.out.println(requestURI);
- 获取请求的
Servelt
映射路径
String servletPath =httpServletRequest.getServletPath(); System.out.println(servletPath);
ServletResponse
getWriter()
:返回PriterWriter
对象,调用该对象的print()
方法,把peiter()
中的参数直接打印在浏览器上servletResponse.setContentType("application/msword")
设置响应的内容类型,具体类型可在Tomcat/conf/web.xml
文件中查找
GenericServlet
是一个
Servlet
,是Servlet
接口和ServletConfig
接口的实现类,但是一个抽象类,其中的Service
方法为抽象方法,它可以使开发更加简洁public abstract class GenericServlet implements Servlet,ServletConfig{}
HttpServlet
- 继承自
GenericServlet
,针对于HTTP协议所定制 - 在
Service()
方法中直接把ServletRequest
和ServletResponse
转为HttpServletRequest
和HttpServletResponse
,并调用了重载的Service(HttpServletRequest,HttpServletResponse)
,在Service()
方法中获取了请求方式:request.getMethod()
,根据请求方式创建了doGet()
和doPost()
方法等