A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我的女友叫丹丹 于 2018-9-6 15:27 编辑

servlet的简单运行过程
servlet接口和实现类

对于servlet接口,sun公司定义了两个实现类,分别为:GenericServlet,HttpServlet

HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。  HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。

[Java] 纯文本查看 复制代码
package cn.itcast;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}


URL映射配置

由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。  <servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。 一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。

[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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
                  [url=http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd]http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd[/url]"
           version="3.0">
 <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>cn.itcast.MyServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/test</url-pattern>
  </servlet-mapping>
</web-app>

同一个Servlet可以被映射到多个URL上
[AppleScript] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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
                  [url=http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd]http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd[/url]"
           version="3.0">
 <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>cn.itcast.MyServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/test</url-pattern>
  </servlet-mapping>
<!---->
 <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/aa</url-pattern>
  </servlet-mapping>
</web-app>



Servlet访问URL使用*通配符映射
[XML] 纯文本查看 复制代码
<!--
在Servlet映射到的URL中也可以使用* 通配符,有两种固定的格式:一种格式是*.扩展名,另一种格式是/* 

* 代表任意的字符也就是说所有的URL都会访问到MyServlet上
-->
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>cn.itcast.MyServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
   <url-pattern>/*</url-pattern>
   </servlet-mapping>
     -----------------------------------我是分隔符------------------------------------------
<!--     
对于如下的一些映射关系:
  Servlet1 映射到 /abc/* 
  Servlet2 映射到 /* 
  Servlet3 映射到 /abc 
  Servlet4 映射到 *.do 
问题:
  当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
      Servlet引擎将调用Servlet1。
  当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应
      Servlet引擎将调用Servlet3。
  当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
      Servlet引擎将调用Servlet1。
  当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
      Servlet引擎将调用Servlet2。
  当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
      Servlet引擎将调用Servlet2。
  匹配的原则就是"谁长得更像就找谁"
-->



缺省Servlet

如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。

  凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。 例如:

[XML] 纯文本查看 复制代码
<servlet>
    <servlet-name>ErrorServlet</servlet-name>
    <servlet-class>cn.itcast.ErrorServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <!-- 将ServletDemo2配置成缺省Servlet -->
  <servlet-mapping>
    <servlet-name>ErrorServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

在tomcat的安装目录\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。


下面是tomcat的conf\web.xml文件的部分内容

[XML] 纯文本查看 复制代码
<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>

ServletConfig

当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。






根据上面的图,首先在web.xml里配置MyServlet的初始化参数<init-param>


[XML] 纯文本查看 复制代码
<servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>cn.itcast.MyServlet</servlet-class>

        <!--配置MyServlet的初始化参数 -->
        <init-param>
            <param-name>param01</param-name>
            <param-value>程序员找不到女朋友</param-value>
        </init-param>
        <init-param>
            <param-name>param02</param-name>
            <param-value>还脱发</param-value>
        </init-param>
        <init-param>
            <param-name>param03</param-name>
            <param-value>太可怕</param-value>
        </init-param>
    </servlet>

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



[XML] 纯文本查看 复制代码
package cn.itcast;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                //获取servletConfig对象
        ServletConfig servletConfig = this.getServletConfig();
            //获取初始化参数的值
        String param01 = servletConfig.getInitParameter("param01");
        String param02 = servletConfig.getInitParameter("param02");
        String param03 = servletConfig.getInitParameter("param03");

        System.out.println("param01:" + param01);
        System.out.println("param02:" + param02);
        System.out.println("param03:" + param03);

    }
}



ServletContext

WEB容器在启动时,它会为每个WEB应用程序(就是我们在idea里创建的项目)都创建一个对应的ServletContext对象,它代表当前web应用。  ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。  由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。


在web.xml中配置<context-param>, 可以配置多个


[XML] 纯文本查看 复制代码
 <?xml version="1.0" encoding="UTF-8"?><web-app 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          
[url=http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd]http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd[/url]"          
 version="3.0">
<!-- 配置WEB应用的初始化参数 -->  
  <context-param>      
  <param-name>url</param-name>        
<param-value>jdbc:mysql://localhost:3306/test</param-value>   
 </context-param> <context-param>      
  <param-name>aa</param-name>        
<param-value>haha</param-value>    
</context-param>  
<!--Servlet的配置省略--></web-app>



在任意的一个Servlet里都能获取到<context-param>里的内容


[Java] 纯文本查看 复制代码
package cn.itcast;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        ServletConfig servletConfig = this.getServletConfig();

        String param01 = servletConfig.getInitParameter("param01");
        String param02 = servletConfig.getInitParameter("param02");
        String param03 = servletConfig.getInitParameter("param03");

        System.out.println("param01:" + param01);
        System.out.println("param02:" + param02);
        System.out.println("param03:" + param03);

        //通过servlet对象获取servletContext对象
        ServletContext servletContext = this.getServletContext();
        String url = servletContext.getInitParameter("url");
        System.out.println(url);
        //通过servletConfig对象获取servletContext对象
        ServletContext servletContext1 = servletConfig.getServletContext();
        String aa = servletContext1.getInitParameter("aa");
        System.out.println(aa);
    }
}


1 个回复

倒序浏览

很不错,受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马