6Java Servlet基础

Java Servlet技术的核心就是在服务端创建能响应用户请求的对象,被创建的对象习惯上称为一个Servlet对象。

编写一个创建servlet对象的类就是编写一个特殊类的子类,这个特殊的类就是javax.servlet.http包中HttpServlet类。HttpServlet类实现了Servlet接口,实现了响应用户的方法。HttpSerlet类的子类被习惯地称为一个Servlet类,这样的类创建的对象习惯地被称为一个servlet对象。

1部署servlet

使用Tomcat 5.x后的Tomcat服务器,要求Servlet类必须有包名。然和Bean一样,需要将编译好的字节码复制到与包相应的目录下(\WEB-INF\classes目录下)。

*************************

为了编译Servlet源文件、需要HttpServlet、HttpServletRequest等类。JDK内置中并不包含这些类文件,需要将Tomcat服务器中common/lib目录下的servlet-api.jar文件复制到JDK安装目录的\jre\lib\ext子目录中。

一个Servlet实例:

package star.moon;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class HelloBeijing extends HttpServlet{

public void init(ServletConfig config)throws ServletException{

super.init(config);

}

public void service(HttpServletRequest request,HttpServletResponse response)throws IOException{

response.setContentType("text/html;Charset=GB2312");

PrintWriter out=response.getWriter();

out.println("<html><body>");

out.println("<h2>北京奥运圆满成功!</h2>");

out.println("</body></html>");

}

}

为了能让Tomcat服务器用Servlet字节码文件创建对象,必须为Tomcat服务器编写一个部署文件,该部署文件是一个XML文件,名字是web.xml(WEB-INF目录下),该文件由Tomcat服务器负责管理。使用该xml文件的应用程序(Tomcat服务器)配有内置的解析器,可以解析xml标记中的数据,可以在Tomcat服务器的webapps目录的root目录找到一个web.xml文件,参照它编写自己的web.xml文件。

例web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app>

<servlet>

<servlet-name>hello</servlet-name>

<servlet-class>star.moon.HelloBeijing</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>hello</servlet-name>

<url-pattern>/lookhello</url-pattern>

</servlet-mapping>

</web-app>

一个XML文件应当以XML声明作为文件的第一行,在前面不能有空白、其他的处理指令或注释。XML声明以"<?xml"标识开始,以"?>"标识结束。注意<?与xml之间以及?与>之间不要有空格。如果在XML声明中没有显式地指定encoding属性的值,那么该属性的默认值为UTF-8编码。如果编写XML文件时只准备使用ASCII字符,也可以将encoding属性的值设置为ISO-8859-1。这时XML文件必须使用ANSI编码保存,Tomcat服务器中XML解析器根据encoding属性的值识别XML文件中的标记并正确解析标记中的内容。如果encoding属性的值为UTF-8,XML文件必须按照UTF-8编码来保存。

web.xml文件中标记的具体内容及其作用:

根标记:xml文件必须有一个根标记,web.xml文件的根标记是<web-app>。

<servlet>标记及子标记。<servlet>需要有两个子标记<servlet-name>和<servlet-class>。其中<servlet-name>标记的内容是Tomcat服务器创建的servlet对象的名字。<servlet-class>标记的内容指定Tomcat服务器用哪个类创建servlet对象。

<servlet-mapping>标记及子标记。该标记和<servlet>标记都是根标记的直接子标记。<servlet-mapping>标记需要有两个子标记:<servlet-name>和<url-pattern>,其中<servlet-name>标记的内容是Tomcat服务器创建的servlet对象的名字。<url-pattern>标记用来指定用户用怎样的模式请求servlet对象。如<url-pattern>/lookhello</url-pattern>,那么用户必须通过当前Web服务目录来请求servlet。用户要请求服务器运行servlet对象hello为其服务,那么在浏览器的地址栏应该输入:http://127.0.0.1:8000/ch7/lookhello

一个web服务目录的web.xml文件负责管理该目录下的servlet对象,当该Web服务目录需要提供更多的servlet对象时,只要在web.xml文件中增加<servlet>和<servlet-mapping>子标记即可。

Servlet类可以使用getServletName()方法返回配置文件中<servlet-name>标记给出的servlet的名字。

2servlet的工作原理

Servlet的生命周期

一个servlet对象是javax.servlet包中HttpServlet类的子类的一个实例,又服务器创建并完成其初始化工作。当多个客户请求一个servlet时,服务器为每个客户请求一个servlet时,服务器为每个客户启动一个线程而不是一个进程。

一个servlet对象的生命周期主要由下列三个过程组成:

初始化servlet对象。servlet对象第一次被请求加载时,服务器初始化这个servlet对象,即创建一个servlet对象,这对象调用init方法完成必要的初始化工作。

诞生的servlet对象在调用service方法响应客户的请求。

当服务器关闭时,调用destroy方法,消灭servlet对象。

init方法只被调用一次,即在servlet第一次被请求加载时调用该方法,当后续的客户请求servlet服务时,web服务将为每个客户启用一个新线程,在该线程中,servlet对象调用service方法响应客户的请求。

init方法

方法是HttpServlet类中的方法,可以在Servlet类中重写这个方法。init方法的声明格式:

public void init(ServletConfig config) throws ServletException

该方法在执行时,服务器会把一个ServletConfig类型的对象传递给init()方法,这个对象被保存在servlet对象中, 直到servlet被消灭。ServletConfig对象负责向servlet传递服务设置信息,如果传递失败就会发生ServletException。

service方法

该方法是HttpServlet类中的方法,可以在Servlet类中直接继承该方法或重写这个方法。service方法的声明格式:

public void service(HttpServletRequest request,HttpServletResponse response)throw ServletException,IOException

当servlet对象成功创建和初始化之后,该对象就调用service方法来处理用户的请求并返回响应。服务器将两个参数传递给该方法,一个是HttpServletRequest类型的对象,该对象封装了用户的请求信息;另一个参数对象是HttpServletResponse类型的对象,用来响应用户的请求。每个客户的每次请求都导致service方法被调用执行,调用过程运行在不同的线程中,不同线程的service方法中的局部变量互不干扰。

destroy方法

该方法是HttpServlet类中的一个方法。一个Servlet类可直接继承这个方法,一般不需要重写。destroy方法的声明格式:public destroy()

当服务器终止服务时,destroy()方法会被执行。

3通过JSP页面调用servlet

Web服务目录下的JSP页面都可以通过表单或超链接请求该Web服务目录下的某个servlet。

***通过表单向servlet提交数据***

注意如果servlet的请求格式是/name,那么JSP页面请求servlet时,必须要写成name,不可以写成/name,否则将变成请求root服务目录下的某个servlet。

****该servlet文件就是<url-pattern>/name</url-pattern>处的名字***

例:<FORM action="servlet文件" method=post>....</FORM>

***通过超链接访问servlet***

可以在JSP页面中,单击一个超链接,访问servlet对象。例:<A href="Servlet文件">...</A>

Servlet类是HttpServlet的一个子类,在编写子类时可以声明某些成员变量。那么Servlet类的成员变量被所有请求该servlet的用户共享。

***通过forward动作表来来访问servlert***

<jsp:forward page="要转向的页面或者是servlet"/>

例如

<jsp:forward page="/DBServlet" />

4doGet和doPost方法

HttpServlet类除了init、service、destroy方法外,该类还有两个很重要的方法doGet和doPost,用来处理客户的清求并做出响应。

每当服务器在接收到一个servlet请求时,就会产生一个新线程,在这个线程中servlet对象调用service方法检查HTTP请求类型(get、post等),并在service方法中根据用户的请求方式,对应地调用doGet和doPost方法。

5sendRedirect方法

void sendRedirect(java.lang.String location)方法是HttpServletResponse类中的方法。当用户请求一个servlet时,该servlet在处理数据后,可以使用该方法将用户重定向到一个JSP页面或另一个 servlet。重定向方法仅仅将用户从当前页面或servlet定向到另一个JSP页面或servlet,但不能将用户对当前页面或另一个servlet的请求转发给所定向的JSP页面或servlet。即:重定向的目标页面或servlet对象无法使用request获取用户提交的数据。

6RequestDispatcher对象

RequestDispatcher对象可以把用户对当前JSP页面或servlet的请求转发给另一个JSP页面或servlet。而且将用户对当前JSP页面或servlet的请求和响应传递给所转发的JSP页面或servlet。当前所要转发的目标页面或servlet对象可以使用request获取用户提交的数据。

实现转发有两个步骤:

得到RequestDispatcher对象

用户所请求的当前JSP或servlet可以让HttpServletRequest对象request调用

public RequestDispatcher getRequestDispatcher(java.lang.String path)

返回一个RequestDispatcher对象,其中参数path是要转发的JSP也页面或servlet的地址。

转发

在步骤1中获取RequestDispatcher对象调用下面的方法可以将用户对当前JSP页面或servlet的请求转发给RequestDispatcher对象所指定的JSP页面或servlet。

void forward(ServletRequest request,ServletResponse response)throws ServletExcpetion,java.io.IOException

使用forward的方法必须抛出ServletException。(throws ServletException)

7获取用户的会话

HttpServletRequest对象request调用getSession方法获取用户的会话对象:

HttpSession session=request.getSession(true);

一个用户在不同的servlet对象中获取的session对象是完全相同的。但是不同的用户的session对象互不相同。

例:

package shili;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class ShowLetter extends HttpServlet {

@Override public void init(ServletConfig config) throws ServletException{

super.init(config);

}

@Override public void service(HttpServletRequest request,HttpServletResponse response)throws IOException{

response.setContentType("text/html;charset=GB2312");

PrintWriter out=response.getWriter();

out.println("<html><body>");

out.print("<br>小写希腊字母:");

for(char c=‘a‘;c<=‘w‘;c++){

out.print(" "+c);

}

out.print("<br>大写希腊字母:");

for(char c=‘A‘;c<=‘W‘;c++){

out.print(" "+c);

}

out.println("</body></html>");

}

}

**************************************

如何指定应用事件监听程序

应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。这里只简单地说明用来向Web应用注册一个监听程序的web.xml的用法。

注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内,listener-class元素列出监听程序的完整的限定类名,如下所示:

<listener>

<listener-class>package.ListenerClass</listener-class>

</listener>

虽然listener元素的结构很简单,但请不要忘记,必须正确地给出web-app元素内的子元素的次序。

*******************

listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因为应用生存期监听程序是serlvet规范的2.3版本中的新内容,所以必须使用 web.xml DTD的2.3版本,而不是2.2版本。

servlet版本和jsp版本查看:

找到jsp-api.jar servlet-api.jar解压这两个文件,用记事本分别打开META-INF下的MAINMEFT.MF文件。该文件记录了它们的版本号。

*******************

例如,程序清单5-20给出一个名为ContextReporter的简单的监听程序,只要Web应用的Servlet-Context建立(如装载Web应用)或消除(如服务器关闭)时,它就在标准输出上显示一条消息。程序清单5-21给出此监听程序注册所需要的web.xml文件的一部分。

程序清单5-20 ContextReporterjava

package moreservlets;

import javax.servlet.*;

import java.util.*;

public class ContextReporter implements ServletContextListener {

public void contextInitialized(ServletContextEvent event) {

//ServletContextEvent的实例的getServletContext()方法返回SevletContext对象

ServletContext servletContext = event.getServletContext();

System.out.println("Context created on " +

new Date() + ".");

}

public void contextDestroyed(ServletContextEvent event) {

System.out.println("Context destroyed on " +

new Date() + ".");

}

}

程序清单5-21 web.xml(声明一个监听程序的摘录)

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<!-- ... -->

<filter-mapping> … </filter-mapping>

<listener>

<listener-class>package.ListenerClass</listener-class>

</listener>

<servlet> ... </servlet>

<!-- ... -->

</web-app>

ServletContextListener监听ServletContext。当创建ServletContext时,激发contextInitialized(ServletContextEvent   sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent   sce)方法。

时间: 2024-10-11 17:18:15

6Java 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