JSP内置对象之application对象
虽然常把Web应用称为B/S架构的应用,但其实Web应用一样是C/S结构的应用,只是这种应用的服务器是Web服务器,而客户端是浏览器。
现在抛开Web应用直接看Web服务器和浏览器。


Web服务器负责接收客户端请求,每当接收到客户端连接请求之后,Web服务器应该使用单独的线程为客户端提供服务。
Web应用架构总是先由客户端发送请求,服务器接收到请求后送回响应的数据,所以将这种架构称做"请求/响应"架构。
Web服务器大致需要以下几个步骤:
- 启动单独的线程;
- 使用I/O流读取用户的请求数据;
- 从请求数据中解析参数;
- 处理用户请求;
- 生成响应数据;
- 使用I/O流向客户端发送请求数据。
上述中的,1、2和6步骤是通用的,可以由Web服务器来完成,但3、4和5步根据不同的请求,处理的方式也不一样。
实际上,Web服务器会调用Servlet的_jspService()方法来完成第3、4和5步,当我们编写JSP页面时,页面里的静态内容、JSP脚本都会转换成_jspSercice()方法执行代码,这些执行代码负责完成解析参数、处理请求、生成响应等业务功能,而Web服务器则完成多线程、网络通信等底层功能。
Web服务器在执行了第3步解析到用户的请求参数之后,将需要通过这些请求参数来创建HttpServletRequest、HttpServletResponse等对象,实际上一个Web服务器必须为ServletAPI中绝大多数接口提供实现类。
Web应用里的JSP页面、Servlet等程序都将由Web服务器来调用,JSP、Servlet之间通常不会相互调用,这就产生了一个问题:JSP、Servlet之间如何交换数据?
为了解决这个问题,几乎所有的Web服务器都会提供4个类似Map的结构,分别是application、session、request、page,并允许JSP、Servlet将数据放入这4个类似Map的结构中,并允许从这个4个Map结构中取出数据。这4个Map结构的区别是范围不同。
- application:对于整个Web应用有效、一旦JSP、Servlet将数据放入application中,该数据将可以被该应用下其他所有的JSP、Servlet访问。
- session:仅对一次会话有效,一旦JSP、Servlet将数据放入session中,该数据将可以被本次会话的其他所有的JSP、Servlet访问。
- request:仅对本次请求有效,一旦JSP、Servlet将数据放入request中,该数据可以被该次请求的其他JSP、Servlet访问。
- page:仅对当前页面有效,一旦JSP、Servlet将数据放入page中,该数据只可以被当前页面的JSP脚本、声明部分访问。
就像现实中有两个人,他们需要交换金钱,却又不能直接接触,于是A将钱存入银行,B从银行中取钱。因此我们可以将application、session、request和page理解为类似银行的角色。
将数据放入application、session、request和page之后,就相当于扩大了该数据的作用范围,所以我们也认为application、session、request和page中的数据分别处于application、session、request和page范围之中。
JSP中的application、session、request和pageContext4个内置对象分别用于操作application、session、request和page范围中的数据。
application对象代表Web应用本身,因此使用application来操作Web应用相关数据。application对象通常有如下两个作用:
- 在整个Web应用的多个JSP、Servlet之间共享数据。
- 访问Web应用的配置参数

代码实例,以下页面声明了一个整型变量,每次刷新该页面时,该变量值加1,然后将值放入application内。
put-application.jsp
|
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>application test</title> </head> <body> <!-- JSP 声明--> <%! int i; %> <!--将i值自加后放入application的变量内--> <% application.setAttribute("counter",String.valueOf(i++)); %> <!--输出i的值--> <%=i%> </body> </html> |
再看下面的JSP页面,该页面可以直接访问到application的counter属性值。
get-application.jsp
|
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>application test</title> </head> <body> <!--输出i的值--> <%=application.getAttribute("counter")%> </body> </html> |
以上页面中的粗体字代码直接输出application的counter属性值,虽然这个页面和put-application.jsp没有任何关系,但它一样可以访问到application的属性,因为application的属性对于整个Web应用的JSP、Servlet都是共享的。

下面代码示范了如何在Servlet中访问application里的变量。
|
@WebServlet(name="get-application",urlPatterns={"/get-application"}) public class GetApplication extends HttpServlet{ /** * */ private static final long serialVersionUID = 1L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException{ response.setContentType("text/html;charset=gb2312"); PrintWriter out = response.getWriter(); out.println("<html><head><title>"); out.println("测试application"); out.println("</title></head></body>"); ServletContext sc = getServletConfig().getServletContext(); out.println("application中当前的Counter值为:"); out.println(sc.getAttribute("counter")); out.println("</body></html>"); } } |
由于在Servlet中并没有application内置对象,所以上面程序显式获取了该Web应用的ServletContext实例,每个Web应用只有一个ServletContext实例,在JSP页面中可通过application内置对象访问该实例,而Servlet则必须通过代码获取。

application还有一个重要用处:可用于从Web应用的web.xml文件中获取配置参数。如下所示,访问该数据库所使用的驱动、URL、用户名和密码都位于web.xml中配置。
|
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>application test</title> </head> <body> <% //从配置参数中获取驱动 String driver = application.getInitParameter("driver"); //从配置参数中获取数据库url String url = application.getInitParameter("url"); //从配置参数中获取用户名 String user = application.getInitParameter("user"); //从配置参数中获取密码 String pass = application.getInitParameter("pass"); //注册驱动 Class.forName(driver); //获取数据库连接 Connection conn = DriverManager.getConnection(url,user,pass); //创建Statement对象 Statement stmt = conn.createStatement(); //执行查询 ResultSet rs = stmt.executeQuery("select * from news_inf"); %> <table bgcolor="#9999dd" border="1" width="480"> <% //遍历结果集 while(rs.next()){ %> <tr> <td><%=rs.getString(1)%></td> <td><%=rs.getString(2)%></td> </tr> <% } %> </table> </body> </html> |
上面程序中,使用application的getInitParameter()方法来获取Web应用的配置参数,这些配置参数应该在web.xml文件中使用context-param元素配置,每个<context-param />配置一个参数,配置示例如下:
|
<context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/javaee</param-value> </context-param> <context-param> <param-name>user</param-name> <param-value>root</param-value> </context-param> …… |
param-name:配置Web参数名
param-value:配置Web参数值
通过这种方式,可以将一些配置信息放在web.xml文件中配置,避免使用硬编码方式写在代码中,从而更好的提高程序的移植性。
JSP内置对象之application对象的更多相关文章
- JavaWeb——JSP内置对象application,JSP属性范围
application application语法 application对象 JSP属性范围 范围的分类 page request session application pagecontext延伸 ...
- JSP内置对象——application对象和out对象
1.application 对象application用于保存所有应用程序的公有数据.它在服务器启动时自动创建,在服务器停止时销毁. 当application对象没有被销毁时,所有用户都可以共享该ap ...
- jsp内置对象浅谈
jsp内置对象浅谈 | 浏览:1184 | 更新:2013-12-11 16:01 JSP内置对象:我们在使用JSP进行页面编程时可以直接使用而不需自己创建的一些Web容器已为用户创建好的JSP内置对 ...
- JSP内置对象-request
JSP内置对象即无需声明就可以直接使用的对象实例,在实际的开发过程中,比较常用的JSP对象有request,response,session,out和application等,笔者在本文章中将简单介绍 ...
- JavaWeb学习----JSP内置对象详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Jsp内置对象及EL表达式的使用
一.JSP的内置对象(9个JSP内置对象) JSP的内置对象引用名称 对应的类型 request HttpServletRequest response HttpServletResponse ses ...
- Java遇见HTML——JSP篇之JSP内置对象(上)
一.JSP内置对象简介 1.1.内置对象简介 JSP内置对象是WEB容器中创建的一组对象,可以直接使用不需要new,如截图中的out 对象. JSP有九大内置对象: 五大常用对象: out.reque ...
- JavaWeb之 JSP:内置对象,EL表达式,JSP标签基础
JSP的内置对象 什么是JSP的内置对象呢? 在JSP页面进行编程的时候,如果我们要使用一些对象,如:HttpSession,ServletConfig,ServletContext这些对象,如果每次 ...
- jsp内置对象和el表达式
九个内置对象 *out jsp的输出流,用来向客户端响应 *page 当前jsp页面, 它的引用数据类型是Object,即真身中有如下代码 Object page=this; *config 它对应真 ...
- JSP内置对象详解
jsp中内置对象:request.response.session.applecation.out.pagecontesx.config.page.exception.cookie 1.request ...
随机推荐
- 使用expect scp避免直接输密码
需求:现在有一百多台的机器,都是使用用户名密码登录做一些运维操作,不想因为密码变更造成管理上的一些麻烦,所以改为通过密钥文件的方式进行登录,需要提前做一些准备工作,把准备好的.SSH文件复制到各机器的 ...
- web项目log4j的配置模板
log4j.properties文件: log4j.rootLogger=DEBUG,Console,File //测试环境 为 debug, 生产时勿必改为info log4j.appender ...
- 2016.10.29 清北学堂NOIP冲刺班Day1 AM 考试总结
成绩:满分300,我得了200, 1:90//前两个题目都是模拟,没用到什么其他算法,第一题有可能少考虑了一点细节 2:100 3:10//感觉是个DP,但是毫无思路,只打了个普通背包,10分而已. ...
- 我的CentOS 7 U盘安装之路 (Win 8.1 Profession + CentOS 7双系统)
这次为了学习Linux,尝试着安装了鸟哥书上推荐的CentOS这款Distribution,但是安装的是最新版CentOS 7,好像跟书上的差别有点大呢.安装的过程中走了一些弯路,做了一些尝试最后发现 ...
- USACO2.4 The Tamworth Two[模拟]
题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它们总 ...
- Struts2:Json插件_Ajax
lib中加入包 struts2-json-plugin-2.3.20.jar json插件有自己的过滤器.返回类型 WebRoot下新建js文件夹 放入json2.js json2.js是一个著名开源 ...
- iOS聊天下拉刷新聊天记录的实现
1. 想法 最近在开发一个社交类app,要实现类似微信那种下拉刷新聊天记录的功能. 一般有两种实现方式: 1. 直接fetch一个entity的所有数据然后在内存中做filter,就是把所有聊天记录先 ...
- SharePoint中使用C#跳转页面的研究
最近开发SharePoint的时候遇到问题,不能完成跳转,于是归纳了一下方法(最后还是使用了js跳转,后台跳转被sharepoint限制了). 1.最常用的页面跳转(原窗口被替代):Response. ...
- 深入浅出RxJava
深入浅出RxJava(一:基础篇) 深入浅出RxJava(二:操作符) 深入浅出RxJava三--响应式的好处 深入浅出RxJava四-在Android中使用响应式编程 RxJava 到底是什么? 一 ...
- jsp中的<%%>和<!%%>的区别
jsp 都是解析成.java文件` 具体代码请看 如果你写 <%int a=1;%> 生成的代码是 public class xxx_jsp { public void doProcess ...