深入体验JavaWeb开发内幕之servlet中的ServletContext的相关内容和实例展示

来源:互联网 发布:酷狗网络歌手图片 编辑:程序博客网 时间:2024/06/07 18:16


ServletContext

 

•         WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

•         ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。

   也可以使用 this.getServletContext方法

如:

  在servlet1中:

  //获取上下文:

   

 //1、ServletContext context=this.getServletContext();     //2.ServletContext context =this.getServletConfig().getServletContext(); 


•         由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。多个Servlet通过ServletContext对象实现数据共享。

•         ServletContext对象通常也被称之为context域对象。(request,session,page)

 setAttribute(),getAttribute();

例:使用ServletContext实现两个Servlet数据共享

在servlet2.java

package net.csdn; import java.io.IOException;importjava.io.PrintWriter; importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse; public class servlet2 extends HttpServlet {         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {                 this.getServletContext().setAttribute("data2","1992");                             PrintWriterout = response.getWriter();               out.println("servlet");        }         publicvoid doPost(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {               doGet(request,response);        } }//然后在servlet3.java中:package net.csdn; importjava.io.IOException;importjava.io.PrintWriter; importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse; public class servlet3 extends HttpServlet {         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {                             System.out.println(this.getServletContext().getAttribute("data2"));                             PrintWriterout = response.getWriter();               out.println(context);        }         publicvoid doPost(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {               doGet(request,response);        } }


 

ServletContext应用

获取WEB应用的初始化参数。

<context-param>

    <param-name>data</param-name>

   <param-value>xxxx</param-value>

</context-param>
例:设置ServletContext初始化参数,然后对其获取。
如在web.xml文件中:

<?xmlversion="1.0" encoding="UTF-8"?><web-appversion="2.5"        xmlns="http://java.sun.com/xml/ns/javaee"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param>   <param-name>data</param-name>   <param-value>1991</param-value> </context-param>  <servlet> <servlet-name>FirstWeb</servlet-name> <servlet-class>net.csdn.ServletWeb</servlet-class> </servlet> <servlet>   <servlet-name>servlet1</servlet-name>   <servlet-class>net.csdn.servlet1</servlet-class> </servlet> <servlet>   <servlet-name>servlet2</servlet-name>   <servlet-class>net.csdn.servlet2</servlet-class> </servlet> <servlet>   <servlet-name>servlet3</servlet-name>   <servlet-class>net.csdn.servlet3</servlet-class> </servlet> <servlet>   <servlet-name>servlet4</servlet-name>   <servlet-class>net.csdn.servlet4</servlet-class> </servlet>     <servlet-mapping>  <servlet-name>FirstWeb</servlet-name>  <url-pattern>/firstWeb</url-pattern> </servlet-mapping> <servlet-mapping>   <servlet-name>servlet1</servlet-name>   <url-pattern>/servlet1</url-pattern> </servlet-mapping> <servlet-mapping>   <servlet-name>servlet2</servlet-name>   <url-pattern>/servlet2</url-pattern> </servlet-mapping> <servlet-mapping>   <servlet-name>servlet3</servlet-name>   <url-pattern>/servlet3</url-pattern> </servlet-mapping> <servlet-mapping>   <servlet-name>servlet4</servlet-name>   <url-pattern>/servlet4</url-pattern> </servlet-mapping></web-app>



然后在servlet1.java

package net.csdn; importjava.io.IOException;importjava.io.PrintWriter; importjavax.servlet.RequestDispatcher;importjavax.servlet.ServletConfig;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;import javax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse; public class servlet1 extends HttpServlet {         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {                             ServletContextcon = this.getServletContext();                String context=(String)con.getInitParameter("data");                                PrintWriter out = response.getWriter();               out.println(con);        }         publicvoid doPost(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {               doGet(request,response);        } }



中进行获取。

实现Servlet的转发。

 RequestDispatcher rd =getServletContext().getRequestDispatcher(“/1.jsp”);

rd.forward(request,response);

如何把数据传到 1.jsp ?(可以通过request域,不能用context域)
例:编写一个转发实现由servlet1到index.jsp的转发
在servlet1.java中:

package net.csdn; importjava.io.IOException;importjava.io.PrintWriter; importjavax.servlet.RequestDispatcher;importjavax.servlet.ServletConfig;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse; public class servlet1 extends HttpServlet {         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {               ServletContextcon = this.getServletContext();                RequestDispatcher rd =con.getRequestDispatcher("/index.jsp");                rd.forward(request, response);                      }         publicvoid doPost(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {               doGet(request,response);        } }



在index.jsp中:

<%@ pagelanguage="java" import="java.util.*"pageEncoding="ISO-8859-1"%><%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>   <base href="<%=basePath%>">      <title>My JSP 'index.jsp' starting page</title>        <metahttp-equiv="pragma" content="no-cache">        <meta http-equiv="cache-control"content="no-cache">        <meta http-equiv="expires"content="0">           <meta http-equiv="keywords"content="keyword1,keyword2,keyword3">        <metahttp-equiv="description" content="This is my page">        <!--        <linkrel="stylesheet" type="text/css"href="styles.css">        --> </head>  <body>   This is my JSP page. <br>  <!--在此处获取应用的上下文中的属性data2的值--> <%= application.getAttribute("data2")%>  </body></html>


 

利用ServletContext对象读取资源文件。

得到文件路径

读取资源文件的三种方式

–.properties文件(属性文件)

例如:通过ServletContext读取配置文件的内容。

如在src下有一个file.properties的配置文件
    文件内容:

username = root;

password = root;

然后通过servlet4.java进行读取:
方式一:

package net.csdn; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.Properties; import javax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse; public class servlet4 extends HttpServlet {         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {               //在servlet类内使用this.getServletContext().getResourceAsStream()               InputStreamis =this.getServletContext().getResourceAsStream("/WEB-INF/classes/file.properties");                             Propertiesp = new Properties();               p.load(is);               System.out.println(p.getProperty("username"));               PrintWriterout = response.getWriter();               out.println("servlet");                                    }         publicvoid doPost(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {               doGet(request,response);        } }



方式二:

package net.csdn; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.Properties; import javax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse; public class servlet4 extends HttpServlet {         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {                      //2、在servlet类内使用this.getServletContext().getRealPath()                String path =this.getServletContext().getRealPath("/WEB-INF/classes/file.properties");              FileInputStream fis = new FileInputStream(path);               Propertiesp = new Properties();               p.load(fis);               System.out.println(p.getProperty("username"));        }         publicvoid doPost(HttpServletRequest request, HttpServletResponse response)                       throwsServletException, IOException {               doGet(request,response);        } }


 

方式三:通过一个普通类进行读取file.properties文件内容:

NormalClass.javapackage net.csdn; importjava.io.IOException;import java.io.InputStream;import java.util.Properties;   public class NormalClass {         publicstatic void main(String[] args) throws IOException {               InputStreamfis = NormalClass.class.getClassLoader().getResourceAsStream("file.properties");                 Properties p =new Properties();                 p.load(fis);                System.out.println(p.getProperty("username"));                        } }


即可完成对file.properties文件的读取工作。

ServletConfig和ServletContext的区别

整个Web应用只有一个ServletContext,在部署Web应用的时候,容器会建立这一个ServletContext对象,这个上下文对Web应用中的每个Servlet和JSP都可用。

–Web应用中的各个Servlet都有自己的ServletConfig,它只对当前Servlet有效。