2 Servlet基础

1. 从浏览器访问Servlet的流程

刚才发现,这里的图片不能正常显示,所以我给个链接,大家可以下载下来看从浏览器访问servlet流程图.png

2. 生命周期

Servlet的一生都是由容器来管理的。

WEB服务器首先会检查是否已经装载并创建了该servlet实例对象。如果是直接进行第④步,否则执行第②步;

装载并创建该Servlet类的一个实例对象(此时该对象还只是一个普通的Java类);

调用Servlet实例对象的init()方法,使Java类成为一个真正的Servlet;

创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用service()方法并将请求和响应作为参数传递进去。service()方法将根据客户端的请求方式来决定调用对应的doXXX()方法;

WEB应用被停止或重启之前,Servlet引擎将卸载Servlet,在卸载之前调用Servlet的destroy()方法。

3. Servlet 开发方法

3.1 Servlet的开发方式

①实现Servlet接口

② 通过继承 GenericServlet

③通过继承 HttpServlet

99%的情况下我们使用的是第三种方式来发开。

3.2 手动开发一个Web应用

前一节中我们Web应用的目录结构,只有按照这个目录结构的规范,tomcat才能正确的解析这些内容。下面我们手动(不用IDE)使用实现Servlet接口的方法来开发并部署一个Servlet应用:

需求:请使用实现Servlet接口的方式,来开发一个Servlet ,要求该Servlet 可以显示Hello,world。

①在Tomcat的webapps下建立一个web应用HelloWorld(即,建立一个名为HelloWorld的文件夹)

② 在HelloWorld下建立 WEB-INF->web.xml [web.xml可以从 ROOT/WEB-INF/web.xml拷贝]

③在WEB-INF 下建立 classes 目录(简单起见我们在这里放Servlet的.java文件和.class文件),建立lib文件夹

④添加Servlet的jar包到环境变量的classpath中

⑤开发HelloWorld.java

 1 package com.yyl;
 2 import javax.servlet.*;
 3 import javax.servlet.http.*;
 4 import java.io.*;
 5 class HelloWorld implements Servlet
 6 {
 7      //该函数用于初始化servlet,就是将该Servlet的Java对象转为Servlet,该函数只会被调用一次
 8      public void init(ServletConfig config) throws ServletException{
 9     }
10
11    //得到ServletConfig对象
12    public ServletConfig getServletConfig(){
13      return null;
14   }
15
16    //该函数是服务函数,我们的业务逻辑代码就是写在这里,该函数每次都会被调用
17    public void service(ServletRequest req,ServletResponse res)  throws ServletException,java.io.IOException{
18        res.getWriter().println("Hello World");
19   }
20
21   //该函数时得到servlet配置信息
22    public java.lang.String getServletInfo(){
23      return null;
24   }
25
26    //销毁该servlet,从内存中清除,该函数被调用一次
27    public void destroy(){
28    }
29 }

现在我们在web.xml文件部署我们的Servlet:

 1 <?xml version="1.0" encoding="ISO-8859-1"?>
 2 <!--
 3  Licensed to the Apache Software Foundation (ASF) under one or more
 4   contributor license agreements.  See the NOTICE file distributed with
 5   this work for additional information regarding copyright ownership.
 6   The ASF licenses this file to You under the Apache License, Version 2.0
 7   (the "License"); you may not use this file except in compliance with
 8   the License.  You may obtain a copy of the License at
 9
10       http://www.apache.org/licenses/LICENSE-2.0
11
12   Unless required by applicable law or agreed to in writing, software
13   distributed under the License is distributed on an "AS IS" BASIS,
14   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   See the License for the specific language governing permissions and
16   limitations under the License.
17 -->
18
19 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
20    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
21    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
22    version="2.5">
23
24     <!--根据serlvet规范,需要将Servlet部署到web.xml文件,该部署配置可以从examples下拷贝-->
25     <servlet>
26         <!--servlet-name 给该Servlet取名, 该名字可以自己定义:默认就使用该Servlet的名字-->
27       <servlet-name>HelloWorld</servlet-name><!--③-->
28         <!--servlet-class要指明该Servlet 放在哪个包下 的,形式是 包/包/../类-->
29       <servlet-class>com.yyl.HelloWorld</servlet-class><!-- 注意:后面不要带.java④-->
30     </servlet>
31         <!--Servlet的映射-->
32     <servlet-mapping>
33           <!--这个Servlet-name要和上面的servlet-name名字一样-->
34         <servlet-name>HelloWorld</servlet-name><!--②-->
35           <!--url-pattern 这里就是将来访问该Servlet的资源名部分-->
36         <url-pattern>/ABC</url-pattern><!--①-->
37     </servlet-mapping>
38 </web-app>

访问页面:

如何使用IDE来开发Servlet应该没必要说明了吧!

3.3 HttpServlet的继承体系

由于GenericServlet极少使用,所以就没有列举,但是HttpServlet中有很多方法都是从它那里继承而来的。

ServletConfig对象

每一个Servlet都有一个ServletConfig对象,它用于在将普通Java类转为Servlet时传递部署时信息;用于访问ServletContext。参数在web.xml文件中配置,如:

1 <servlet>
2       <init-param>
3           <param-name>email</param-name>
4           <param-value>[email protected]</param-value>
5       </init-param>
6 </servlet>

ServletContext

每一个Web应用都有一个ServletContext,用于访问Web应用参数(也在web.xml文件中配置)。

上面这两个对象在以后用到会详细说明,暂时有个印象就可以了。

4. 使用通配符将servlet映射到URL中

前提声明:当映射一个servlet时候,可以多层次,即(用“/”分割),如:

<url-pattern>/servlet/abc/index.html</url-pattern>

通配符有两种格式:

第一种格式 *.扩展名 比如 *.do *.ss

第二种格式 以 / 开头 同时以 /* 结尾 比如 /* 、/news/*

在匹配的时候,要参考的标准:

(1) 看谁的匹配度高,谁就被选择

(2) *.do 的优先级最低

5.  Servlet单例问题

针对多客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象。也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,直至web服务器退出或者reload该web应用,servlet实例对象才会才会销毁(参考Servlet的生命周期)。

当Servlet被第一次访问后,就被加载到内存,以后该实例对各个请求服务。即在使用中是单例,因此会出现线程安全问题。

这里给大家一个原则:

(1)如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制

synchronized (对象){

//同步代码

}

(2)如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义。这样不会存在线程安全问题。

6. 请求和响应易混点

6.1 getServerPort()、getLocalPort()、getRemotePort()

这些是在服务器端调用的,所以相对于服务器来说,远程指的是客户。所以getRemotePort()得到的是客户的端口。

getServerPort() 指的是请求原来发送到那个端口。而  getLocalPort()请求最后发送到那个端口。

6.2 对于输出的两个选择

ServletOuptputStream用于输出字节,PrintWriter用于输出字符。

获取方式:都是把返回类型的第一个词去掉加get。

PrintWriter实际上包装了ServletOutputStream(即PrintWriter有ServletOuptputStream的一个引用)而且会把调用委托给ServletOutputStream。返回给客户的输出流只有一个,但是PrintWriter会装饰这个流,为它增加更高层的"字符友好"方法。

6.3 设置相应首部和增加相应首部

setHeader和addHeader

  • 共同点:当响应中还没有这个首部(方法的第一个参数),他们都会增加这个首部和相应的值。
  • 不同点:如果响应中已经有这个首部,setHeader是用这个值替换原来的值,而addHeader是在原来值的基础上,再加上这个值。

7. 请求转发

两种方法:

  1. 将请求重定向(301)到完全不同的URL。
  2. 把请求分派给Web应用的另一组件。

重定向

servlet调用sendRedirect(string)。请求返回到客户浏览器,浏览器发现响应码为301,立即找到location首部,适应该location的值建立一个新的请求。这是用户会发现浏览器的地址栏已经改变了。

servlet调用的sendRedirect(string) 中的参数string可以是一个表示外部的绝对URL如:http://www.baidu.com。也可以是一个相对的URL。相对URL以"/"开头表示:相对于本次请求的域名或Tomcat的webapp目录。相对URL没有以"/"开头表示:相对于本次请求的上一级目录。

请求分派

request.getRequestDispatcher("所请求的资源名").forward(request,response)。这里的"所请求的资源名"不能加上Web应用的名称,因为请求分派只会在本Web应用中查找该资源。但是可以以斜线("/")开头。

请求分派,请求不会返回浏览器,请求只有一次,并且客户端的浏览器的URL不会发生改变。重定向的请求为两次。

时间: 2024-08-06 07:51:03

2 Servlet基础的相关文章

Servlet基础

Servlet基础 Jsp的本质即为Servlet,jsp页面部署到web容器中后会被编译为Servlet.Servlet使用输出流输出html标签,开发过程复杂且难以进行设计. Servlet是一个完整的java类,jsp是对Servlet的简化.Servlet中没有jsp的内置对象,jsp内置对象需要Servlet显式创建. 在MVC架构中,Servlet已不再作为视图仅仅作为控制器使用. 这里介绍了Servlet开发中所涉及的基础知识以及局部应用范例,Servlet作为控制器的应用介绍请见

JSP数据交互(二)和Servlet基础

01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. 02.在一个应用中只有一个application,每一个用户都会共享这一个application对象. 03.通过统计网站访问次数来讲解application的用法 02.对象作用域 03.Cookie简介 解析:cookie是Web服务器保存在客户端的一系列文本信息,根据域名和端口号区分是否保存成

JavaWeb-07(tomcat与web程序结构与Http协议与Servlet基础)

JavaWeb-07 JavaWeb-tomcat与web程序结构与Http协议与Servlet基础 HTTP协议(记住) 1.http协议:规定了客户端和服务端交流时的数据格式 a. WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议. b. HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程及数据本身的格式. c. HT

JSP/Servlet基础语法

相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html http://blog.csdn.net/liaoxiaohua1981/article/details/6761053 http://computer.c.blog.163.com/blog/static/102524482012314537670/ http://ww

Unit01: Servlet基础 、 HTTP协议

Unit01: Servlet基础 . HTTP协议 在页面上输出当前时间 package web; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import

Servlet基础知识详解

Servlet基础知识详解 Servlet基础知识详解 Servlet程序执行全过程 Servlet映射路径 Servlet映射练习 Servlet生命周期 为什么要学习Servlet生命周期 Servlet重要的生命周期方法 模拟通过反射构造Servlet对象 Servlet单实例多线程 Servlet留给开发者的init方法 Servlet中核心对象学习 HttpServletRequest对象 HttpServletResponse对象 ServletConfig对象 ServletCon

Servlet - 基础

Servlet - 基础 标签 : Java与Web HTTP协议 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器(Browser)和万维网服务器(WebServer)之间互相通信的规则.其主要特点可简单概括如下: 1) 简单快速: 客户端向服务器请求服务时,只需传送请求方法和路径, 因此使得HTTP服务器的程序规模小,通信速度快; 2) 灵活: HTTP允许传输任意类型的数据对象(传输类型由Content-Type控制); 3)

SERVLETJSP学习(一)——Servlet基础 、 HTTP协议

1. Servlet基础 1.1. Web应用的演变 1.1.1. 单机程序 软件从附着于电脑硬件之日起,就在不断的进行着自我完善和演变.从其使用模式的角度出发,可以简单分为单机程序和网络程序.发展到今时今日仍有大量的不依赖网络的单机程序被我们使用,如记事本.Excel.PPT.ZIP压缩等软件都是大家熟知的装机必备软件. 1.1.2. 网络程序 当电脑越来越多的参与到日常生产生活中,单机程序已经不能满足企业的需要.企业级应用要求能够最大程度的让更多的客户端参与到协同办公之中,所以依赖于网络的程

Servlet基础之一:Servlet基本接口与类

1.概述 Servlet API中共有5个包,约113个接口和类: javax.servlet javax.servlet.http javax.servlet.jsp javax.servlet.annotation javax.servlet.descriptor 2.Servlet接口 (1)所有Servlet/JSP应用必须直接或者间接实现Servlet接口, Servlet/JSP容器会将实现了Servlet接口的类加载至容器,以供访问. (2)Servlet中共定义了5个方法: vo

Java web基础总结四之—— Servlet基础

Java web基础总结四之-- Servlet基础 一.什么是Servlet? 通过名字就能看出来,Servlet 就是在服务器上运行的小程序.Servlet是sun公司(现在已经属于oracle了)实现的一门用于开发动态java web资源的技术.Sun公司在其API中提供了一个servlet接口,如果你想开发一个动态的java web资源,需要完成以下2个步骤:编写一个Java类,实现servlet接口.把开发好的Java类部署到web服务器中. Servlet接口已经有了两个默认的实现类