0
点赞
收藏
分享

微信扫一扫

Servlet--介绍


JSP转译成Servlet

转译方法

假设:jsp文件为:test.jsp;项目名为FirstServlet

1. JSP文件可以放到这两个路径任意一个:WebContent,WebContent\jsp

2. 运行Tomcat

3. 浏览器访问test.jsp:​​​http://localhost:8080/​​​FirstServlet​​/​​test.jsp

        此时会​生成两个文件​:test_jsp.java,test_jsp.class。所在路径如下:

        工作空间路径\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\FirstServlet\org\apache\jsp\

        //注意:通过指定HTML文件的form的action属性为test.jsp也可以生成test_jsp.java和test_jsp.class

转译详细过程​:

​​JSP转译成Servlet详细过程​​

web.xml的url-pattern

简介

        servlet或Filter的url请求匹配规则既不是简单的通配,也不是正则表达式,而是由自己的规则。

servlet

  • 浏览器发起一个url请求后,该请求发送到servlet容器时,容器先会​将请求的url减去当前应用上下文的路径​作为servlet的映射url:比如url是http://10.43.11.143/myapp/kata/detail.html,其应用上下文是myapp,容器会将http://10.43.11.143/myapp去掉,剩下的/kata/detail.html部分拿来做servlet的映射匹配。
  • 这个映射匹配过程有优先顺序:精确路径 > 最长路径 > 扩展名。
  • 有一个servlet匹配成功以后,就不会去理会剩下的servlet了。

Filter​:

  • Filter的匹配规则与servlet一样,但对于filter,不会像servlet那样只匹配一个servlet。
  • 因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。
  • Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。

w eb.xml示例



<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.nau.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>xxxxxx</url-pattern>
<url-pattern>yyyyyyy</url-pattern>
</servlet-mapping>


匹配原则

假设本处有一项目,项目名为myapp,应用上下文(Application Context)为:myapp。

       (Application Context在Tomcat设置,见:)

精确匹配

<url-pattern>中配置的项必须与url完全精确匹配。

如配置信息如下:

<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/kata/detail.html</url-pattern>
<url-pattern>/demo.html</url-pattern>
<url-pattern>/table</url-pattern>
</servlet-mapping>

如下几种url都会被匹配到该servlet

 http://10.43.11.143/myapp/kata/detail.html

 http://10.43.11.143/myapp/demo.html

 http://10.43.11.143/myapp/table            //本处table后不能加/

注意:

http://10.43.11.143/myapp/table/ 是非法的url,不会被当作http://10.43.11.143/myapp/table识别

url后可以跟任意的查询条件,都会被匹配,如:http://10.43.11.143/myapp/table?hello 这个请求就会被匹配到MyServlet。

路径匹配

若匹配信息如下

<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/kata/*</url-pattern>
</servlet-mapping>

url只要前面(myapp之后)的路径是/kata,而后面的路径可以任意。

下面的url都会被匹配。

http://10.43.11.143/myapp/kata/demo.html

 http://10.43.11.143/myapp/kata/test.jsp

 http://10.43.11.143/myapp/kata/test/detail.html

http://10.43.11.143/myapp/kata/action

http://10.43.11.143/myapp/kata/action/

匹配任意url:

<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

/与/*的区别

​​​​




/



/*



匹配



匹配:/**/login, /**/test等

不匹配:/**/login.jsp, /**/test.js等任意有后缀的



匹配所有



覆盖问题



不覆盖任何servlet,只替换了servlet容器中内建的默认servlet。



覆盖所有servlet


扩展名匹配

如果匹配规则如下

<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>

则任何扩展名为jsp(文件名和路径任意)的url请求都会匹配,比如下面的url都会被匹配

http://10.43.11.143/myapp/a/b/c/demo.jsp

http://10.43.11.143/myapp/test.jsp

路径和扩展名匹配无法同时设置

比如下面的三个<url-pattern>都是非法的,若设置,启动tomcat服务器会报错。

<url-pattern>/kata/*.jsp</url-pattern>

<url-pattern>/*.jsp</url-pattern>

<url-pattern>he*.jsp</url-pattern>

另外注意:<url-pattern>/aa/*/bb</url-pattern>        这个是精确匹配,url必须是 /aa/*/bb,这里的*不是通配的含义

匹配优先级

一个url与多个servlet的匹配规则可以匹配时,按照 “ 精确路径 > 最长路径>扩展名”这样的优先级匹配到对应的servlet。

  • 例1:servletA 的url-pattern为 /test,servletB的url-pattern为 /* 。url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。
  • 例2:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*。url为:http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
  • 例3: servletA的url-pattern:*.action ,servletB的url-pattern为 /* 。url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB

特殊项

<url-pattern></url-pattern> 

        这种空串的形式。当上下文的根被请求的时候,它将被调用。

        这与<welcome-file>的方式是不同的,因为这种形式在当任何子目录被请求的时候不会被调用。当你期望一个“首页servlet”的时候,这种URL模式就是适合你的。

<url-pattern>*</url-pattern> 

        不能用这个,否则会出错

Tomcat默认的文件

如果url不指定文件,例如:localhost:8080/test/,则会跳到index.html,index.htm或者index.jsp

Idea


举报

相关推荐

0 条评论