• Servlet一(web基础学习笔记二十)


    一、Servlet简介

      Servlet是sun公司提供的一门用于开发动态web资源的技术。
      Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
      1、编写一个Java类,实现servlet接口。
      2、把开发好的Java类部署到web服务器中。
      按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet

    二、ServletAPI

    三、Servlet的方法

    四、Servlet的运行

    Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
      ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
      ②装载并创建该Servlet的一个实例对象。 
      ③调用Servlet实例对象的init()方法。
      ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应  对象作为参数传递进去。
      ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。 

    五、Servlet生命周期

    其中,加载和实例化,初始化,销毁都只进行一行

     五、Serlvet部署

    5.1、新建类Myservlet3继承HttpServlet

    重写doGet,doPost,destroy(),init方法

    package com.pb.servletdemo;
    
    import java.io.IOException;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Myservlet3 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("doGet方法被调用");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("doPost方法被调用");
        }
    
        /*@Override
        protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            super.service(arg0, arg1);
        }*/
    
        @Override
        public void destroy() {
            System.out.println("Servlet销毁,destroy方法被调用");
        }
    
        @Override
        public void init(ServletConfig config) throws ServletException {
            System.out.println("Servlet初始化,init方法被调用");
            String initParam=config.getInitParameter("charSetContent");
            System.out.println(initParam);
            
        }
    
    }

    5.2、在web.xml中配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>servletdemo</display-name>
      <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>
      <!-- 首先是servlet标签 -->
      <servlet>
      <!-- 指定servlet的名字 可以与建立的servlet名字不一样,别名-->
      <servlet-name>myserlvet</servlet-name>
      <!-- servlet的类名   包名.类名的完整路径-->
      <servlet-class>com.pb.servletdemo.Myservlet3</servlet-class>
      <!-- 初始参数 -->
      <init-param>
      <!-- 设置字符集 -->
      <param-name>charSetContent</param-name>
      <!---->
      <param-value>utf-8</param-value>
      </init-param>
      </servlet>
      <!-- 截获请求 servlet映射-->
      <servlet-mapping>
      <!-- 些servlet-name要与上方的servlet-name名字一样不然会报错 -->
      <servlet-name>myserlvet</servlet-name>
      <!-- 一个servlet可以 有多个url-pattern-->
      <!-- 精确匹配 -->
      <url-pattern>/myservlet3</url-pattern>
      <!-- 加上虚拟目录 -->
      <url-pattern>/demo/myservlet3</url-pattern>
      <!-- 通配符来配置* -->
      <url-pattern>/*</url-pattern>
      <!-- 后缀名来配置 -->
      <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      
    </web-app>

    5.3、精确匹配

    5.4、虚拟目录匹配--可以有多个虚拟目录

    5.5、*通配符

    5.6、后缀名来访问

    六、url-pattern 

    6.1、url-pattern 概述

    <url-pattern>元素,用于把一个Servlet 别名映射为一个URL 访问规则。在Servlet 的配置过程中,我们首先使用servlet 元素中的servlet-name、servlet-class 等子元素把一个Servlet 实现类映射为一个别名,然后再使用servlet-mapping 元素把这个别名映射为一个可以在浏览器中访问的url,我们对Servlet 的访问正是通过这个URL 进行的。而不是通过别名。因此,配置这个URL 是Servlet 配置过程中非常重要的一个环节。那么我们应该如何对这个URL进行配置呢?也就是说url-pattern 有几种配置规则呢?在配置url-pattern 元素的时候,有这样三种规则,分别是精确匹配、目录匹配和后缀匹配。

    6.2、精确匹配

    所谓的精确匹配,就是我们在使用浏览器访问一个 Servlet 的时候,输入的URL 中除了工程名之前的部分之外要和我们在配置Servlet 时,配置的url-pattern 元素要完全一致。比如说,在下面实例中,配置了一个名称为 HelloServlet 的Servlet,它的url-pattern 我们配置为/helloServ , 那么这个配置就是完全匹配的方式。假如说我们这个工程的名字是
    TestServlet,我们的Web 服务器的端口号为8080,那么在浏览器中访问本地的这个Servlet的时候就需要使用这样的URL:http://127.0.0.1:080/TestServlet/helloServ。其中,127.0.0.1 是保留的IP 地址,指代本机,8080 是我们设置的Web 服务器的端口号,TestServlet是我们这个Servlet 所在的Web 项目的名称。而最后面的这个helloServ 就是我们配置的需要完全匹配的Servlet 的URL pattern。

    <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>javaee.sg.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/helloServ</url-pattern>
    </servlet-mapping>

    6.3、目录匹配

    相对于精确匹配,目录匹配是一种相对灵活的配置方式,它以斜杠开始,以星号结尾,并且规定了一个虚拟的目录。为了更加形象的说明这种配置方式,我们仍然以刚才的例子进行说明,比如说刚才的那个Servlet,它的url-pattern 我们就可以使用这种形式进行配置:

    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/helloServ/*</url-pattern>

    在这个url-pattern 中,我们使用了一个虚拟的目录, helloServ,那么我们在访问这个Servlet 的时候输入的URL 就会有多种选择,我们只要保证这个URL 中,除了工程
    名之外的部分以这个虚拟目录helloServ 开始就可以了。比方说,我们可以使用这样的URL 访问这个Servlet:http://127.0.0.1:8080/ TestServlet/helloServ/theServlet。在这个URL中, TestServlet 是这个Web 项目的工程名。 helloServ 是虚拟目录的名称,最后面的theServlet 是我们在访问的时候随机输入的一个名称。这个名称可以替换为其他的名称,比方说替换为thisServlet 或者thatServlet 等等。总之,在工程名TestServlet 之后紧跟虚拟目录的名称就可以了。

    6.4、后缀匹配

    用后缀进行匹配的方
    式。在这种方式中,url-pattern 配置元素只限定了访问Servlet 的后缀名,而对于虚拟目录、名称都没有要求。比方说,我们再把刚才配置的Servlet 做一个修改,在url-pattern 中采用后缀匹配的规则进行配置。大家看这段代码:

    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    在这个配置当中,我们限定了访问这个Servlet 的后缀名是”.do”。也就是说,当我们的URL 中的服务器地址,端口号,工程名这些项没有错误的情况下,只要url 以”.do”结尾,就
    能够访问到我们的这个Servlet。比方说,在访问我们这个别名为 HelloServlet 的Servlet的时候,URL 可以写为这样的形式:http://127.0.0.1:8080/ TestServlet/helloServ.do。大家可以看到,在这个URL 的前半部分是IP 地址、端口号和项目名称。并且这个URL 以.do 结尾,因此就可以访问到HelloServlet。或者,我们也可以把这个URL 写为这样的形式,都是可以的:http://127.0.0.1:8080/ TestServlet/theServlet.do。

    6.5、注意事项

    在配置 Servlet 的过程中,大家需要注意的另外一点就是一个Servlet 配置元素可以同时对应多个Servlet-mapping 元素, 比方说,我们仍然以刚才所介绍的HelloServlet 为例,大家看这段代码:

    <servlet-mapping>
    <servlet-name> HelloServlet </servlet-name>
    <url-pattern>/helloServ</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    <servlet-name> HelloServlet </servlet-name>
    <url-pattern>/helloServ/* </url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    <servlet-name> HelloServlet </servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    在这段代码中,我们为别名为HelloServlet 的Servlet 配置了3 个servlet-mapping 元素。既然我们可以为同一个Servlet 同时配置多个servlet-mapping,那么当客户端在访问这个servlet 的时候,servlet 容器是按照一个什么样的顺序来查找servlet 的呢?当为同一个Servlet 配置了多个servlet-mapping 的时候,servlet 容器首先将按照精确
    匹配的方式进行匹配查找,如果匹配完成,则结束匹配,而如果匹配不成功就按照目录匹配、后缀匹配的顺序继续进行匹配查找,如果有多个目录匹配方式的配置项,则按照最长的一个来匹配。同时,在进行匹配的时候同样要看请求的URL,如果这个URL 以斜线结尾,那么这个请求将会按照目录匹配的方式来进行处理

    七、在eclipse中创建Servlet

    选择需要的方法

  • 相关阅读:
    【试水CAS-4.0.3】第07节_CASclient配置单点登录
    30分钟,让你彻底明白Promise原理
    【你离硅谷只差一步】网易中国创业家大赛项目火热征集中
    21分钟学会写编译器
    Android 模拟器下载、编译及调试
    GitLab 自动触发 Jenkins 构建
    微服务监控探索
    感觉要火!妹子实地采访网易猪厂程序员七夕怎么过
    延迟任务调度系统—技术选型与设计(下篇)
    使用QUIC
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4268737.html
Copyright © 2020-2023  润新知