Servlet - 匹配模式加注解源码分析

147 阅读3分钟

Servlet - 匹配模式加注解源码分析

Servlet - 注解源码分析

  1. urlPatterns 对应 web.xml 的 < url-pattern> </ u rl-pattern>
  2. {"/ok1", "/ok2"} 可以给OkServlet配置多个 url-pattern
  3. 相当于这个@WebServlet(urlPatterns = {"/ok1", "/ok2"}) 代替了 web.xml的配置 底层使用了 反射+注解+IO+集合 来完成一个支撑
  4. 浏览器可以这样访问OkServlet时,可以 http://localhost:8080/servlet/ok1 或者 http://localhost:8080/servlet/ok2
  5. 我们可以根据 @interface WebServlet 源码知道可以配置哪些
  6. 注解方式开发Servlet和 web.xml配置servlet 流程机制是一样
7. @WebServlet 是一个注解 => java基础->注解
8. @WebServlet 源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented => 在javadoc工具生成文档有记录

 /* public @interface WebServlet {
 *     String name() default "";
 *
 *     String[] value() default {};
 *
 *     String[] urlPatterns() default {};
 *
 *     int loadOnStartup() default -1;
 *
 *     WebInitParam[] initParams() default {};
 *
 *     boolean asyncSupported() default false;
 *
 *     String smallIcon() default "";
 *  }
*/




  3. urlPatterns 对应 web.xml 的 <url-pattern></url-pattern>

  4. {"/ok1", "/ok2"} 可以给OkServlet配置多个 url-pattern

  5. 相当于这个@WebServlet(urlPatterns = {"/ok1", "/ok2"}) 代替了 web.xml的配置
     底层使用了 反射+注解+IO+集合 来完成一个支撑

  6. 浏览器可以这样访问OkServlet时,可以 http://localhost:8080/servlet/ok1 或者
     http://localhost:8080/servlet/ok2

  8. 我们可以根据 @interface WebServlet 源码知道可以配置哪些

  web.xml init-param 在注解中,如何指定呢? 

             <param-name></param-name>
             <param-value></param-value>
             </init-param>

     @wenInitParam(name="XX",value="yy") 

多个就{@wenInitParam(name="XX",value="yy")@wenInitParam(name="XX1",value="yy1").。。。。}



 9. 注解方式开发Servlet和 web.xml配置servlet 流程机制是一样

匹配模式

匹配模式可以更加方便和符合业务逻辑来实现需求,是http请求可以更快找到需要的方法 减少服务器的压力 在这里插入图片描述

精确匹配

@WebServlet("/ok/zs")//配置路径 : 访问 servlet: localhost:8080/servlet/ok

目录匹配

@WebServlet("/ok/*")//配置路径 : 访问文件: localhost:8080/servlet/ok/aaa localhost:8080/servlet/ok/bbb

扩展名匹配

@WebServlet(urlPatterns = "*.action")

配置路径 : @WebServlet(".action") 访问文件: localhost:8080/hsp/zs.action localhost:8080/hsp/ls.action 提示: @WebServlet("/.action") , 不能带 / , 否则 tomcat 报错

任意匹配

@WebServlet(urlPatterns = "/") 配置路径 : @WebServlet("/") @WebServlet("/*") 访问文件: localhost:8080/wyx//** 提醒:/ 和 /*的配置,会匹配所有的请求,这个比较麻烦,要避免

具体代码

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * @version 1.0
 */
//精确匹配
@WebServlet("/ok/zs")//配置路径 :
//访问 servlet: localhost:8080/servlet/ok/zs

//目录匹配
@WebServlet("/ok/*")//配置路径 :
//访问文件: localhost:8080/servlet/ok/aaa localhost:8080/servlet/ok/bbb

//扩展名匹配
@WebServlet(urlPatterns = "*.action")

// 配置路径 : @WebServlet("*.action")
// 访问文件: localhost:8080/hsp/zs.action localhost:8080/hsp/ls.action
//提示: @WebServlet("/*.action") , 不能带 / , 否则 tomcat 报错

//任意匹配
@WebServlet(urlPatterns = "/")
//配置路径 : @WebServlet("/") @WebServlet("/*")
//访问文件: localhost:8080/wyx//**
// 提醒:/ 和 /*的配置,会匹配所有的请求,这个比较麻烦,要避免
public class OkServlet5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("okServlet doPost");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("OkServlet5 doGet");
    }
}

注意事项和使用细节

当 Servlet 配置了 "/", 会覆盖 tomcat 的 DefaultServlet, 当其他的 utl-pattern 都匹配不上时 ,都会走这个Servlet, 这样可以拦截到其它静态资源

1、The default servlet for all web applications, that serves static resources. 这个默认的 servlet 是处理静态资源的,一旦拦截,静态资源不能处理

2、当 Servelt 配置了 "/*", 表示可以匹配任意访问路径

3、提示: 建议不要使用 / 和 /*, 建议尽量使用精确匹配

4、优先级遵守: 精确路径 > 目录路径 > 扩展名路径 > /* >

代码示例

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
        <!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>