ServletContext和ServletConfig
一、ServletConfig对象
1 、作用
ServletConfig对象: 主要是用于加载servlet的初始化参数。
在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象);
2、ServletConfig对象的创建和获取
创建时机: 在创建完servlet对象之后,在调用init方法之前创建。
得到对象: 直接从有参数的init方法中得到!!!
ServletConfig config=this.getServletConfig();
3、 servlet的初始化参数配置
<servlet> <servlet-name>ConfigDemo</servlet-name> <servlet-class>com.gqx.servlet.ConfigDemo</servlet-class> <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 --> <init-param> <param-name>user</param-name> <param-value>gqxing</param-value> </init-param> </servlet>
Servlet的程序如下
public class ConfigDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取当前ServletConfig对象 ServletConfig config=this.getServletConfig(); String user=config.getInitParameter("user"); System.out.println(user); } }
注意: servlet的参数只能由当前的这个sevlet获取!!!!
ServletConfig的API:
java.lang.String getInitParameter(java.lang.String name) 根据参数名获取参数值
java.util.Enumeration getInitParameterNames() 获取所有参数
ServletContext getServletContext() 得到servlet上下文对象
java.lang.String getServletName() 得到servlet的名称
//查询当前servlet的所有初始化参数 Enumeration<String> enums = this.getServletConfig().getInitParameterNames(); while(enums.hasMoreElements()){ String paramName = enums.nextElement(); String paramValue = this.getServletConfig().getInitParameter(paramName); System.out.println(paramName+"="+paramValue); } //得到servlet的名称 String servletName = this.getServletConfig().getServletName(); System.out.println(servletName);
二、ServletContext对象
(注意,当你部署一个webapp的时候,想重新换一个名字,在myeclipse中重命名,去访问的时候会无效的,这个时候还要改在tomcat部署webapp下的名称)
1、引入
ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。
2、对象创建和得到
Sun公司设计(直接在Config类中去得到Context对象,然后将其封装成方法返回,这样可以使得Init方法的参数简化,同时使得每一个servlet不易越界,)
1)创建ServletContext对象 ServletContext context = new ServletContext() 2)创建ServletConfig对象 ServetConfig config = new ServletConfig(); config.setServletContxt(context); class ServletConfig{ ServletContext context; public ServletContext getServletContxt(){ return contxt; } } public void init( ServletConfig config ){ 得到ServletConfig对象 从ServletConfig对象中得到ServletContext对象 SerlvetContext context = config.getServletContext(); }
最终可以写成如下形式
//获取当前web应用环境下的ServletContext对象 ServletContext context=this.getServletContext();
三、ServletContext对象的核心API(作用)
java.lang.String getContextPath() --得到当前web应用的路径 java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数 java.util.Enumeration getInitParameterNames() void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法 java.lang.Object getAttribute(java.lang.String name) void removeAttribute(java.lang.String name) RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向) java.lang.String getRealPath(java.lang.String path) --得到web应用的资源文件 java.io.InputStream getResourceAsStream(java.lang.String path)
示例如下:
1、
public class ServletDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取当前web应用环境下的ServletContext对象 ServletContext context=this.getServletContext(); //得到web应用的路径,用在请求重定向的资源名称中 String path=context.getContextPath(); System.out.println(path); //请求重定向 (一般与上面的路径一起用) response.sendRedirect(path+"/index.html"); } }
2、
<!--在servlet中配置初始化参数--> <context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param> <context-param> <param-name>jdbcUrl</param-name> <param-value>jdbc:mysql:///atguigu</param-value> </context-param>
获取初始化参数
public class ContextDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取当前web应用环境下的ServletContext对象 ServletContext context=this.getServletContext(); String string=context.getInitParameter("driver"); System.out.println("参数driver的值为:"+string); System.err.println("--------------"); //获取全部的参数及其值 Enumeration<String> enus=context.getInitParameterNames(); while (enus.hasMoreElements()) { String str = (String) enus.nextElement(); String value=context.getInitParameter(str); System.out.println(str+":"+value); } } }
效果如下
web应用参数可以让当前web应用的所有servlet获取!!!
3、域对象有关的方法
域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。
ServletContext就是一个域对象!!!!
相关api
保存数据:void setAttribute(java.lang.String name, java.lang.Object object)
获取数据: java.lang.Object getAttribute(java.lang.String name)
删除数据: void removeAttribute(java.lang.String name)
问题:当我们想把数据从一个servlet发送到另一个servlet时,该怎么办?
方案一:
可以通过传递参数的形式,共享数据。局限:只能传递字符串类型。
response.sendRedirect("/Servlet2?name=gqxing") //发送数据
String request.getParameter("name"); //接受数据
这个时候可以用到域对象
package com.gqx.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 发送端 * @author Administrator * */ public class ContextDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到域对象 ServletContext context=this.getServletContext(); //把保存的数据放到域对象中 context.setAttribute("student", new Student("gqx",21)); System.out.println("保存成功!"); //context.setAttribute("user", "gqxing"); } } class Student{ private String nameString; private int age; public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student(String nameString,int age){ this.nameString=nameString; this.age=age; } @Override public String toString() { return "Student [nameString=" + nameString + ", age=" + age + "]"; } }
package com.gqx.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ContextDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到域对象 ServletContext context = this.getServletContext(); //2.从域对象中取出数据 //String name = (String)context.getAttribute("name"); Student student = (Student)context.getAttribute("student"); //System.out.println("user="+name); System.out.println(student); } }
转发
RequestDispatcher getRequestDispatcher(java.lang.String path)
1)转发
a)地址栏不会改变
b)转发只能转发到当前web应用内的资源
c)可以在转发过程中,可以把数据保存到request域对象中
2)重定向
a)地址栏会改变,变成重定向到地址。
b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)不能再重定向的过程,把数据保存到request中。
结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!
/** * 转发(效果:跳转页面) * */ public class ForwardDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 保存数据到request域对象 */ request.setAttribute("name", "gqxing"); //转发 /** * 注意:不能转发当前web应用以外的资源。 */ this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response); } }
public class RedirectDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 保存数据到request域对象 */ request.setAttribute("name", "rose"); //重定向 /** * 注意:可以跳转到web应用内,或其他web应用,甚至其他外部域名。 */ //response.sendRedirect("/day09/adv.html"); response.sendRedirect("/day10/GetDataServlet"); } }
public class GetDataServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 从request域对象中获取数据 */ String name = (String)request.getAttribute("name"); System.out.println("name="+name); } }