Servlet开发

Servlet简介


  1. Servlet是sun公司提供的一门用于开发动态web资源的技术;
  2. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
    *编写一个Java类,实现Servlet接口。
    *把开发好的Java类部署到web服务器中。

  3. 快速入门,用servlet向浏览器输出“hello servlet”。
    *阅读Servlet API,解决两个问题:
    *输出hello servlet的Java代码应该写在servlet的哪个方法内?
    *如何向火狐浏览器输出数据?

  4. 具体实例:
    *在tomcat服务器中新建一个day04的web应用,在day04中新建WEB-INF\classes目录,在该目录中新建FirstServlet。
    day04目录结构
    其中,FirstServlet.java的代码如下所示:

package cn.itcast;

import java.io.*;
import javax.servlet.*;

public class FirstServlet extends GenericServlet{
    public void service(ServletRequest req,ServletResponse res)throws ServletException,java.io.IOException{
        OutputStream out = res.getOutputStream();
        out.write("hello servlet".getBytes());
    }
}

*在DOS环境下,编译FirstServlet.java
编译FirstServlet.java
此处需要注意:servlet相关的jar包在tomcat服务器的lib文件夹中,需要在FirstServlet.java文件夹位置执行以下语句,找到对应的jar包。

set classpath=%classpath%;H:\Program Files\apache-tomcat-7.0.82\lib\servlet-api.jar

*配置FirstServlet对外的访问路径。在WEB-INF目录中新建web.xml文件,并在该文件中进行配置路径。
这里写图片描述

web.xml中的配置代码如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<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
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">

   <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>cn.itcast.FirstServlet</servlet-class>   
   </servlet>

   <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/FirstServlet</url-pattern>
    </servlet-mapping>

</web-app>

*启动或重启tomcat服务器,在火狐浏览器中访问URL:http://localhost:8080/day04/FirstServlet
网页显示
火狐浏览器版本为:35
httpwatch版本为:9.4.17
到此,该实例结束。


Servlet的运行过程


UML图描述调用过程
这里写图片描述

Servlet程序是由web服务器调用,web服务器收到客户端的Servlet访问请求后:

  1. web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步;
  2. 装载并创建该Servlet的一个实例对象;
  3. 调用Servlet实例对象的init()方法;
  4. 创建一个用于封装HTTP请求信息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去;
  5. web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法;

Servlet接口实现类


  1. Servlet接口,SUN公司定义了两个默认实现类,分别为:
    GenericServlet、HttpServlet。

  2. HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。

  3. HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet方法,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
  4. 阅读HttpServlet API文档。

Servlet的一些细节(1)


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

Servlet的一些细节(2)


  • 同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名;
  • 在Servlet映射到的URL中也可以使用通配符,但是只能有两种固定的格式:一种格式是”.扩展名”,另一种格式是以正斜杠(/)开头并以”/*”结尾;
<servlet-mapping>
    <servlet-name>
        AnyName
    </servlet-name>
    <url-pattern>
        *.do
    </url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>
        AnyName
    </servlet-name>
    <url-pattern>
        /action/*
    </url-pattern>
</servlet-mapping>

Servlet的一些细节(3)


对于如下的一些映射关系:

  • 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的一些细节(4)


  • Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度;
  • 针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,直至web容器退出,servlet实例对象才会销毁;
  • 在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX(doGet或doPost)方法

Servlet的一些细节(5)


  • 如果在元素中配置了一个元素,那么web应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法;
    –举例:
<servlet>
    <servlet-name>invoker</servlet-name>
    <servlet-class>
        org.apache.catalina.servlets.InvokerServlet
    </servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

其中,数字越小,优先级越高;
- 用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库和数据;


Servlet的一些细节(6)


  • 如果某个Servlet的映射路径/仅仅为一个正斜杠(/),那么这个Servlet就成为当前web应用程序的缺省Servlet;
  • 凡是在web.xml文件中找不到配置的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求;
  • 在tomcat的安装目录conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为缺省Servlet;
  • 当访问tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet;

Servlet的一些细节(7)-线程安全


  • 当多个客户端并发访问一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题;
  • 如果某个Servlet实现了SingleThreadModer接口,那么Servlet引擎将以单线程模式来调用其service方法;
  • SingleThreadModel接口中没有定义任何方法,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可;
  • 对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象;
  • 实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的);
  • 如果线程向XXX类的静态list集合中加入了数据(如:aaa),数据使用完后,一般要移除静态集合中的数据(aaa),否则集合中的数据越来越多,就会导致内存溢出(静态成员要谨慎使用);
  • SingleThreadModel被称之为标记接口(没有内容的接口);
  • 子类在覆盖父类的方法时,不能抛出比父类更多的异常;

ServletConfig对象


  • 在Servlet的配置文件中,可以使用一个或多个<>标签为servlet配置一些初始化参数;
  • 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息;
  • 阅读ServletConfig API,并举例说明该对象的作用:
    –获得字符集编码
    –获得数据库连接信息;
    –获得配置文件,查看struts案例的web.xml文件;

  • 在实际开发中,有一些东西不适合在servlet程序中写死,这类数据就可以通过配置方式配给servlet,例如:servlet采用哪个码表、servlet连接哪个库、servlet哪个配置文件


ServletContext


  • web容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象,它代表当前web应用;
  • ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig,getServletContext方法获得ServletContext对象;
  • 由于一个web应用中的所有Servlet共享同一个ServletContext对象,因此多个Servlet对象之间可以通过ServletContext对象来实现数据共享,ServletContext对象通常也被称为context域对象;
  • 查看ServletContext API文档,了解ServletContext对象的功能;

ServletContext应用


  • 由于一个web应用中的所有Servlet共享同一个ServletContext对象,所以多个Servlet通过ServletContext对象实现数据共享。ServletContext对象通常也被称为context域对象;
  • 获取web应用的初始化参数;
  • 实现Servlet的转发;
  • 利用ServletContext对象读取资源文件;
    –得到文件路径
    –读取资源文件的三种方式
    –.properties文件(属性文件 )
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值