servlet
servlet学习大纲:
1.servlet概念及相关接口简介
2.servlet执行过程
3.servlet路径映射
4.缺省servlet 应用
5.servlet生命周期(重点)
6.servlet自动加载
7.servlet线程安全
8.servletConfig对象
9.servlet相关接口详解
10.servletContext对象 知识点
1.如何开发一个servlet
1.1步骤:
1.编写一个java类,继承httpservlet
2.重写doget/dopost方法
3.servlet程序交给tomcat服务器运行
1.servlet程序的class码拷贝到WEB-INF/classes目录
2.在web.xml文件中进行配置
1 <servlet> 2 <!--配置一个servlet--> 3 <description></description> 4 <!--servlet内部名称,自定义,尽量有意义--> 5 <display-name>response_location</display-name> 6 <servlet-name>response_location</servlet-name> 7 <!-- servlet的类全名,包名加简单类名 --> 8 <servlet-class>com.http.response.response_location</servlet-class> 9 </servlet> 10 <!-- servlet映射配置 --> 11 <servlet-mapping> 12 <!--servlet内部名称,要和上边保持一致--> 13 <servlet-name>response_location</servlet-name> 14 <!--servlet的映射路径(访问servlet的名称)--> 15 <url-pattern>/response_location</url-pattern> 16 </servlet-mapping>
问题:访问 url:http://localhost:8080/项目名/uri
tomcat启动时,首先加载webapp的每个web应用中的web.xml配置文件
http:// :http协议
localhost:到本地的hosts文件中查找是否存在该域名对应的IP地址
8080: 找到tomcat服务器
/项目名: 在tomcat的webapp目录下找项目名称的目录
/uri: 资源名称
1.在项目的web.xml中查找是否有匹配的url-pattern的内容(uri)
2.如果找到了url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否有名称一样的servlet配置
3.如果找到,则取出对应的servlet配置信息中的servlet-class内容
通过反射:
构造类的对象
然后调用类里面的方法
2.servlet的映射路径
精确匹配
url-pattern:/first
浏览器输入: http://localhost:8080/项目名/first
url-pattern:/java/first
浏览器输入:http://localhost:8080/项目名/java/first
模糊匹配
url-pattern 浏览器输入
*.后缀名 http://localhost:8080/项目名/任意路径
/java/* http://localhost:8080/项目名/任意路径
*.do http://localhost:8080/项目名/任意路径.do
/* http://localhost:8080/项目名/任意路径
*.action
*.html(伪静态)
1. 精确匹配与模糊匹配同时存在时,优先精确匹配 (长得最像)
2.以后缀名结尾的模糊url-pattern优先级最低
/* servlet的缺省路径
servlet的缺省路径是在tomcat服务器内置的一个路径。改路径对应的是一个defaultServlet(缺省的servlet)这个缺省的servlet的作用是解析web应用的静态资源文件
问题:URL输入 http://localhost:8080/项目名/uri 如何读取文件
1.到当前项目应用下的web.xml文件,查找是否有匹配的url-pattern
2.如果没有匹配的url-pattern,则交给tomcat的内置servlet处理
3.defaultServlet程序到项目应用的根目录下查找是否存在一个名为index.html静态文件
4.如果找到该文件,则读取该文件的内容,然后返回给浏览器
5.如果找不到文件,则返回404错误页面
结论:先找动态资源,再找静态资源
servlet的生命周期(重点)
4.1引入
servlet的生命周期:servlet类的对象什么时候创建,调用什么方法,什么时候销毁。
以前的对象,new Student() 调用方法 销毁,置其为空
servlet程序的生命周期由tomcat服务器控制
4.2servlet重要的生命周期:
GenericServlet 没有任何协议(但是是HttpServlet的父类)及没有http协议,没有doget/dopost
1 package com.java.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class ServletLife extends HttpServlet{ 12 /** 13 * 1.构造方法 14 */ 15 public ServletLife(){ 16 System.out.println("1.servlet对象被创建了"); 17 18 } 19 /** 20 * 2.init方法 21 */ 22 @Override 23 public void init() throws ServletException { 24 // TODO Auto-generated method stub 25 super.init(); 26 } 27 28 @Override 29 public void init(ServletConfig config) throws ServletException { 30 System.out.println("2.init 方法被调用"); 31 super.init(config); 32 } 33 34 @Override 35 protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { 36 System.out.println("3.service 方法被调用"); 37 } 38 39 @Override 40 public void destroy() { 41 System.out.println("4.destory销毁方法被调用,servlet对象已经被销毁"); 42 } 43 44 }
运行结果:
第一次
1 1.servlet对象被创建了 2 2.init 方法被调用 3 3.service 方法被调用
第二次
1 1.servlet对象被创建了 2 2.init 方法被调用 3 3.service 方法被调用 4 3.service 方法被调用
对比显示:servlet对象被创建一次,init方法被调用一次
访问一次servlet,service方法被调用一次
停掉服务器或者重新部署
1 4.destory销毁方法被调用,servlet对象已经被销毁
构造方法:创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建对象,只调 用一次,证明servlet对象在tomcat中是单实例的
init方法:创建完servlet对象的时候调用,只调用一次
service方法:每次发出请求时调用,调用多次
destory方法:销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象,调用多次
4.3伪代码演示servlet的生命周期
1.通过映射找到servlet-class的内容 字符串:com.java.servlet.ServletLife
2.通过反射构造ServletLife对象
2.1得到字节码对象
Class clazz = clazz.forName("com.java.servlet.ServletLife");
2.2调用无参数的构造方法来构造对象
Object obj = clazz.newInstance(); ------1.servlet的构造方法被调用
3.创建servletConfig对象,通过反射调用init方法
3.1得到方法对象
Method m = clazz.getDeclareMethod("init",ServletConfig.class);
3.2调用方法
m.invoke(obj,config); ------2.servlet的init方法被调用
4.创建request,response对象,通过反射去调用service方法
4.1得到方法对象
Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
4.2调用方法
m.invoke(obj,request,response); --------3.servlet的service方法被调用
5.当tomcat服务器停止或者web应用重新部署,通过反射调用destory方法
5.1得到方法到的对象
Method m = clazz.getDeclaredMethod("destory",nulll);
5.2调用方法
m.invoke(obj,null); ---------------4.servlet的destory的方法被调用
4.4用时序图来演示servlet的生命周期
5.
默认情况下,在第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了较多的逻辑代码,那么导致用户第一次访问servlet的时候比较慢‘
改变servlet创建的时机,提前到加载web应用的时候!!!
在servlet的配置信息中,加上一个<load-on-startup>即可
开启服务器时,加载应用,创建对象,提高用户体验
1 <servlet> 2 <description></description> 3 <display-name>test</display-name> 4 <servlet-name>test</servlet-name> 5 <servlet-class>com.java.servlet.ServletLife</servlet-class> 6 <!-- servlet对象的创建提前到加载web应用的时候 数字越大,优先级越低--> 7 <load-on-startup>1</load-on-startup> 8 </servlet> 9 <servlet-mapping> 10 <servlet-name>test</servlet-name> 11 <url-pattern>/test</url-pattern> 12 </servlet-mapping>
servlet的init方法:
servlet有参数的init方法,该方法是servlet的生命周期方法,一定会被tomcat服务器调用,在有参数的init方法中,调用了无参数的init方法;如果有参数的init方法被覆盖,则无参数的init方法不会被调用,除非覆盖方法里面写了调用无参数的构造方法;如果要编写初始化代码。不覆盖有参数的init方法
servlet无参数的init方法,该方法是servlet的编写初始化代码的方法。是sun公司设计出来进行覆盖,然后在里面编写servlet的初始逻辑代码的方法
8.servlet对象在tomcat中是单实例的,但是可以调用多次service方法,而且互不干扰,所以肯定用了多线程;所以servlet是单实例多线程的 第三方
servlet在tomcat中的运行机制:
上面的first对象为servlet对象,为同一个对象,但是上面的request和response对象是一次请求一个对象,是互不相同的
关于线程安全:servlet是单实例多线程,因为两个first是同一个实例,所以,有公共的数据域存在,如果两个线程同时访问同一个数据域,可能会引发多线程问题
1 package com.java.thread; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 /** 10 * Servlet implementation class Safe_thread 11 */ 12 public class Safe_thread extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 15 /** 16 * @see HttpServlet#HttpServlet() 17 */ 18 public Safe_thread() { 19 super(); 20 // TODO Auto-generated constructor stub 21 } 22 int count=1; 23 24 /** 25 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 26 */ 27 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 response.setContentType("text/html;charset=utf-8");; 29 // int count=1; 30 response.getWriter().write("你是本网站的第"+count+"个访客");//线程1执行到这里,下面代码还没有执行,线程2来了,此时,线程1和线程2 的count值是一样的 31 try { 32 Thread.sleep(5000); 33 } catch (InterruptedException e) { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 } 37 38 39 count++; 40 41 response.getWriter().append("Served at: ").append(request.getContextPath()); 42 } 43 44 45 }
用不同的浏览器进行访问
解决方案:加锁(所用当前类对象的字节码)
建议:在servlet类中尽量不要使servlet类的成员变量,如果确实要使用成员变量,必须要同步,而且要尽量缩小同步代码块的范围(若出现同步代码块,则当一个线程访问同步代码块的时候,其他线程是不能访问同步代码块,影响并发效率)哪里使用到了成员变量,就同步哪里,以避免因为同步而导致并发的效率降低
1 package com.java.thread; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 /** 10 * Servlet implementation class Safe_thread 11 */ 12 public class Safe_thread extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 15 /** 16 * @see HttpServlet#HttpServlet() 17 */ 18 public Safe_thread() { 19 super(); 20 // TODO Auto-generated constructor stub 21 } 22 int count=1; 23 24 /** 25 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 26 */ 27 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 29 synchronized (Safe_thread.class) { 30 response.setContentType("text/html;charset=utf-8");; 31 // int count=1; 32 response.getWriter().write("你是本网站的第"+count+"个访客");//线程1执行到这里,下面代码还没有执行,线程2来了,此时,线程1和线程2 的count值是一样的 33 try { 34 Thread.sleep(5000); 35 } catch (InterruptedException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 40 41 count++; 42 43 response.getWriter().append("Served at: ").append(request.getContextPath()); 44 } 45 46 47 } 48 49 50 }
servlet学习:
HttpServletRequest 请求对象:获取请求信息
HttpServletResponse 响应对象:设置响应对象
ServletConfig 对象 Servlet配置对象
ServletContext 对象 Servlet的上下文对象
所有web应用动态资源都是在web.xml文件进行配置,servlet信息封装到servletConfig对象中
9.ServletConfig对象
9.1作用:该对象主要是用于加载servlet的初始化参数 一个web应用中可以存在多个servletConfig对象(一个servlet对应一个servletConfig)
9.2对象创建和得到:
创建的时机:在创建完servlet对象之后,调用init方法之前
得到对象:直接从有参数的init方法中可以得到。。。
9.3 servlet的初始化参数配置
servletConfig API:
getinitParameter(String name) 根据参数名获取参数值 web文件中的参数,与web应用不同
getInitParameterNames() 获取所有的参数
getServletContext() 得到servlet的上下文
getServletNames() 得到Servlet的名称
servletConfig
class文件
1 package com.java.config; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileReader; 6 import java.io.IOException; 7 import java.util.Enumeration; 8 9 import javax.servlet.ServletConfig; 10 import javax.servlet.ServletContext; 11 import javax.servlet.ServletException; 12 import javax.servlet.http.HttpServlet; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 16 17 /** 18 * Servlet implementation class ConfigDemo 19 */ 20 public class ConfigDemo extends HttpServlet { 21 // /** 22 // * 1.tomcat服务器把这些参数会加载在web应用中,封装到ServletConfig对象中 23 // * 2.tomcat服务器调用init方法传入servletConfig对象 24 // */ 25 // public ServletConfig config; 26 // @Override 27 // public void init(ServletConfig config) throws ServletException { 28 // this.config= config; 29 // 30 // } 31 // 32 // 33 34 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 35 36 37 /** 38 * 读取servlet的初始化参数 39 */ 40 String path = this.getServletConfig().getInitParameter("path"); 41 42 File file = new File(path); 43 //读取内容 44 BufferedReader br = new BufferedReader(new FileReader(file)); 45 String str = null; 46 while((str=br.readLine())!=null){ 47 System.out.println(str); 48 } 49 50 51 /** 52 * 查找当前所有的servlet初始化参数 53 * 54 */ 55 56 Enumeration<String > names = this.getServletConfig().getInitParameterNames(); 57 58 while (names.hasMoreElements()) { 59 String string = (String) names.nextElement(); 60 System.out.println("参数名:"+string +"参数值:"+this.getServletConfig().getInitParameter(string)); 61 } 62 //拿到servlet的名称 63 String servletName = this.getServletConfig().getServletName(); 64 System.out.println(servletName); 65 66 //servletContext 67 ServletContext context = this.getServletConfig().getServletContext(); 68 69 70 71 response.getWriter().append("Served at: ").append(request.getContextPath()); 72 } 73 74 75 }
web文件
1 <servlet> 2 <description></description> 3 <display-name>ConfigDemo</display-name> 4 <servlet-name>ConfigDemo</servlet-name> 5 <servlet-class>com.java.config.ConfigDemo</servlet-class> 6 <!-- 初始化参数 。这些参数在加载web应用的时候封装到ServletConfig对象中--> 7 <init-param> 8 <param-name>path</param-name> 9 <param-value>e:\Contact.xml</param-value> 10 </init-param> 11 <init-param> 12 <param-name>path1</param-name> 13 <param-value>测试1</param-value> 14 </init-param> 15 <init-param> 16 <param-name>path2</param-name> 17 <param-value>测试2</param-value> 18 </init-param> 19 <init-param> 20 <param-name>path3</param-name> 21 <param-value>测试3</param-value> 22 </init-param> 23 </servlet> 24 <servlet-mapping> 25 <servlet-name>ConfigDemo</servlet-name> 26 <url-pattern>/ConfigDemo</url-pattern> 27 </servlet-mapping>
测试结果:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <contactList> 4 <contact id="58"> 5 <name>閽為洩</name> 6 <gender>濂?/gender> 7 <age>34</age> 8 <phone>123456</phone> 9 <email>12542.qq.com</email> 10 <QQ>124569</QQ> 11 </contact> 12 </contactList> 13 参数名:path2参数值:测试2 14 参数名:path1参数值:测试1 15 参数名:path3参数值:测试3 16 参数名:path参数值:e:\Contact.xml 17 ConfigDemo
sun公司的设计:
1.创建servletContext对象 ServletContext servletCotext = new ServletContext()
2.创建servletConfig对象 servletConfig config = new ServletConfig()
config.setServletContext(context);
1 class ServlerConfig{ 2 servletContext context; 3 public ServletContext getServletContext(){ 4 return this.context; 5 } 6 }
10 servletContext
10.1 servletContext对象,叫做servlet的上下文对象,表示一个当前的web应用环境
一个web应用中只有一个servletConfig对象
10.2 对象创建时间和得到
创建时间:加载web应用时去创建servletContext对象
得到对象:从servletConfig的getServletContext方法得到
10.3 servletContext 核心api
getContextPath() -------得到当前web应用的路径 用在请求重定向的路径资源中
getInitParameter(String name) ----------得到web应用的初始化参数
getInitParameterNames()
域对象有关的方法
setAttribute(String name,Object object) ---------------保存数据
getAttribute(String name) ------------------------获取数据
removeAttribute(String name) --------------------从域对象中删除数据,如果不删除,则数据一直存在
域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据
案例:
servlet1 servlet2
name=nanami
response.sendRedirect("/servlet2?name=nanami") String name = nanami
方案1:可以通过传递参数的形式,共享数据。局限:只能传递字符串类型。
方案2:可以使用域对象来共享数据。好处:可以共享任何类型的数据!!!!
servletContext就是一个域对象
扩展:
所有域对象(范围不一样):
HttpServletRequest 域对象
ServletContext· 域对象
HttpSession 域对象
pageContext 域对象
getRequestDispatcher(String path) --------------转发(类似于重定向)
1 RequestDispatcher rd = context.getRequestDispatcher("/test.html"); 2 rd.forward(request, response);
区别:
转发:地址不变 不能转发到web应用以外的资源 可以在转发过程中,可以把数据保存到request域对象中
重定向:地址栏会改变,变成重定向的地址 可以去到web应用以外的资源 不能再重定向的过程,把数据保存到request中
结论:如果要使用request域对象进行数据的共享,只能用转发技术
getRealPath(String path) -------得到web应用的资源文件
getResourceAsAtream(String path)
注:web应用参数可以让当前所有的servlet进行访问,servlet参数只能由当前的servlet来进行读取
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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_2_5.xsd" id="WebApp_ID" version="2.5"> 3 <context-param> 4 <param-name>test</param-name> 5 <param-value>test_context</param-value> 6 </context-param> 7 <servlet> 8 <description></description> 9 <display-name>ServletDemo1</display-name> 10 <servlet-name>ServletDemo1</servlet-name> 11 <servlet-class>com.http.servlet.ServletDemo1</servlet-class> 12 </servlet> 13 <servlet-mapping> 14 <servlet-name>ServletDemo1</servlet-name> 15 <url-pattern>/ServletDemo1</url-pattern> 16 </servlet-mapping> 17 <servlet> 18 <description></description> 19 <display-name>getParam</display-name> 20 <servlet-name>getParam</servlet-name> 21 <servlet-class>com.http.servlet.getParam</servlet-class> 22 </servlet> 23 <servlet-mapping> 24 <servlet-name>getParam</servlet-name> 25 <url-pattern>/getParam</url-pattern> 26 </servlet-mapping> 27 <servlet> 28 <description></description> 29 <display-name>Response</display-name> 30 <servlet-name>Response</servlet-name> 31 <servlet-class>com.http.servlet.Response</servlet-class> 32 </servlet> 33 <servlet-mapping> 34 <servlet-name>Response</servlet-name> 35 <url-pattern>/Response</url-pattern> 36 </servlet-mapping> 37 <servlet> 38 <description></description> 39 <display-name>response_location</display-name> 40 <servlet-name>response_location</servlet-name> 41 <servlet-class>com.http.response.response_location</servlet-class> 42 </servlet> 43 <servlet-mapping> 44 <servlet-name>response_location</servlet-name> 45 <url-pattern>/response_location</url-pattern> 46 </servlet-mapping> 47 <servlet> 48 <description></description> 49 <display-name>response_refresh</display-name> 50 <servlet-name>response_refresh</servlet-name> 51 <servlet-class>com.http.response.response_refresh</servlet-class> 52 </servlet> 53 <servlet-mapping> 54 <servlet-name>response_refresh</servlet-name> 55 <url-pattern>/response_refresh</url-pattern> 56 </servlet-mapping> 57 <servlet> 58 <description></description> 59 <display-name>response_contentType</display-name> 60 <servlet-name>response_contentType</servlet-name> 61 <servlet-class>com.http.response.response_contentType</servlet-class> 62 </servlet> 63 <servlet-mapping> 64 <servlet-name>response_contentType</servlet-name> 65 <url-pattern>/response_contentType</url-pattern> 66 </servlet-mapping> 67 <servlet> 68 <description></description> 69 <display-name>test</display-name> 70 <servlet-name>test</servlet-name> 71 <servlet-class>com.java.servlet.ServletLife</servlet-class> 72 <load-on-startup>1</load-on-startup> 73 </servlet> 74 <servlet-mapping> 75 <servlet-name>test</servlet-name> 76 <url-pattern>/test</url-pattern> 77 </servlet-mapping> 78 <servlet> 79 <description></description> 80 <display-name>Safe_thread</display-name> 81 <servlet-name>Safe_thread</servlet-name> 82 <servlet-class>com.java.thread.Safe_thread</servlet-class> 83 </servlet> 84 <servlet-mapping> 85 <servlet-name>Safe_thread</servlet-name> 86 <url-pattern>/Safe_thread</url-pattern> 87 </servlet-mapping> 88 <servlet> 89 <description></description> 90 <display-name>ConfigDemo</display-name> 91 <servlet-name>ConfigDemo</servlet-name> 92 <servlet-class>com.java.config.ConfigDemo</servlet-class> 93 <init-param> 94 <param-name>path</param-name> 95 <param-value>e:\Contact.xml</param-value> 96 </init-param> 97 <init-param> 98 <param-name>path1</param-name> 99 <param-value>测试1</param-value> 100 </init-param> 101 <init-param> 102 <param-name>path2</param-name> 103 <param-value>测试2</param-value> 104 </init-param> 105 <init-param> 106 <param-name>path3</param-name> 107 <param-value>测试3</param-value> 108 </init-param> 109 </servlet> 110 <servlet-mapping> 111 <servlet-name>ConfigDemo</servlet-name> 112 <url-pattern>/ConfigDemo</url-pattern> 113 </servlet-mapping> 114 <servlet> 115 <description></description> 116 <display-name>servletContext</display-name> 117 <servlet-name>servletContext</servlet-name> 118 <servlet-class>com.java.servletContext.servletContext</servlet-class> 119 </servlet> 120 <servlet-mapping> 121 <servlet-name>servletContext</servlet-name> 122 <url-pattern>/servletContext</url-pattern> 123 </servlet-mapping> 124 <servlet> 125 <description></description> 126 <display-name>ServletTest</display-name> 127 <servlet-name>ServletTest</servlet-name> 128 <servlet-class>com.java.servletContext.ServletTest</servlet-class> 129 </servlet> 130 <servlet-mapping> 131 <servlet-name>ServletTest</servlet-name> 132 <url-pattern>/ServletTest</url-pattern> 133 </servlet-mapping> 134 </web-app>
class
1 package com.java.servletContext; 2 3 import java.io.IOException; 4 import java.util.Enumeration; 5 6 import javax.servlet.ServletContext; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class servletContext extends HttpServlet { 13 14 protected void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 // ServletContext servletContect 17 // =this.getServletConfig().getServletContext(); 18 ServletContext servletContext = this.getServletContext(); 19 // 得到web应用路径:部署到tomcat服务器上项目的名称 20 String projectName = servletContext.getContextPath(); 21 System.out.println(projectName); 22 23 // 案例:应用请求到重定向 24 // response.sendRedirect(projectName + "/index.html"); 25 26 // 得到web应用的初始化参数 27 String value = servletContext.getInitParameter("test"); 28 System.out.println(value); 29 Enumeration<String> names = servletContext.getInitParameterNames(); 30 31 while (names.hasMoreElements()) { 32 String string = (String) names.nextElement(); 33 System.out.println(string+servletContext.getInitParameter(string)); 34 } 35 36 // response.getWriter().append("Served at: 37 // ").append(request.getContextPath()); 38 39 //域对象 共享数据 40 Student s = new Student(); 41 s.setAge(12); 42 s.setName("test"); 43 servletContext.setAttribute("student", s); 44 45 response.sendRedirect(projectName+"/ServletTest"); 46 47 48 49 50 51 52 } 53 54 }
class
1 package com.java.servletContext; 2 3 import java.io.IOException; 4 5 import javax.servlet.RequestDispatcher; 6 import javax.servlet.ServletContext; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class ServletTest extends HttpServlet { 13 14 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 15 ServletContext context = this.getServletConfig().getServletContext(); 16 Student s =(Student) context.getAttribute("student"); 17 System.out.println(s.toString()); 18 19 20 RequestDispatcher rd = context.getRequestDispatcher("/test.html"); 21 rd.forward(request, response); 22 } 23 24 }
总结
servlet编程:
servlet生命周期(重点) 其他都是应用的东西