zoukankan      html  css  js  c++  java
  • Servlet 容器对URI的处理

    问题
    请求到达server以后,server是怎样处理URI请求资源路径的,在与web.xml文件里的映射进行比对时的原则是什么。

    方案
    针对精确匹配、通配符匹配、后缀匹配三种模式改动web.xml文件里的配置,查看不同比对原则的訪问结果

    步骤
    step1:新建URIServlet.java 文件
    代码例如以下:

    package web;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class URIServlet extends HttpServlet{
        protected void service(HttpServletRequest request,
                HttpServletResponse response)
                throws ServletException,IOException{
            System.out.println("这里是URIServlet的service()方法");
        }
    }
    

    step2:改动web.xml文件
    例如以下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
      <display-name></display-name> 
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
        <servlet-name>uri1</servlet-name>
        <servlet-class>web.URIServlet</servlet-class>
      </servlet>
      <!-- URI匹配,每次仅仅能开放一个servlet-mapping -->
      <!-- 
      <servlet-mapping>
        <servlet-name>uri1</servlet-name>
        <url-pattern>/abc/abc.html</url-pattern>
      </servlet-mapping>
      -->
      <servlet-mapping>
        <servlet-name>uri1</servlet-name>
        <url-pattern>/abc/*</url-pattern>
      </servlet-mapping>
      <!-- 
      <servlet-mapping>
        <servlet-name>uri1</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
       -->
    </web-app>
    

    step3:新建uri.html文件、測试
    例如以下:

    <!DOCTYPE html>
    <html>
      <head>
        <title>uri.html</title>
    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="this is my page">
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
        <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    
      </head>
    
      <body style="font-size:24">
        <h3>请求资源路径的 处理</h3>
        <ul>
          <li style="margin:40px">精确匹配
            <ul>
                <li>url-pattern:/abc/abc.html
                <li><a href="abc.html">abc.html</a>
                <li><a href="abc/abc.html">abc/abc.html</a>
            </ul>
            <li style="margin:40px">通配符匹配
            <ul>
                <li>url-pattern:/abc/*
                <li><a href="abc.html">abc.html</a>
                <li><a href="abc/abc.html">abc/abc.html</a>
            </ul>
            <li style="margin:40px">精确匹配   //注意li/ul的使用,效果例如以下图
            <ul>   
                <li>url-pattern:*.do
                <li><a href="abc.do">abc.do</a>
                <li><a href="abc/abc.do">abc/abc.do</a>
            </ul>
        </ul>
      </body>
    </html>
    

    ==============================
    測试界面例如以下所看到的:
    測试界面

    測试成功时:在Console会输出:
    这里是URIServlet的service()方法
    (出如今Server startup in 36041 ms的以下)


    刚開始測试时,出现一个错误:

    严重: ContainerBase.addChild: start: 
    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/URIServletTest]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1247)
        at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1898)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name uril

    原因:web.xml文件里同一时候包括了多个
    解决方法:每次仅仅开启一个,不用的凝视掉

  • 相关阅读:
    https://scrapingclub.com/exercise/detail_sign/
    https://scrapingclub.com/exercise/basic_captcha/
    https://scrapingclub.com/exercise/basic_login/
    344. 反转字符串(简单)
    142. 环形链表 II(中等)
    面试题02.07.链表相交
    19. 删除链表的倒数第 N 个结点
    24.两两交换链表中的节点
    206.反转链表(简单)
    707.设计链表
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7287215.html
Copyright © 2011-2022 走看看