JSP内置对象和EL内置对象
JSP内置对象和EL内置对象
木云凌 发表于3个月前
JSP内置对象和EL内置对象
  • 发表于 3个月前
  • 阅读 7
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

首先说一下JSP内置对象: 

      JSP内置对象类型映射表 

对象名                     类型                          作用域 

request         javax.servlet.ServletRequest            RequestScope 

response        javax.servlet.ServletResponse           PageScope 

pageContext     javax.servlet.jsp.PageContext           PageScope 

session         javax.servlet.http.HttpSession          SessionScope 

application     javax.servlet.ServletContext            ApplicationScope 

out             javax.servlet.jsp.JspWriter             PageScope 

config          javax.servlet.ServletConfig             PageScope 

page            java.lang.Object                        PageScope 

exception       javax.lang.Throwable                    PageScope 

  至于九大内置对象(也叫隐式对象)如何应用,我想我在此无须多说,这方面文章一搜一大片。我想提一下pageContext这个对象。 
  pageContext这个对象比较特殊,由它的类型可知它是jsp特有的,servlet中没有此对象。pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的session,也可以取本页面所在的 application的某一属性值,他相当于页面中所有功能的集大成者。 
  再说一下EL内置对象: 
  EL为了方便输出一些表达式的值,自己也定义了一些内置对象,应用这些内置对象方便的获取想要输出的值 
JSP EL的内置对象和JSP的内置对象是两回事,不能互用,即JSP EL内置对象只能在EL中表达式中使用, 
JSP的内置对象也只能在JSP中使用而不能在EL中直接用 
但是两种有个对应关系,即EL的内置对象可以调用JSP对应内置对象的保存数据,从而方便的显示 

JSP EL的内置对象: 
pageContext 
pageScope 
requestScope 
sessionScope 
applicationScope 
param 
paramValues 
header 
headerValues 
cookie 
initParam 
可以分为以下三类: 
1.与范围有关的隐含对象 
与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和applicationScope; 
它们基本上就和JSP的pageContext、request、session和application一样; 
在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。 
例如:我们要取得session中储存一个属性username的值,可以利用下列方法: 
    session.getAttribute("username") 取得username的值, 
在EL中则使用下列方法 
    ${sessionScope.username} 
2.与输入有关的隐含对象 
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。 
例如我们要取得用户的请求参数时,可以利用下列方法: 
    request.getParameter(String name) 
    request.getParameterValues(String name) 
在EL中则可以使用param和paramValues两者来取得数据。 
    ${param.name} 
    ${paramValues.name} 
3.其他隐含对象 
cookie 
JSTL并没有提供设定cookie的动作, 
例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。 
header和headerValues 
header 储存用户浏览器和服务端用来沟通的数据 
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。 
另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。 
initParam 
initParam取得设定web站点的环境参数(Context) 
例:一般的方法String userid = (String)application.getInitParameter("userid"); 
    可以使用 ${initParam.userid}来取得名称为userid 
pageContext 
pageContext取得其他有关用户要求或页面的详细信息。 
    ${pageContext.request.queryString}         取得请求的参数字符串 
    ${pageContext.request.requestURL}         取得请求的URL,但不包括请求之参数字符串 
    ${pageContext.request.contextPath}         服务的web application 的名称 
    ${pageContext.request.method}           取得HTTP 的方法(GET、POST) 
    ${pageContext.request.protocol}         取得使用的协议(HTTP/1.1、HTTP/1.0) 
    ${pageContext.request.remoteUser}         取得用户名称 
    ${pageContext.request.remoteAddr }         取得用户的IP 地址 
    ${pageContext.session.new}             判断session 是否为新的 
    ${pageContext.session.id}               取得session 的ID 
    ${pageContext.servletContext.serverInfo}   取得主机端的服务信息 

怎么样,看了之后恍然大悟了没(*^__^*) 嘻嘻……  我想至少也会让你对内置对象清晰了很多吧~ 这可是俺平生处子博文哦 ~~鼓励一下吧(*^__^*) 嘻嘻…… 
================================================================================= 
补充一下EL表达式: 
一、EL简介 
   1).语法结构 
     ${expression} 
   2).[]与.存取器 
     EL 提供.和[]两种存取器来存取数据。 
     当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如: 
         ${user.My-Name}应当改为${user["My-Name"] } 
     如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如: 
         ${sessionScope.user[data]}中data 是一个变量 
   3).变量 
     EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。 
     因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。 
     假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。 
     属性范围在EL中的名称 
         Page          PageScope 
         Request          RequestScope 
         Session          SessionScope 
         Application      ApplicationScope 
4).运算符 
1.算术运算符有五个:+、-、*或$、/或div、%或mod 
2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge 
3.逻辑运算符有三个:&&或and、||或or、!或not 
4.其它运算符有三个:Empty运算符、条件运算符、()运算符 
例:${empty param.name}、${A?B:C}、${A*(B+C)} 
5) EL函数(functions) 
语法:ns:function( arg1, arg2, arg3 …. argN) 
其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置 
二、EL注意点: 
1.${logininfo.username} 
这表明引用logininfo 对象的username 属性。我们可以通过“.”操作符引 
用对象的属性,也可以用“[]”引用对象属性,如${logininfo[username]} 
与${logininfo.username}达到了同样的效果。 
“[]”引用方式的意义在于,如果属性名中出现了特殊字符,如“.”或者“-”, 
此时就必须使用“[]”获取属性值以避免语法上的冲突(系统开发时应尽量避免 
这一现象的出现)。 
与之等同的JSP Script大致如下: 
LoginInfo logininfo = 
(LoginInfo)session.getAttribute(“logininfo”); 
String username = logininfo.getUsername(); 
可以看到,EL大大节省了编码量。 
这里引出的另外一个问题就是,EL 将从哪里找到logininfo 对象,对于 
${logininfo.username}这样的表达式而言,首先会从当前页面中寻找之前是 
否定义了变量logininfo,如果没有找到则依次到Request、Session、 
Application 范围内寻找,直到找到为止。如果直到最后依然没有找到匹配的 
变量,则返回null. 
可以看出:在EL中得到变量直接用变量名即可,它会自动调用get()方法 
如果我们需要指定变量的寻找范围,可以在EL表达式中指定搜寻范围: 
${pageScope.logininfo.username} 
${requestScope.logininfo.username} 
${sessionScope.logininfo.username} 
${applicationScope.logininfo.username} 
2.<%@ page isELIgnored="true"%> 
表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁 

止.JSP2.0中默认的启用EL语言.

 

下面我们分别对每个作用域对象进行讲解。

 

表 13.1. el中的作用域

el中的作用域 对应关系
pageContext(1) 当前页的pageContext对象
pageScope 把page作用域中的数据映射为一个map对象
requestScope(2) 把request作用域中的数据映射为一个map对象
sessionScope 把session作用域中的数据映射为一个map对象
applicationScope 把application作用域中的数据映射为一个map对象
param 对应request.getParameter()
paramValues(3) 对应request.getParameterValues()
header(4) 对应request.getHeader()
headerValues 对应request.getHeaderValues()
cookie(5) 对应request.getCookies()
initParam(6) 对应ServletContext.getInitParamter()

 

(1)

例子中的${pageContext.request.contextPath}返回的是request.getContextPath()的值,在此例中就是/13-04,我们经常使用这个来拼接jsp中的绝对路径。

这里的${pageContext.request.contextPath}是一种特殊用法,不能使用${request.contextPath}的形式替代。

(2)

pageScope, requestScope, sessionScope, appliationScope都可以看作是Map型变量,调用其中的数据可以使用${pageScope.name}或${pageScope["name"]}的形式,这两种写法是等价的。

在某些情况下只能使用${pageScope["content-type"]},这里不能写成${pageScope.content-type},jsp无法解析连字符(-)会出现错误。

(3)

需要注意的是${paramValues.name}得到的是一个字符串数组,如果需要获得其中某个值,还需要使用${paramValues.name[0]}指定数组中的索引。

这与下面的${headerValues.name}是相似的。

(4)

${header.name}会取得http请求中的header参数,现实工作中很少用到这里的数据。

例子中使用Host是指请求访问的主机地址,包括ip和端口号。而Referer比较有趣,如果用户通过超链接跳转过来的,Referer会保存上次访问页面的地址,我们就可以通过它来统计哪些用户是从哪里转来的了。

(5)

${cookie.name}将获得对应cookie的对象,比如我们用jsp将一段cookie发送给客户端。

Cookie cookie = new Cookie("username", "Username in cookie");
response.addCookie(cookie);

创建一个名称为username,值为"Username in cookie"的Cookie对象,然后发送给客户端。

然后我们就可以使用${cookie.username}获得这个cookie了,${cookie.username.name}获得cookie名称,${cookie.username.value}获得cookie值。

(6)

ServletContext.getInitParamter()指的应用的初始变量,这些变量都是定义在web.xml中的。

<context-param>
    <param-name>username</param-name>
    <param-value>username with context param</param-value>
</context-param>

${initParam.username}就会得到这里的变量值。

以上都是死记硬背的东西,建议实际用到的时候翻看一下就好了,演示代码都放在13-04下,为了获得param和cookie还要点击一下最下边的连接才可以。

运算符

el表达式中支持java中所有的操作符,并且还有一些扩展,下面我们简要做一下对照。

 

表 13.2. 加减乘除四则运算

符号 说明
+
-
*
/或div
%或mod 求余

 

 

表 13.3. 比较运算

符号 说明
==或eq 相等(equals)
!=或ne 不相等(not equals)
<或lt 小于(less than)
>或gt 大于(greater than)
<=或le 小于等于(less than or equals)
>=或ge 大于等于(greater than or equals)

 

 

表 13.4. 逻辑运算

符号 说明
&&或and 逻辑和
||或or 逻辑或
!或not 取反

 

 

表 13.5. 特殊运算

符号 说明
empty 是否为null或空字符串
? : 三元运算符

 

下面上所有运算符的显示结果,顺便说一下如果想在jsp中显示${name}而不让jsp把它当作el计算出来,可以写成/${name},这样最后显示的结果就是${name}了。

共有 人打赏支持
木云凌
粉丝 6
博文 50
码字总数 17191
×
木云凌
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: