Fork me on GitHub

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

选择需要的方法

posted @ 2015-02-03 00:17  森林森  阅读(1430)  评论(0编辑  收藏  举报