JSP脚本的9个内置对象(一)——简述、Application对象

来源:互联网 发布:开淘宝必备软件 编辑:程序博客网 时间:2024/05/16 09:26

一. 简述

 

        JSP 页面中包含9 个内置对象,这9 个内置对象都是Servlet API 的类或者接口的实例,只是JSP 规范将它们完成了默认初始化,即它们已经是对象,可以直接使用。这9个内置对象依次如下:

        (1)applicationjavax.servlet.ServletContext的实例,该实例代表JSP所属的WEB应用本身,可用于JSP页面,或者Servlet之间交换信息。常用的方法有getAttribute(String attName), setAttribute(String attName,String attValue)getInitParameter(String Param)等。

        (2)configjavax.servlet.ServletConfig的实例,该实例代表JSP的配置信息,常用的方法有getInitparameter(String paramName)getInitParametername()等方法。事实上,JSP页面通常无需配置,也就不存在配置信息。因此该对象更多地在Servlet中有效。

        (3)exceptionjava.lang.Throwable的实例,该实例代表其他页面中的错误和异常。只有当页面时错误处理页面,即编译指令的isErrorPage属性是true,该对象才可以使用。常用的方法有getMessage()printStackTrace()等。

        (4)outjavax.servlet.jsp.JspWriter的实例,该实例代表Jsp页面输出流,用于输出内容,形成HTML页面。

        (5)page:代表页面本身,通常没有太大的用处,也就有是Servlet中的this,其类型就是生成Servlet。

        (6)pageContextjavax.servlet.jsp.PageContext的实例,该实例代表JSP页面的上下文,使用该实例可以访问页面中的共享数据。常用的方法getServletContext()getSevletConfig()等。

        (7)requestjavax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求都被封装在该对象里。这是一个常用的对象,获取客户端请求参数必须使用该对象。常用的方法有:getParameter(String paramName),getParamValues(String paramName),setAttribute(String attributeName,String attributeValue),getAttribute(String attributeName)setCharacterEncoding(String env)等。

        (8)responsejavax.servlet.http.HttpServletResponse的实例,代表服务器对于客户端的响应。通常,很少使用该对象直接响应,输出响应对象使用out对象,而response对象常用于重定向。常用的对象有sendRedirect(java.lang.String location)等。

        (9)sessionjavax.servlet.http.HttpServlet的实例,该对象代表一次会话。从客户端浏览器和站点建立连接起,开始会话,直到关闭浏览器结束会话。常用的方法有getAttribute(String attName),setAttribute(String attName,String attValue)

 

二. application对象

 

1. 让JSP和Servlet共享数据

        该对象代表web应用本身,整个web应用共享一个application对象,该对象主要用于在多个JSP页面或者Servlet之间共享变量。application通过setAttribute()方法将一个值放入某个属性,该属性的值对整个Web 应用有效,因此Web 应用的每个JSP 页面或Servlet都可以访问该属性,访问属性的方法为getAttribute 。

        看下面的put-application.jsp页面,该页面仅仅声明了一个整型变量,每次刷新该页面时,该变量值加1,然后将该变量的值放入application 内。下面是页面的代码:

[html] view plaincopy
  1. <%@ page language="java" contentType="text/html; charset=gb2132"  
  2.     pageEncoding="ISO-8859-1"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <title>APPLICATION测试</title>  
  7. </head>  
  8. <body>  
  9. <!-- JSP声明 -->  
  10. <%! int i;  
  11. %>  
  12. <!-- 将i值自加后放入application的变量内 -->  
  13. <%application.setAttribute("counter",String.valueOf(++i));%>  
  14. <!-- 直接输出application变量值 -->  
  15. <%=application.getAttribute("counter"); %>  
  16. </body>  
  17. </html>  

        上面代码第13行实现了每次刷新该页面时,该变量都会先自加,并被设为application的counter属性值,即每次application的counter属性值都会加1。

看下面另一个JSP页面:

[html] view plaincopy
  1. <%@ page language="java" contentType="text/html; charset=gb2132"  
  2.     pageEncoding="ISO-8859-1"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <title>APPLICATION测试2</title>  
  7. </head>  
  8. <body>  
  9. <!-- JSP声明 -->  
  10. <%! int i;  
  11. %>  
  12. <!-- 直接输出application变量值 -->  
  13. <%=application.getAttribute("counter"); %>  
  14. </body>  
  15. </html>  

        上面的代码的13行也直接输出application的属性值。虽然这个页面和put-application页面没有任何的关系,但它同样能够访问到application的属性,因为application的属性对于整个Web应用的JSP、Servlet来说都是共享的。

         注意:application不仅可以用于两个JSP页面间进行共享数据。我们可以把application理解成一个Map对象,任何的jsp、servlet对象都可以将某个变量放入application中进行保存,并为之指定一个属性名; 而该应用中的其他JSP、servlet页面就可以根据这个属性名来得到这个变量。如下面的这Servlet代码所示:

[html] view plaincopy
  1. package ppp;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import javax.servlet.ServletContext;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class GetApplication extends HttpServlet {  
  11.     public void service(HttpServletRequest request, HttpServletResponse response)  
  12.             throws IOException {  
  13.         response.setContentType("text/html;cahrset = gb2132");  
  14.         PrintWriter out = response.getWriter();  
  15.         out.println("<html><head><title>");  
  16.         out.println("测试Application");  
  17.         out.println("</title></head><body>");  
  18.         ServletContext sc = getServletConfig().getServletContext();  
  19.         out.println("application当前的counter值为:");  
  20.         out.println(sc.getAttribute("counter"));  
  21.         out.println("</body></html>");  
  22.     }  
  23. }  

        在上面的代码中,由于Servlet中并没有application内置对象,所以上面程序第18行代码显示获取了该web应用的ServletContext实例。每个web应用只有一个ServletContext实例,在JSP中只有通过application内置对象访问该实例,而在Servlet中则必须代码获取。

        提示:该Servlet同样要编译成class文件才可以使用,实际上Servlet还需要部署。编译Servlet时可能由于没有添加环境变量出现异常,如果安装Java EE SDK,只需将Java EE SDK路径下的javaee.jar文件添加到ClASSPATH环境变量中去;如果没有安装Java EE SDK,可以将tomcat的lib路径下的jsp-api.jar、servlet-api.jar添加到CLASSPATH环境变量中去。

       最后要指出的是:虽然使用application(即ServletContext实例)可以方便JSP、Servlet共享数据,但不要为了共享数据就将数据放入application对象中!由于application对象代表整个应用,所以通常只应该把web应用的状态数据放入application中。

 

2. 获得web应用配置参数

        application还有一个重要的用处:可用于web应用的配置参数。请看如下的JSP页面,该页面访问数据,但访问数据所用的驱动、URL、用户名和密码都在web.xml文件中给出。

[html] view plaincopy
  1. <%@ page language="java" contentType="text/html; charset=gb2132"  
  2.     pageEncoding="ISO-8859-1"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <title>APPLICATION测试</title>  
  7. </head>  
  8. <body>  
  9. <%  
  10.     //从配置参数中获取驱动  
  11.     String driver = application.getInitParameter("driver");  
  12.     //从配置参数中获取数据库URL  
  13.     String url = application.getInitParameter("url");  
  14.     //从配置参数中获取用户名  
  15.     String user = application.getInitParamter("user");  
  16.     //从配置参数中获取密码  
  17.     String pass = application.getInitParamter("pass");  
  18.     //注册驱动  
  19.     Class.forName(driver);  
  20.     //获取数据库连接  
  21.     Connection conn = DriverManager.getParameter("url,user,pass");  
  22.     //创建Statement对象  
  23.     Statement stmt = conn.createStatement();  
  24.     //执行查询  
  25.     ResultSet rs = stmt.executeQuery("Select * from newsinf");  
  26. %>  
  27. <table bgcolor="9999dd" border="1" align="center">  
  28.     <%  
  29.         //遍历结果集  
  30.         while (rs.next()) {  
  31.     %>  
  32.     <tr>  
  33.         <td><%=rs.getString(1)%></td>  
  34.         <td><%=rs.getString(2)%></td>  
  35.     </tr>  
  36.     <%  
  37.         }  
  38.     %>  
  39. </table>  
  40. </body>  
  41. </html>  

       上面的程序中第10行至第17行代码使用了application的getInitParameter(String paramName)来获取web应用的配置参数。这些配置参数应该在web.xml文件中使用context-param元素进行配置,每个context-param配置一个参数,该元素下有如下两个子元素:

        (1) param-name:配置web参数名

        (2) param-value:配置web参数值

        为了给web应用配置参数,应该在web.xml文件中增加以下代码:

[html] view plaincopy
  1. <!--配置第一个参数driver-->  
  2. <context-param>  
  3.         <param-name>driver</param-name>  
  4.         <param-value>com.mysql.jdbc.driver</param-value>  
  5. </context-param>  
  6. <!--配置第二个参数url-->  
  7. <context-param>  
  8.         <param-name>url</param-name>  
  9.         <param-value>jdbc:mysql://localhost:3306/javaee</param-value>  
  10. </context-param>  
  11. <!--配置第一个参数user-->  
  12. <context-param>  
  13.         <param-name>user</param-name>  
  14.         <param-value>root</param-value>  
  15. </context-param>  
  16. <!--配置第一个参数pass-->  
  17. <context-param>  
  18.         <param-name>pass</param-name>  
  19.         <param-value>32147</param-value>  
  20. </context-param>  

        在浏览器中浏览getWebParam.jsp页面时,可以看到数据库连接、数据查询完全成功。可见,使用application可以访问Web应用的配置参数。

注意:通过这种方式,可以将一些信息放置在web.xml文件中进行配置,避免使用一些硬编码方式写在代码中,从而更好地提高程序的可移植性。

0 0
原创粉丝点击