Servlet是运行在服务器端的小程序。
JSP会转换为Servlet,在服务器运行的是servlet。
public class className extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp){
};
protected void doPost(HttpServletRequest req, HttpServletResponse resp){
doGet(req,resp);
};
}
作用:
- 读取客户提交的数据。
- 读取浏览器发送的隐式请求数据
- 生成结果(响应)
- 向客户发送显式数据
- 发送隐式的http响应数据
原理:
生命周期:
- 初始化:init()
- 响应请求:service()
- 终止阶段:destroy()
应用输出
生成网页
protected void doGet(HttpServletRequest req, HttpServletResponse resp){
PrintWriter out = resp.getWriter();
resp.setContentType("text/html;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
out.println("<html>");
//...输入出html文本
};
请求转发
RequestDispatcher dispatcher = req.getRequestDispatcher("target.jsp");//请求转发
servlet过滤器
过滤器是客户端与目标资源间的中间层组件,用于拦截客户端的请求与响应信息
作用:
- 正常调用请求资源
- 用修改后的请求信息调用请求资源
- 调用请求的资源,修改请求响应,再将响应发送到客户端
- 禁止调用该资源,将请求重定向到其他的资源,或者返回一个特定的状态码
创建一个过滤器涉及4个基本步骤。
(1) 创建实现Filter接口的类。
(2) 将过滤行为放入doFilter方法。
(3) 调用FilerChain对象的doFilter方法。
调用FilterChain的doFilter方法时,下一个关联的过滤器将被调用。
如果没有其他与Servlet或JSP页面相关联的过滤器,就调用Servlet或JSP本身。
(4) 将过滤器与特定的servlet或JSP页面关联。
使用部署描述文件(web.xml)中的filter元素和filter-mapping元素。
生命周期
生命周期
(1) 创建阶段:当Web应用部署或Web服务器启动后,Web容器会自动在web.xml配置文件中或在注解中找到过滤器配置声明,根据声明标记定义过滤器类,将类定义加载到服务器内存,调用此类的默认构造方法,创建过滤器对象。
(2) 初始化阶段:调用init()方法。传入FilterConfig对象,完成过滤器的初始化工作。init方法只执行一次,以后每次执行过滤方法时,init方法不会执行。
(3) 过滤服务阶段:浏览器向Web服务器发出HTTP请求时,当请求的URL地址符合过滤器地址映射时,首个声明的过滤器的过滤方法doFilter被Web容器调用,完成过滤处理工作。过滤处理完成后执行FilterChain对象的doFilter方法,将请求传递到下一个过滤器,如果已经到过滤器链末端,则传递到请求的Web文档,一般是JSP页面或Servlet。
每次请求符合过滤器配置的URL时,过滤方法都将被执行一次。
(4) 终止阶段:调用destroy()方法。当容器检测到一个Filter对象应该从服务器中移除时,会调用此方法完成Filter对象被销毁前的收尾工作。
例子:中文字符转换器
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "EncodeFilter" ,dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD,
DispatcherType.INCLUDE,DispatcherType.ERROR}
,urlPatterns = {"/*"})//对网站下所有页面进行中文过滤
public class EncodeFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}