介绍

JavaEE提供了Servlet API,它封装好了Http请求和响应等一系列功能,并能使用其他Java API
Servlet 由 javax.servletjavax.servlet.http 包创建
https://www.runoob.com/servlet/servlet-intro.html
https://www.liaoxuefeng.com/wiki/1252599548343744/1304265949708322

  • 将Http请求和响应封装

Maven 引入

  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>javax.servlet-api</artifactId>
  4. <version>4.0.1</version>
  5. <scope>provided</scope>
  6. </dependency>

类似Tomcat这样的Web服务器也称为Servlet容器。
Servlet由Servlet容器管理

Servlet对象

Servlet配置

  • 使用配置文件
    • 缺点 导致web.xml文件臃肿
  • 使用注解
    • @WebServlet(_value=”/hello2”)_
    • @WebServlet(“/hello2”)
    • @WebServlet({“/hello3”, “/hello4”})
    • @WebServlet(“/hello/*”)
      • 一个Servlet可以有多个url,一个url不能有多个Servlet

Servlet创建时机

  • 首次访问该 Servlet映射的url 默认
  • 容器启动的时候创建
    • 设置 loadOnStartup >= 0
    • loadOnStartup 越小优先级越大
    • loadOnStartup 默认为-1 即访问时创建

Servlet生命周期

  • 加载Servlet类到虚拟机
  • 创建对象(调用构造方法)
  • 调用初始化方法init
  • 调用Servlet方法处理请求
    • doGet
    • doPost
  • 调用destroy方法销毁Servlet对象

尽量避免在Servlet中使用成员变量
每个用户访问的都是同一个Servlet类实例
可以使用成员常量

HttpServletRequest

  • 获取客户端信息
    • getMethod()
      • 请求类型
    • getRequestURL()
      • URL
    • getRequestURI()
      • URI
    • getQueryString()
      • 查询字符串
    • getRemoteAddr()
      • 客户端IP地址
    • getRemoteHost()
      • 客户端主机名
    • getRemotePort()
      • 客户端端口
  • 获得用户请求数据
    • getParameter(String name)
      • 获得对应参数的值
      • return String
      • 多个值只能取到一个
    • getParameterValues(String name)
      • 获得对应参数的所有值
      • return String[]
    • getParameterNames()
      • 获得所有参数名称
      • return String[]
    • getParameterMap()
      • 获得所有元素索引
      • return Map
  • Post中文乱码问题
    • getCharacterEncoding()
      • 默认字符集为null,即使用系统字符集
    • setCharacterEncoding(“UTF-8”);
      • 需要手动设置字符集
  • 其他方法
    • getContextPath()
      • 得到路径上下文

HttpServletResponse

  • 向客户端输出响应内容
    • getWriter()
      • return PrintWriter
      • 获得字符输出流
    • getOutputStream()
      • return ServletOutputStream
      • 获得字节输出流
    • 字节流和字符流是相互排斥的,不能同时使用
    • 响应内容出现中文乱码问题
      • 设置响应头(Response Headers)的字符集
      • resp.setContentType(“text/html:charset=UTF-8”);

Request转发和重定向

  • 转发
    • req.getRequestDispatcher(String name).forward(req,resp);
    • 转发目标:html,servlet,jsp
    • 请求的数据可以传递给下一个servlet
    • url地址不会发生变化(浏览器没有新请求)
    • /表示项目根目录(webapp)
    • 默认表示相对路径
    • 不能转发到外部URL
  • 重定向
    • resp.sendRedirect(“servlet2_redirect”);
    • 客户端会发送一个新请求
    • 可以重定向到外部URL
    • /表示浏览器根目录(忽略上下文路径)
    • 临时重定向
  • 根目录区别

    • “/servlet”
    • req.getContextPath()+”/servlet”

      ServletContext

      ServletContext在项目启动时创建,且唯一
      可以获取web.xml中的配置信息
      所有Servlet对象都可以访问到
  • 获得ServletContext

    • 通过config
      • init(_ServletConfig _config)
        • config.getServletContext()
    • 通过Request
      • req.getServletContext();
  • 获得web.xml信息
    • getInitParameter(String name)
      • 获得 web.xml 中对应 param-name 的值
  • 设置全局属性
    • setAttribute(String name,Object obj)

ServletConfig

可以为Servlet配置自己的属性

  1. public class servlet4 extends HttpServlet {
  2. private ServletConfig servletConfig;
  3. @Override
  4. public void init(ServletConfig config) throws ServletException {
  5. servletConfig = config;
  6. }
  7. @Override
  8. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  9. resp.getWriter().println(servletConfig.getInitParameter("k1"));
  10. }
  11. }
  12. <servlet>
  13. <servlet-name>servlet4</servlet-name>
  14. <servlet-class>cn.landsall.servlet4</servlet-class>
  15. <init-param>
  16. <param-name>k1</param-name>
  17. <param-value>k1-Value</param-value>
  18. </init-param>
  19. </servlet>

过滤器

@WebFilter属性

属性名 类型 描述
filterName String 指定过滤器的 name 属性,等价于
value String[] 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。
urlPatterns String[] 指定一组过滤器的 URL 匹配模式。等价于 标签。
servletNames String[] 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 的取值。
dispatcherTypes DispatcherType 指定过滤器的转发模式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
initParams WebInitParam[] 指定一组过滤器初始化参数,等价于 标签。
asyncSupported boolean 声明过滤器是否支持异步操作模式,等价于 标签。
description String 该过滤器的描述信息,等价于 标签。
displayName String 该过滤器的显示名,通常配合工具使用,等价于 标签。
  1. //方法一
  2. @WebFilter("/*")
  3. public class AuthFilter implements Filter {
  4. @Override
  5. public void init(FilterConfig filterConfig) throws ServletException {
  6. }
  7. @Override
  8. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  9. HttpServletRequest _request = (HttpServletRequest) request;
  10. HttpServletResponse _response = (HttpServletResponse) response;
  11. //前置操作
  12. request.setAttribute("r1","r1_Value");
  13. //继续执行下一个过滤器或请求
  14. chain.doFilter(request,response);
  15. //后置操作
  16. _response.getWriter().println("Hello World");
  17. }
  18. @Override
  19. public void destroy() {
  20. }
  21. }
  22. //方法二
  23. //web.xml
  24. //映射的顺序影响过滤器的顺序(从前往后)
  25. <filter>
  26. //过滤器名 名字不固定
  27. <filter-name>AuthFilter</filter-name>
  28. //过滤器的完整类名
  29. <filter-class>com.imcode.common.filter.AuthFilter</filter-class>
  30. </filter>
  31. <filter-mapping>
  32. //为过滤器添加映射
  33. <filter-name>AuthFilter</filter-name>
  34. <!-- 所有请求都经过AuthFilter -->
  35. <url-pattern>/*</url-pattern>
  36. <dispatcher>
  37. [ASYNC,REQUEST,INCLUDE,FORWARD,ERROR]
  38. </dispatcher>
  39. <dispatcher>
  40. [ASYNC,REQUEST,INCLUDE,FORWARD,ERROR]
  41. </dispatcher>
  42. </filter-mapping>

匹配方式

  • 绝对路径匹配:以/开头 不包含通配符 * 是一个绝对访问路径。例如:/demo、/index.jsp
  • 目录匹配:以/ 开头,以 结尾。例如:/、/servlet/、/servlet/xxx/
  • 扩展名匹配:不能以/ 开头,也不能以结尾 只能以后缀名结尾 例如:.do、*.demo等

常用实例:

  • 用户登录
  • 网站浏览人数
  • 同一编码

https://blog.csdn.net/u013087513/article/details/56835894

监听器

ServletContext监听器

  • ServletContextListener 监听ServletContext对象
  • ServletContextAttributeListener 监听对ServletContext属性的操作

    1. @WebListener()
    2. public class Listener implements ServletContextListener {
    3. @Override
    4. public void contextInitialized(ServletContextEvent sce) {
    5. }
    6. @Override
    7. public void contextDestroyed(ServletContextEvent sce) {
    8. }
    9. }

    HttpSession监听器

  • HttpSessionListener 监听Session对象

  • HttpSessionAttributeListener 监听Session中的属性操作
  • HttpSessionActivationListener 监听HTTP会话的active和passivate情况
  • HttpSessionBindingListener监听器:感知Session绑定的事件监听器

    1. @WebListener()
    2. public class Listener implements HttpSessionListener{
    3. @Override
    4. public void sessionCreated(HttpSessionEvent se) {
    5. //得到Session
    6. HttpSession session = se.getSession();
    7. }
    8. @Override
    9. public void sessionDestroyed(HttpSessionEvent se) {
    10. }
    11. }

    ServletRequest监听器

  • ServletRequestListener 监听Request对象

  • ServletRequestAttributeListener 监听Requset中的属性操作