java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要介绍了 servlet 之 ServletContext 简介,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在对 Servlet 配置的 web.xml 文件中,经常会使用一些初始化的参数来配置 Servlet,总的功能来说就是不在 Servlet 程序中将某个变量写死,而是通过外界 (如 web.xml 文件) 进行传递,同时便于修改。这个是使用
可以看到在这个默认 Servlet 中有两个初始化参数,分别是 "debug=0" 和 "listings=false"。
当 Servlet 在 web.xml 文件中配置了
我们从 Servlet 接口的初始化方法:init(ServletConfig config),可以知道,当服务器创建 Servlet 对象就将 ServletConfig 对象传递,而在 ServletConfig 对象中包含着
刚开始学 Servlet 时,就已经谈到过 Servlet 接口的非生命周期方法就有一个方法是 getServletConfig() 方法,返回 ServletConfig 对象。所以当我们在开发的 Servlet 的 web.xml 文件中配置一些信息:
而在 Servlet 中的程序获取这个配置的参数:
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- ServletConfig config = this.getServletConfig();
- String initValue = config.getInitParameter("love");
- System.out.println(initValue);
- }
重新部署该 web 应用,然后在浏览器来访问这个 Servlet,将会看到在 MyEclipse 的控制台上打印出:
在 ServletConfig 类中,getInitParameter(String name) 方法是传入特定参数名来获取对应参数的值,getInitParameterNames() 方法则是将所有的参数名装进一个 Enumeration 对象返回,当我们有多个参数键值对时:
在 Servlet 中进行遍历和输出:
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- ServletConfig config = this.getServletConfig();
- Enumeration initParams = config.getInitParameterNames();
- while (initParams.hasMoreElements()) {
- String paramName = (String) initParams.nextElement();
- String paramValue = config.getInitParameter(paramName);
- System.out.println(paramName + " = " + paramValue);
- }
- }
最后,ServletConfig 对象的作用通常用于获得编码表类型,获得数据库连接信息,获得配置文件 (如 Struts 的 web.xml 文件中) 等等。
说完了 ServletConfig 对象,当我们去看这个对象的方法时会发现这个方法中还有一个方法 getServletContext() 是返回一个 ServletContext 对象,这是 Servlet 中一个非常重要的类。当然 ServletContext 对象还可以从父类的方法中直接获取。
Web 容器在启动时会为每个 web 应用创建一个 ServletContext 对象,而这个 ServletContext 对象就代表当前这个 web 应用。因为一个 ServletContext 对象代表一个 web 应用,所以该 web 应用中所有的 Servlet 和其他资源都共享一个 ServletContext 对象,这时,我们就可以通过 ServletContext 对象进行 Servlet 对象之间的通讯。而 ServletContext 对象也称之为 Context 域对象。
我们先来看看 ServletContext 对象的获取的两种方式:
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- //两种获取ServletContext对象的方法:
- ServletContext context1 = this.getServletConfig().getServletContext();
- ServletContext context2 = this.getServletContext();
- //System.out.println(context1 == context2); //ture
- }
可以通过先获取 ServletConfig 对象来获取,或者直接通过父类的方法来获取,这两种方式获取到的是同一对象(相同地址)。
既然说 ServletContext 代表这个 web 应用,我们可以用它来进行 Servlet 直接的通讯,那么我们就创建一个工程来进行两个 Servlet 之间的数据传输。在一个【myservlet】web 工程下创建两个 Servlet:ServletDemo1 和 ServletDemo2,
ServletDemo1 在 ServletContext 中设置参数键值对,代码为:
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- ServletContext context = this.getServletContext();
- context.setAttribute("lover", "LRR");
- }
ServletDemo2 从 ServletContext 中获取键值对,代码为:
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- ServletContext context = this.getServletContext();
- System.out.println(context.getAttribute("lover"));
- }
在浏览器先访问 ServletDemo1 后(先执行 ServletDemo1 才能使 ServletContext 设置参数),再访问 ServletDemo2 后,MyEclipse 的控制台就输出了 ServletContext 中设置的参数,这就达到了从一个 Servlet 传递数据给另一个 Servlet。当然这只是 ServletContext 的一个小小应用。
在 ServletContext 类中还有 getInitParameter(String name) 方法或者 getInitParameterNames() 方法,这两个方法获取的是 web 应用所配置的参数 (毕竟 ServletContext 代表 web 应用),就像 ServletConfig 中类似的方法获取的是某个 Servlet 中的
而对于配置 web 应用的参数是在 web.xml 文件中使用
例:在【myservlet】web 工程下建立了名为 ServletDemo3 的 Servlet,并在该 web 工程下的 web.xml 文件中添加
在 ServletDemo3 中的代码如下:
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- ServletContext context = this.getServletContext();
- String username = context.getInitParameter("username");
- String password = context.getInitParameter("password");
- System.out.println(username + ":" + password);
- }
在浏览器中访问该 Servlet,如果 MyEclipse 的控制台能打印该信息,说明每个 Servlet 可以通过 ServletContext 对象来获取 web 应用的配置信息,也从侧面说明了 ServletContext 代表了这个 web 应用:
ServletContext 类中的 getMimeType(String file) 方法用于返回该文件的 MIME 类型:
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- String filename = "1.html";
- ServletContext context = this.getServletContext();
- System.out.println(context.getMimeType(filename));
- }
输出:text/html。
ServletContext 中的转发方法(重要)
在 ServletContext 对象中还有这么两个方法:getNameDispatcher(String name)(不常用)和 getRequestDispatcher(String path),返回的是 RequestDispatcher 对象。转发有什么作用呢,举个例子,比如一个 Servlet 中的数据交个另一个 Servlet 来处理,或者 Servlet 将某个实时数据交给 JSP 来显示,虽然我们在浏览器中访问的是最开始的 Servlet,但是进行转发后看到的其他 web 资源,而浏览器的地址栏不会改变。
注:在请求对象 request 对象中也有这么一个 getRequestDispatcher(String path) 方法,功能与 ServletContext 对象的这个方法一样,也可以实现转发,因此用哪个对象都行,没有区别。
例:在【myservlet】web 工程下创建一个名为 ServletDemo1 的 Servlet 和一个 show.jsp,
在 ServletDemo1 中将数据转发给 show.jsp,代码为:
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- String data = "Ding love LRR";
- this.getServletContext().setAttribute("data", data); //将数据存至web应用的配置中
- ServletContext context = this.getServletContext();
- RequestDispatcher dispathcer = context.getRequestDispatcher("/show.jsp"); //通过要转发的目的地来获取转发对象
- dispathcer.forward(request, response); //通过forward方法将请求对象和响应对象转发给别人处理
- }
而在 show.jsp 中接收这个数据,并封装在 HTML 中:
- <font size="100px" color="red">
- ${data }
- </font>
接着我们去浏览器里访问 ServletDemo1,就会看到:
虽然我们请求的 ServletDemo1 资源,但是由于在 ServletDemo1 中将请求进行了转发,所以其实服务器返回的是 show.jsp 的资源,但是我们浏览器地址依然会是 ServletDemo1,这也是转发和重定向的区别之一。
来源: http://www.phperz.com/article/17/1230/355983.html