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

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

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>


目录
相关文章
|
3天前
|
XML 数据格式
XML配置Servlet文件,不使用注解配置路径的方法
XML配置Servlet文件,不使用注解配置路径的方法
|
10天前
|
Java 应用服务中间件 开发工具
基于Servlet的3.1以上注解方式完成上传功能。
基于Servlet的3.1以上注解方式完成上传功能。
7 0
|
2月前
Servlet3.0+环境下使用注解注册Servlet、Filter和Listener组件
Servlet3.0+环境下使用注解注册Servlet、Filter和Listener组件
47 2
|
2月前
|
XML Java 应用服务中间件
SpringMVC与Servlet3.0整合 - ServletContainerInitializer注解配置项目
SpringMVC与Servlet3.0整合 - ServletContainerInitializer注解配置项目
27 1
|
2月前
|
前端开发 Java 容器
SpringBoot中注册Servlet、Filter和Listener(代码和注解两种方式)
SpringBoot中注册Servlet、Filter和Listener(代码和注解两种方式)
82 0
|
11月前
|
XML 数据格式
告别web.xml映射Servlet、Filter、Listener,解锁注解新方式开发
告别web.xml映射Servlet、Filter、Listener,解锁注解新方式开发
QGS
|
Java
浅谈入门Servlet注解式开发
Servlet3.0版本之后,推出了Servlet基于注解式开发。
QGS
68 0
|
应用服务中间件
Tomcat - 源码分析Tomcat是如何处理一个Servlet请求的
Tomcat - 源码分析Tomcat是如何处理一个Servlet请求的
66 0
QGS
|
Java
浅谈入门Servlet注解式开发
servlet3.0版本之后,推出了Servlet基于注解式开发。 优点:开发效率高,直接在java类上使用注解进行标注
QGS
67 0