* 应用举例 |
我们在项目中,有几处用到${pageContext.request.contextPath}的情况,我们举例描述一下~
1. ${pageContext.request.contextPath}/css/common.css
2. <img src="${pageContext.request.contextPath}/image/header.jpg"/>
3. <a href="${pageContext.request.contextPath}/product_findByPid.action?pid=<s:property></a>
4. <form id="loginForm"action="${pageContext.request.contextPath}/user_login.action" method="post" novalidate="novalidate"></form>
其实1,2是一种情况,3,4是另一种。这里${pageContext.request.contextPath}
的意思是取出部署的应用程序名称或当前项目的名称。例如我的部署文件的名称是shopend_war_expload,${pageContext.request.contextPath}/css/common.css等价于/shopend_war_expload/css/common.css。
3,4是结合struts的配置而来的,在struts中我们配置的包文件和相关信息如下:
<package name="shop" extends="struts-default" namespace="/"></package>
而这里的${pageContext.request.contextPath}
相当于/shop,而/是localhost:8080于是我们通过地址访问action可以写成:${pageContext.request.contextPath}/product_findByPid.action,我们访问的时候便可以通过localhost:8080/shop/product_findByPid.acton来访问。
* 相对路径 VS 绝对路径 |
我们知道随着不同的Web应用发布方式,绝对路径的值也不同。这样很容易出现问题,但是${pageContext.request.contextPath}的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
相对路径固然比较灵活,但如果想复制页面内的代码却变得比较困难,因为不同的页面具有不同的相对路径,复制后必须修改每一个连接的路径。 如果页面被多于一个的页面所包含,那么被包含页面中的相对路径将是不正确的。这样无疑对工作量带来了考验。
* EL表达式 |
EL(Expression Language) 是为了使JSP写起来更加简单。它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。他的语法结构是:${expression}。
EL存取变量数据的方法很简单,如果我们没有指定参数,它会依序从Page、Request、Session、Application范围查找。假如途中找到,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传”“,这里是一个空字符串。
特别强调一下:
- 1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。
- 2、 注意 <%@ page isELIgnored=”true” %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
* pageContext对象了解 |
页面上下文,该对象主要用于访问 JSP 之间的共享数据。使用 pageContext 可以访问 page、request、session、application 范围的变量。方法如下:
getAttribute(String name) //取得 page 范围的 name 属性。(默认为 page 范围内)
getAttribute(String name, int scope) // 取得指定范围的 name 属性,其中scope 可以是以下4个值。
pageContext.PAGE_SCOPE //对应于 page 范围。
pageContext.REQUEST_SCOPE //对应 request 范围。
pageContext.SESSION_SCOPE //对应 session 范围。
pageContext.APPLICATION_SCOPE //对应 application 范围。
对应还有两个 setAttribute()方法,用于将指定变量放入 page、request、session、application 范围内。
例子如下 :
pageContext.setAttribute("page1" , "hello1"); // 该属性默认为 page 范围内。
//使用 pageContext 设置属性到 request 范围。
pageContext.setAttribute("page2", "hello2" ,pageContext.REQUEST_SCOPE);
//使用 request 设置属性。
request.setAttribute("page2", "hello2");
这两条相等,都是设置 page2 到 request 范围。
还可以获取各属性所在的生存范围,这些范围获取的都是整形变量, 方法为:pageContext.getAttributesScope(“page2”); 范围如下:
1 : 对应 page 生存范围。
2 : 对应 request 生存范围。
3 : 对应 session 生存范围。
4 : 对应 application 生存范围。
不仅如此,pageContext 还可用于获取其他内置对象, pageContext 对象包含如下方法:
ServletRequest getRequest() :获取 request 对象 。
ServletResponse getResopnse() :获取 response 对象 。
ServletConfig getServletConfig() :获取 config 对象 。
ServletContext getServletContext() :获取 application 对象 。
HttpSession getSession() : 获取 session 对象 。
注意:一旦在 JSP、Servlet 编程中获取了 pageContext 对象 ,就可以通过它提供的上面方法来获取其他内置对象。
* END |
对于jsp的内置对象也是一知半解,学习不就是这样吗?我们见的多了,自然会有更深刻的体会,和一种莫名的亲切感。