怎么理解jsp servletcontextt,在Servlet访问过程中什么作用

2010年8月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。64083人阅读
J2EE(44)
在&Servlet API&中有一个&ServletContextListener&接口,它能够监听&ServletContext&对象的生命周期,实际上就是监听&Web&应用的生命周期。
当Servlet&容器启动或终止Web&应用时,会触发ServletContextEvent&事件,该事件由ServletContextListener&来处理。在&ServletContextListener&接口中定义了处理ServletContextEvent&事件的两个方法。
Java代码&&
/**&&*&当Servlet&容器启动Web&应用时调用该方法。在调用完该方法之后,容器再对Filter&初始化,&&*&并且对那些在Web&应用启动时就需要被初始化的Servlet&进行初始化。&&*/&&contextInitialized(ServletContextEvent&sce)&&&&&&&/**&&*&当Servlet&容器终止Web&应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet&和Filter&过滤器。&&*/&&contextDestroyed(ServletContextEvent&sce)&&
&下面通过两个具体的例子来介绍&ServletContextListener&的用法。
例一:在服务启动时,将数据库中的数据加载进内存,并将其赋值给一个属性名,其它的&Servlet&就可以通过&getAttribute&进行属性值的访问。
有如下两个步骤:
1&:&ServletContext&对象是一个为整个&web&应用提供共享的内存,任何请求都可以访问里面的内容&&
2&:如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:&&
1&)&实现&servletContextListerner&接口&并将要共享的通过&setAttribute&(&name,data&)方法提交到内存中去&&&;
2&)应用项目通过&getAttribute(name)&将数据取到&。
Java代码&&
public&class&ServletContextLTest&implements&ServletContextListener{&&&&&&&&&//&实现其中的销毁函数&&&&&&&&&&&&public&void&contextDestroyed(ServletContextEvent&sce)&{&&&&&&&&&&&&&System.out.println(&this&is&last&destroyeed&);&&&&&&&&&&&&}&&&&&&&&&//&实现其中的初始化函数,当有事件发生时即触发&&&&&&&&public&void&contextInitialized(ServletContextEvent&sce)&{&&&&&&&&&&&&&ServletContext&sct=sce.getServletContext();&&&&&&&&&&&&&Map&Integer,String&&depts=new&HashMap&Integer,String&();&&&&&&&&&&&&&Connection&connection=&&&&&&&&&&&&&PreparedStatement&pstm=&&&&&&&&&&&&&ResultSet&rs=&&&&&&&&&&&&&&&&&&&&&&&&&&try{&&&&&&&&&&&&&&&&&connection=ConnectTool.getConnection();&&&&&&&&&&&&&&&&&String&sql=&select&deptNo,dname&from&dept&;&&&&&&&&&&&&&&&&&pstm=connection.prepareStatement(sql);&&&&&&&&&&&&&&&&&rs=pstm.executeQuery();&&&&&&&&&&&&&&&&&while(rs.next()){&&&&&&&&&&&&&&&&&&&&&depts.put(rs.getInt(1),&rs.getString(2));&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&//&将所取到的值存放到一个属性键值对中&&&&&&&&&&&&&&&&sct.setAttribute(&dept&,&depts);&&&&&&&&&&&&&&&&&System.out.println(&======listener&test&is&beginning=========&);&&&&&&&&&&&&&}catch(Exception&e){&&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&&}finally{&&&&&&&&&&&&&&&&&ConnectTool.releasersc(rs,&pstm,&connection);&&&&&&&&&&&&&}&&&&&&&&&}&&&&&}&&
在完成上述编码后,仍需在&web.xml&中进行如下配置,以使得该监听器可以起作用。
&listener&&&&&&&&&&listener-class&ServletContextTest.ServletContextLTest&/listener-class&&&&&&&/listener&&&&&
在完成上述配置后,&web&服务器在启动时,会直接加载该监听器,通过以下的应用程序就可以进行数据的访问。
Java代码&&
public&class&CreateEmployee&extends&HttpServlet{&&&&&&&&&@Override&&&&&&&&&protected&void&service(HttpServletRequest&request,&HttpServletResponse&response)&&&&&&&&&&&&&&&&&throws&ServletException,&IOException&{&&&&&&&&&&&&&ServletContext&sct=getServletConfig().getServletContext();&&&&&&&&&&&&&//&从上下文环境中通过属性名获取属性值&&&&&&&&&&&&Map&Integer,String&&dept=(Map&Integer,String&)sct.getAttribute(&dept&);&&&&&&&&&&&&&Set&Integer&&key=dept.keySet();&&&&&&&&&&&&&response.setContentType(&text/charset=utf-8&);&&&&&&&&&&&&&PrintWriter&out=response.getWriter();&&&&&&&&&&&&&out.println(&&html&&);&&&&&&&&&&&&&out.println(&&body&&);&&&&&&&&&&&&&out.println(&&form&action='/register'&action='post'&&);&&&&&&&&&&&&&out.println(&&table&alignb='center'&&);&&&&&&&&&&&&&out.println(&&tr&&);&&&&&&&&&&&&&out.println(&&td&&);&&&&&&&&&&&&&out.println(&username:&);&&&&&&&&&&&&&out.println(&&/td&&);&&&&&&&&&&&&&out.println(&&td&&);&&&&&&&&&&&&&out.println(&&input&type='text'&name='username'&);&&&&&&&&&&&&&out.println(&&/tr&&);&&&&&&&&&&&&&out.println(&&tr&&);&&&&&&&&&&&&&out.println(&&td&&);&&&&&&&&&&&&&out.println(&city:&);&&&&&&&&&&&&&out.println(&&/td&&);&&&&&&&&&&&&&out.println(&&td&&);&&&&&&&&&&&&&out.println(&&select&name='dept'&);&&&&&&&&&&&&&for(Integer&i:key){&&&&&&&&&&&&&&&&&out.println(&&option&value='&+i+&'&&+dept.get(i)+&&/option&&);&&&&&&&&&&&&&}&&&&&&&&&&&&&out.println(&&/select&&);&&&&&&&&&&&&&out.println(&&/td&&);&&&&&&&&&&&&&out.println(&&tr&&);&&&&&&&&&&&&&out.println(&&/table&&);&&&&&&&&&&&&&out.println(&&/form&&);&&&&&&&&&&&&&out.println(&&/body&&);&&&&&&&&&&&&&out.println(&&/html&&);&&&&&&&&&&&&&out.flush();&&&&&&&&&}&&&&&}&&
例二:书写一个类用于统计当Web&应用启动后,网页被客户端访问的次数。如果重新启动Web&应用,计数器不会重新从1&开始统计访问次数,而是从上次统计的结果上进行累加。
在实际应用中,往往需要统计自Web&应用被发布后网页被客户端访问的次数,这就要求当Web&应用被终止时,计数器的数值被永久存储在一个文件中或者数据库中,等到Web&应用重新启动时,先从文件或数据库中读取计数器的初始值,然后在此基础上继续计数。
向文件中写入或读取计数器的数值的功能可以由自定义的&MyServletContextListener&类来完成,它具有以下功能:
1&、在&Web&应用启动时从文件中读取计数器的数值,并把表示计数器的&Counter&对象存放到&Web应用范围内。存放计数器的文件的路径为helloapp/count/count.txt&。
2&、在Web&应用终止时把Web&应用范围内的计数器的数值保存到count.txt&文件中。
Java代码&&
public&class&MyServletContextListener&implements&ServletContextListener{&&&&&&public&void&contextInitialized(ServletContextEvent&sce){&&&&&&&&System.out.println(&helloapp&application&is&Initialized.&);&&&&&&&&//&获取&ServletContext&对象&&&&&&&&ServletContext&context=sce.getServletContext();&&&&&&&&try{&&&&&&&&&&&//&从文件中读取计数器的数值&&&&&&&&&&&BufferedReader&reader=new&BufferedReader(&&&&&&&&&&&&&&&new&InputStreamReader(context.&&&&&&&&&&&&&&&getResourceAsStream(&/count/count.txt&)));&&&&&&&&&&&int&count=Integer.parseInt(reader.readLine());&&&&&&&&&&&reader.close();&&&&&&&&&&&//&创建计数器对象&&&&&&&&&&&Counter&counter=new&Counter(count);&&&&&&&&&&&//&把计数器对象保存到&Web&应用范围&&&&&&&&&&&context.setAttribute(&counter&,counter);&&&&&&&&&&&}&catch(IOException&e)&{&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&}&&&&&&&}&&&&&&&public&void&contextDestroyed(ServletContextEvent&sce){&&&&&&&&&&&System.out.println(&helloapp&application&is&Destroyed.&);&&&&&&&&&&&//&获取&ServletContext&对象&&&&&&&&&&&ServletContext&context=sce.getServletContext();&&&&&&&&&&&//&从&Web&应用范围获得计数器对象&&&&&&&&&&&Counter&counter=(Counter)context.getAttribute(&counter&);&&&&&&&&&&&if(counter!=null){&&&&&&&&&&&try{&&&&&&&&&&&&&&//&把计数器的数值写到&count.txt&文件中&&&&&&&&&&&&&&String&filepath=context.getRealPath(&/count&);&&&&&&&&&&&&&&filepath=filepath+&/count.txt&;&&&&&&&&&&&&&&PrintWriter&pw=new&PrintWriter(filepath);&&&&&&&&&&&&&&pw.println(counter.getCount());&&&&&&&&&&&&&&pw.close();&&&&&&&&&&&&&}&catch(IOException&e)&{&&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&}&&&&}&&&
将用户自定义的&MyServletContextListener&监听器在&Servlet&容器进行注册,&Servlet&容器会在启动或终止&Web&应用时,会调用该监听器的相关方法。在&web.xml&文件中,&&listener&&元素用于向容器注册监听器:
&listener&&&&listener-class&&ServletContextTest&.MyServletContextListener&listener-class&/&&&&/listener&&&&
通过上述两个例子,即可以非常清楚的了解到&ServletContextListener&接口的使用方法及技巧。
在Container&加载Web&应用程序时(例如启动&Container&之后),会呼叫contextInitialized()&,而当容器移除Web&应用程序时,会呼叫contextDestroyed ()&方法。
通过&Tomcat&控制台的打印结果的先后顺序,会发现当&Web&应用启动时,Servlet&容器先调用contextInitialized()&方法,再调用lifeInit&的init()&方法;
当Web&应用终止时,Servlet&容器先调用lifeInit&的destroy()&方法,再调用contextDestroyed()&方法。
由此可见,在Web&应用的生命周期中,ServletContext&对象最早被创建,最晚被销毁。
原文地址:http://blog.csdn.net/zhaozheng7758/archive//6103700.aspx
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:526102次
积分:6517
积分:6517
排名:第2732名
原创:183篇
转载:80篇
评论:120条
(1)(4)(14)(2)(36)(84)(37)(47)(22)(6)(5)(1)(4)2425人阅读
Java(71)
Servlet基础知识详解
Servlet程序执行全过程
一个Servlet程序要按照以下的步骤进行开发:
* 创建一个Java类并继承HttpServlet类,重写其中的doGet等方法
* 配置web.xml文件,其配置代码如下:
&写创建的类的名字&
&写创建的类的全名(包名+简单类名)&
&写创建的类的名字&
&访问该servlet程序时的URL(例如/first)&
配置tomcat服务器,tomcat启动时会加载webapps目录下的每个web应用的web.xml配置文件
将class文件拷贝到tomcat的WEB-INF/classes目录下(拷贝时包括包名),MyEclipse会自动的加载这些内容到指定的目录中,如果不使用工具,则需要手动的加载。
访问方式: 工程名/first 成功访问说明配置正确。
为什么访问URL会执行到自定义的Servlet类中的方法呢? 会到C:\Windows\System32\drivers\etc\hosts文件中去寻找localhost的对应ip地址127.0.0.1,接着找到8080端口,进入tomcat服务器,接着进入webapps下的Servlet工程下,关键是怎么着/first呢?
在Servlet工程中的web.xml中的url-pattern中查找是否有/first内容,如果有就成功的加载。
首先匹配servlet-mapping中url-pattern中查看,接着得到servlet-mapping中的servlet-name,从而去Servlet中查找servlet-name,从而得到servlet-class,servlet-class才是整个执行过程中最重要的部分。得到servlet-class文件的全名(实际上是一个字符串)之后,构造HttpServlet子类的对象,然后调用子类里面的方法(这个过程使用反射技术,只能通过反射才能实现)。
如果对反射的知识点不明确,请自行找资料解决。
Servlet映射路径
Servlet的映射路径有servlet-mapping中的url-pattern(注意url-pattern要么要以/开头,要么要以*开头)决定,那么url-pattern究竟怎么写,怎么去匹配呢?有两种匹配方案:
精确匹配:/first(url-pattern) 工程名/first (浏览器中输入)
精确匹配的要点是:url-pattern以/开始,并且必须将url-pattern中的内容精确的写上。在精确匹配时要注意坚决不能漏掉/,否则会报错,一定要带有/
模糊匹配,下面三种方式,但是在一个url-pattern中不能组合下面的模糊匹配方式
/* 或者直接使用/
在浏览器中输入:工程/任意路径(不写都行) 但是请注意,在实际写url-pattern时不要使用这两个方式,这两个方式是Servlet的缺省(default)(tomcat服务器内置)路径,该路径可以在conf/web.xml中找到。缺省的Servlet是用于解析web的静态资源文件。
/jpzhu/* 在浏览器中输入:工程/jpzhu/任意路径(不写都行)
*.后缀名(后缀名可以随便取)
在浏览器中输入: 任意路径.后缀名
注意模糊匹配不能组合起来用,只能单个使用,例如:/jpzhu/*.do
如果在浏览器中输入的url有多个Servlet同时被匹配,也就是说模糊匹配和精确匹配都能找到对应的Servlet资源,精确匹配的优先级高(长得最像的优先被匹配),但是要尽量避免这种情况的发生。当以后缀名结尾的模糊匹配,优先级最低。
Servlet映射练习
对于如下的一些映射关系:
Servlet1 映射到/abc/*
Servlet2 映射到/*
Servlet3 映射到/abc
Servlet4 映射到*.do
当请求URL为”/abc/a.html”,此时Servlet1和Servlet2都匹配,该是哪一个被最后匹配呢?Servlet1
当请求URL为”/abc”时,Servlet1、Servlet2、Servlet3都能被匹配,该是哪一个被最后匹配呢?Servlet3
当请求URL为”/abc/a.do”时,Servlet1和Servlet4都能被匹配,该是哪一个被最后匹配呢?Servlet1,因为*.do的优先级是最低的。
当请求URL为”/a.do”时,Servlet2和Servlet4都能被匹配,最后哪一个被正确的匹配呢?Servlet2,因为*.do的优先级最低。
当请求URL为”/xxx/yyy/a.do”时,Servlet2和Servlet4都能被匹配,最后哪一个被正确的匹配呢?Servlet2,因为*.do的优先级最低。
我的理解:这个过程实际上是确实路由的路径,和Rails技术中的路由技术的原则是一样的。
解析URL的顺序:当输入一个URL时,首先会到web.xml文件中查找是否与偶匹配的url-pattern,如果能匹配到url-pattern,则处理,如果不能匹配到,则交给tomcat的default-servlet处理,也就是会去加载静态资源文件。
结论:先找动态资源,后找静态资源。
Servlet生命周期
为什么要学习Servlet生命周期
Servlet程序由tomcat服务器调用,所以有必要去知道究竟怎么去调用,Servlet生命周期就是要去搞明白Servlet对象什么时候去创建?调用什么方法?什么时候Servlet对象被销毁?销毁调用什么方法做了什么事情?Servlet程序的生命周期是由tomcat服务器去控制的。
Servlet重要的生命周期方法
构造方法:创建Servlet对象时调用,所谓的创建Servlet对象是指第一次访问Servlet的时候。Servlet在tomcat服务器中是单实例对象。
init:创建完Servlet对象时调用
service:每次发出请求时调用
destroy:销毁Servlet对象时调用。停止服务器或者重新部署web应用时调用销毁Servlet对象。
模拟通过反射构造Servlet对象
首先说明,该段代码只是对使用反射构造Servlet对象机制的模拟,该段代码并不需要我们自己去写,但是我们需要利用此段代码去明白一下所谓的反射机制。
class clazz = class.forName("com.jpzhutech.servlet.firstServlet");
Object obj = clazz.newInstance();
Method m = class.getDeclareMethod("init",ServletConfig.class)
m.invoke(obj,config);
Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
m.invoke(obj,request,response);
Method m = clazz.getDeclareMethod("destroy",null);
m.invoke(obj,null);
Servlet单实例多线程
Servlet对象会在请求第一次加载时建立该类的对象,只要没有服务器的重新启动或者资源的重新加载,都不会再去创建新的Servlet对象,所以我们可以知道Servlet对象是单实例的,但是一个常识就是不止一个人会发出同样的URL请求,此时只有一个Servlet对象,怎么去做呢?实际上Servlet中有多线程处理逻辑,这些代码也是不需要我们去写的。
Servlet是单实例多线程的,所以我们应该把共享数据和代码块进行同步(使用synchronized关键字进行同步)。
建议在Servlet中尽量不要使用成员变量,如果确实要使用成员变量,必须要同步,而且要尽量缩小同步代码块的范围(因为同步会导致效率变得十分的低下),原则上哪里使用到了成员变量就同步哪里,以避免因为同步而导致的并发效率低下。
Servlet留给开发者的init方法
在Servlet接口以及其实现HttpServlet类中提供给了两个init方法,其函数原型分别如下:
init(ServletConfig config);
实际上看查看Servlet的源代码,你会知道有参数的init方法会调用无参数的init方法,但是当我们重写(@Override)了有参数的init方法会导致tomcat服务器不调用无参数的init方法,实际上这个原理可以在Servlet编程中很方便的验证,因此我们的原则是在无参数的init方法中写我们的初始化逻辑。
Servlet中核心对象学习
HttpServletRequest对象:请求对象,获取http请求信息
HttpServletResponse对象:响应对象,设置响应对象
ServletConfig对象:Servlet配置对象
ServletContext对象:Servlet上下文对象
HttpServletRequest对象
在Http协议的讲解中已经学完。
HttpServletResponse对象
在Http协议的讲解中已经学完。
ServletConfig对象
总之,ServletConfig对象的作用就是去拿参数,和Properties配置文件的功能差不多。
ServletConfig对象的作用
作用:该对象主要是用于加载Servlet的初始化参数。
Servlet初始化参数配置方法
/conf/web.xml中找到对象的Servlet对象,配置&init-param&&/init-param&,该参数就是初始化参数。
自己配置的参数会通被封装到ServletConfig对象中,通过有参数的init方法传入。
使用this.getServletConfig()方法得到ServletConfig对象。这也符合不去覆盖有参数的init方法的原则。getServletConfig()方法是Servlet类自己提供的,我们无需去写。
ServletConfig对象的创建和获取
创建时机:在创建完Servlet对象,在调用init方法之前,服务器会自动的创建。
得到对象:直接从有参数的init方法中得到,在代码中使用this.getServletconfig即可实现。一个wen应用中有多个Servletonfig对象,一个Servlet就对应一个ServletConfig对象
ServletContext对象
ServletContext对象被称为Servlet上下文对象,它表示一个当前的web应用环境,怎么理解呢?一个web应用中有且只有一个ServletContext对象。实际上ServletContext相当于该web应用中的web.xml。
ServletContext的创建和得到
创建时机:加载web应用时创建该对象。并且该对象的创建是早于ServletConfig对象的。
得到对象:从ServletConfig的getServletContext方法得到。
ServletContext对象的核心API
getContextPath()
得到当前web应用的路径,web应用路径说白了就是部署到tomcat服务器上运行的web应用的名称,通常用在请求重定向的资源名称中。
getInitParameter(String name) 得到web应用的初始化参数
getInitParameterNames()
得到web应用的初始化参数
关于得到web应用的初始化参数,我们首先应该明白怎么去配置?同样是在web.xml文件中进行配置
&?xml version="1.0" encoding="UTF-8" ?&
在该子标签下,所有的servlet和servlet-mapping子标签之外,添加配置文件,因为该配置文件是全局的,所以随便写一个Servlet程序都能使用该配置。
&AAA's value&
&BBB's value&
上述两个方法的使用和ServletConfig中的该类方法使用是一样的。
setAttribute(String name,Object object)
和域对象有关的方法,用于保存数据
域对象作用是:保存数据,获取数据,可以在不通的动态资源之间共享数据
几乎天天会用该对象方法
getAttribute(String name)
用于获取共享数据
removeAttribute(String name)
删除共享数据
getRequestDispatcher(String path)
转发(类似于重定向) 其效果上相等于跳转,但是转发只能转发到当前应用内的资源,不能转发到该项目之外的资源,但是重定向能重定向到其他项目的资源中
getRealPath(String path)
如何在web应用中得到该应用的资源文件
getResourceAsStream(String path)
下面的代码展示在一个Servlet应用中重要的文件,其他的文件请自行生成并使用,主要侧重于功能性测试。
TestServletContext.java
package com.jpzhutech.
import java.io.IOE
import java.io.InputS
import java.util.E
import javax.servlet.RequestD
import javax.servlet.ServletC
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
* Servlet implementation class TestServletContext
public class TestServletContext extends HttpServlet {
private static final long serialVersionUID = 1L;
* HttpServlet#HttpServlet()
public TestServletContext() {
* HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//ServletContext servletContext = this.getServletConfig().getServletContext();
ServletContext servletContext = this.getServletContext();//此函数实际上是调用了上面的函数,看其源代码可以知道
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
案例: getContextPath()函数通常在重定向时用到,当我们请求动态资源失败时,经常需要将其定位到一个静态资源文件中,本示例定位到index.html
//response.sendRedirect("/servletcontext/index.html");
//当项目名称发生变化时,我们通常不希望去修改我们的源代码,使用getContextPath函数能够实现不修改源代码的效果
response.sendRedirect(contextPath+"/index.html");
* 获取全局ServletContext参数,所有的Servlet程序都能获得
String initParameter = servletContext.getInitParameter("AAA");
System.out.println(initParameter);
//使用迭代器获取初始化参数,这样我们能够获取到全部的Servlet参数
Enumeration&String& initParameterNames = servletContext.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String nextElement = initParameterNames.nextElement();
String initParameter2 = servletContext.getInitParameter(nextElement);
System.out.println(initParameter2);
* 域对象相关方法,域对象的作用主要是为了保存数据,获取数据,可以在不同的动态资源之间共享数据
* 案例:比如现在有两个Servlet对象,在Servlet1中有name=eric,那么我们怎么将数据共享给Servlet2,
* 在全局配置文件中可以配置参数,这样所有的数据都能被任何的Servlet所共享
* 方案一:可以通过床底参数的形式传递参数,共享数据。局限:只能传递字符串类型
* 方案二:可以通过域对象共享数据,并且可以共享任何类型的数据。那么就在Servlet1中将共享的数据保存在域对象中,
* 然后再Servlet2中在域对象中取出共享的数据,ServletContext是我们接触到的第一个域对象
* 为什么能这么做?原因是在Servlet编程中,ServletContext在一个应用中有且仅有一个,所以不管存在哪里,只要
* 是同一个应用,都能被取到,ServletContext的作用域是整个web应用
* 所有的域对象:HttpServletRequest、ServletContext、HttpSession、PageContext ,这四个都是为了保存数据
* 共享数据,但是它们的作用域是不同的。
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("name", "eric");
//perfect的方案
System.out.println("保存成功");
Student student = new Student("xiaoming",23);
servletContext.setAttribute("student", student);
//保存对象数据
* 转发函数的效果:效果上就是跳转页面,但是与重定向还是有区别的:
* 1. 地址栏:转发的地址栏不会发生变化,但是重定向的地址栏会变化
* 2. 转发只能转发到当前项目中的其它资源,但是重定向可以重定向到任意的资源没有任何的限制
* 3. 转发可以将数据存储到request中,但是如果使用重定向,那么将数据放置在request中是不行的
* 案例:实现从该Servlet跳转到index.html
RequestDispatcher requestDispatcher = this.getServletContext().getRequestDispatcher("/index.html");
//RequestDispatcher requestDispatcher = this.getServletContext().getRequestDispatcher(""); //不能转发到该项目之外的资源中
requestDispatcher.forward(request, response);
//但是该重定向操作,不会改变请求的URL,请求的URL仍然是原来的Servlet,这种重定向比较高端
* 得到指定资源的真实地址getRealPath()
String realPath = this.getServletContext().getRealPath("/index.html");
System.out.println(realPath);
* 将指定的资源作为流输出
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/index.html"); //该方法的作用是将指定的资源作为流输出
int length = 0 ;
byte[] buf = new byte[1024];
while((length=resourceAsStream.read(buf)) != -1){
String string = new String(buf,0,length);
System.out.println(string);
class Student{
public Student(String name, int age) {
this.name =
this.age =
public String getName() {
public void setName(String name) {
this.name =
public int getAge() {
public void setAge(int age) {
this.age =
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
TestServlet.java
package com.jpzhutech.
import java.io.IOE
import javax.servlet.ServletC
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
* Servlet implementation class TestServlet
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
* HttpServlet#HttpServlet()
public TestServlet() {
* HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String name = (String)servletContext.getAttribute("name");
System.out.println(name);
Student student = (Student)servletContext.getAttribute("student");
System.out.println(student);
&?xml version="1.0" encoding="UTF-8"?&
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"&
&AAA's value&
&BBB's value&
&TestServletContext&
&TestServletContext&
&com.jpzhutech.servletcontext.TestServletContext&
&TestServletContext&
&/TestServletContext&
&TestServlet&
&TestServlet&
&com.jpzhutech.servletcontext.TestServlet&
&TestServlet&
&/TestServlet&
index.html
&!DOCTYPE html&
&index.html&
name="keywords" content="keyword1,keyword2,keyword3"&
name="description" content="this is my page"&
name="content-type" content="text/ charset=UTF-8"&
This is my HTML page. &
查看实现源代码需要的jar包都能在此网站中搜到
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:49389次
积分:1610
积分:1610
排名:第19520名
原创:113篇
(4)(11)(12)(4)(8)(18)(5)(8)(29)(21)}

我要回帖

更多关于 servletcontextevent 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信