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


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.java



package 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有效。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值