Servlet与过滤器
Servlet
Server Applet,是一种服务器端的Java应用程序 只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet
jsp从莫种意义上来说也是一个servlet
创建Servlet
继承HttpServlet类
Servlet中主要方法以及对象
- init():Servlet的初始化方法,仅仅会执行一次
- service():处理请求和生成响应
- destroy():在服务器停止并且程序中的Servlet对象不再使用的时候调用,只执行一次
ServletRequest
封装客户的请求信息 作用相当于JSP内置对象request
ServletResponse
创建响应信息,将处理结果返回给客户端 作用相当于JSP内置对象response
ServletConfig
包含了Servlet的初始化参数信息
Servlet生命周期
生命周期 | 谁来做 | 何时做 |
---|---|---|
实例化 | Servlet 容器 | 当Servlet容器启动或者容器检测到客户端请求时 |
初始化 | Servlet 容器 | 实例化后,容器调用Servlet的init()初始化对象 |
处理请求 | Servlet 容器 | 得到客户端请求并做出处理时 |
销毁 | Servlet 容器 | 当程序中的Servlet对象不再使用的时候,或者Web服务器停止运行的时候 |
部署运行Servlet
- 修改web.xml(部署描述文件)
- 添加<servlet>:把Servlet内部名映射到一个Servlet类名
- 添加<servlet-mapping>:把用户访问的URL映射到Servlet的内部名 <servlet-mapping>与<servlet>中的<servlet-name>必须一致
- 通过URL访问Servlet
配置
代码语言:javascript复制<servlet>
<servlet-name>myServlet3</servlet-name>
<servlet-class>demo.web.servlet.MyServlet3</servlet-class>
</servlet>
Servlet名称唯一
Servlet类所在路径
<servlet-mapping>
<servlet-name>myServlet3</servlet-name>
<url-pattern>/myServlet3</url-pattern>
</servlet-mapping>
与<servlet>的<servlet-name>设置相同
访问Servlet的URL
初始化参数设置
配置<init-param>元素
代码语言:javascript复制<servlet>
……
<init-param>
<param-name>charSetContent</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
读取
代码语言:javascript复制public void init(ServletConfig config) throws ServletException {
String initParam=config.getInitParameter("charSetContent");
System.out.println(initParam);
}
相关对象方法
HttpServletRequest
getParameter() getRequestDispatcher()
HttpServletResponse
sendRedirect()
HttpSession
request.getSession()
过滤器
简述以及作用
- 是向Web应用程序的请求和响应添加功能的Web服务组件
- 过滤器可以统一地集中处理请求和响应
- 使用过滤器技术实现对请求数据的过滤
过滤器的使用步骤
建立实现javax.servlet.Filter接口的类,实现过滤行为 在web.xml中配置过滤器
代码语言:javascript复制doFilter(...) {
//过滤请求
chain.doFilter(request, response); //调用下一个过滤器或Web资源
//过滤响应
}
<filter>
<filter-name>过滤器名</filter-name>
<filter-class>过滤器的完全限定名</filter-class>
</filter>
<filter-mapping>
<filter-name>过滤器名</filter-name>
<url-pattern>过滤器映射的Web资源</url-pattern>
</filter-mapping>
过滤器的生命周期
- 实例化
- 初始化:init()
- 过滤:doFilter()
- 销毁:destroy()
初始化参数
配置
代码语言:javascript复制<filter>
<init-param>
<param-name>Encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
读取
代码语言:javascript复制init(FilterConfig fConfig) {
String encoding=fConfig.getInitParameter("Encoding");
}
新知识点
在servlet-2.3中,Filter会过滤一切请求,包括服务器内部使用forward转发请求和<%@ includefile="/index.jsp"%>的情况。 到了servlet-2.4中Filter默认下只拦截外部提交的请求
在,想过滤其他请求就要这样写
代码语言:javascript复制<filter>
<filter-name>TestFilter</filtername>
<filter-class>anni.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filtername>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>EXCEPTION</dispatcher>
</filter-mapping>
如果是注解就要这样写
@WebFilter(urlPatterns = {"/WEB-INF/*"},dispatcherTypes={DispatcherType.ASYNC,DispatcherType.ERROR,DispatcherType.FORWARD,DispatcherType.INCLUDE,DispatcherType.REQUEST,} )servlet2.3还是2.4大概以tomcat8.5为界限