第十个war包操作详解与url-pattern介绍(第十四天学习j2ee)

164 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第一天,点击查看活动详情


第十个war包上机记录与实验总结
其实这个war包很早就开始做了,之所以现在才进行讲解是因为的确这个有点难理解,这次包的内容分为自己两轮的实验记录


看过我之前文章大家都知道我的习惯,我一般会先打开所有文件,然后进行阅读,先阅读完之后再进行操作
首先看到readme.jsp文件

image.png 然后这边告诉我们,源码文件不是很重要,重要的是xml文件,所以就直接看xml文件吧

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>j2019001001_10_servletURLpatternDiscuss</display-name>
  <servlet>
    <servlet-name>Servlet01</servlet-name>
    <servlet-class>servlet.MyServlet01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet01</servlet-name>
    <url-pattern>/abc/*</url-pattern>
  </servlet-mapping>
   <servlet>
 <servlet-name>Servlet02</servlet-name> 
<servlet-class>servlet.MyServlet02</servlet-class>
  </servlet> 
    <servlet-mapping>
  <servlet-name>Servlet02</servlet-name>
 <url-pattern>/*</url-pattern>
 </servlet-mapping> 
  <servlet>
    <servlet-name>Servlet03</servlet-name>
    <servlet-class>servlet.MyServlet03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet03</servlet-name>
    <url-pattern>/abc</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>Servlet04</servlet-name>
    <servlet-class>servlet.MyServlet04</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet04</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>Servlet05</servlet-name>
    <servlet-class>servlet.MyServlet05</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet05</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

这次的六个java文件,其实内容大同小异,就是

image.png 其中前五个文件模板如下图,只是servlet中的response.getWriter().append(“MyServlet01…”);
跟随文件名而变

image.png

这是第六个文件,其实文件内容并不重要

image.png


第一轮实验记录

那这边开始我们第一轮实验记录,第一轮实验,代码什么都没有改,先直接运行看看效果

image.png

image.png

image.png 在运行到第三个文件之前,输出都是正确的,按照文件名正常输出,但到了MyServlet04,这边的页面显示为02

image.png 第五个与第六个也是显示02.

image.png 这是我们第一轮运行的结果
那么通过readme.jsp文件可以看出,这次war包的重点在于web.xml文件,所以现在对其进行一个更改


xml文件相关更改 我们可以看到,这次xml文件中存在url-pattern 那么<url-pattern.>是什么呢

url-pattern详解 url-pattern是一个标签,与servlet进行配合,servlet容器对url会进行相应的匹配,当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url

1.精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的 servlet了。

2.最长路径匹配。例子:servletA的url-pattern为/test/,而servletB的url-pattern为/test/a/,此 时访问http://localhost/test/a 时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

3.扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action 4. 如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet

精细匹配问题: 那么和这次第十个war包xml文件相对应,我们可以看到以下,servlet02的url-pattern为 /*,那么剩下的就会调用servlet02,不理会其他servlet

 <servlet-name>Servlet02</servlet-name>
 <url-pattern>/*</url-pattern>

括展匹配问题:

我们可以看到servlet04和05的url最后一段包含扩展,容器将会根据扩展选择合适的servlet,那么最后就是选择了02

  <servlet-mapping>
    <servlet-name>Servlet04</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Servlet05</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>

无法找到servlet

我们看MyServletDefault,xml文件中,并没有给他就行配置,所以容器会根据url选择对应的请求资源。这里定义了一个default servlet,所以容器会将请求丢给default servlet

image.png

xml文件的相应更改

通过上面的分析,我们知道web.xml文件需要进行怎么样的更改了,我们需要将这一块注释掉

image.png

下面为改完源码

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>j2019001001_10_servletURLpatternDiscuss</display-name>
  <servlet>
    <servlet-name>Servlet01</servlet-name>
    <servlet-class>servlet.MyServlet01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet01</servlet-name>
    <url-pattern>/abc/*</url-pattern>
  </servlet-mapping>
 <!--   <servlet>
 <servlet-name>Servlet02</servlet-name> 
<servlet-class>servlet.MyServlet02</servlet-class>
  </servlet> 
    <servlet-mapping>
  <servlet-name>Servlet02</servlet-name>
 <url-pattern>/*</url-pattern>
 </servlet-mapping> -->
  <servlet>
    <servlet-name>Servlet03</servlet-name>
    <servlet-class>servlet.MyServlet03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet03</servlet-name>
    <url-pattern>/abc</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>Servlet04</servlet-name>
    <servlet-class>servlet.MyServlet04</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet04</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>Servlet05</servlet-name>
    <servlet-class>servlet.MyServlet05</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet05</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

第二轮实验记录

在更改完xml文件后,我们再次进行运行

image.png

image.png

image.png

image.png

image.png

image.png 我们可以看到,这样每个页面都可以运行正确
实验完成!