JSP中el表达式的取值过程是怎样的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP中el表达式的取值过程是怎样的?相关的知识,希望对你有一定的参考价值。

项目用的是springMVC。
html文件中像是这样

<input type="hidden" name="testType" value="$testType" />
或者是这样
<p>$user</p>
的el表达式是怎样取值的?

是SpringMVC自己解决的?
===================================================
另外,是直接在web.xml中配置好web-app的版本就可以直接用el表达式了么?

el表达式和Springmvc没关系,el表达式取值必需是servlet四大作用(servletContext>session>request>pageContext)中有的值,这四个域都有setAttribute("",object)方法和getAttribute("")方法 el表达式 会自动从四大域中按作用范围从小到达寻找搜寻对应名字的值,其内部调用的就是pageContext的findAttribute("")方法;如果要想在页面通过el表达式得到值就必需先调用域的setAttribute方法把值设置进去,不需要什么配置,直接写el表达式就可以如下代码

<% 
application.setAttribute("name", "zhangsan");//Context域
session.setAttribute("name", "lisi");//session域
request.setAttribute("name", "wangwu"); //request域
pageContext.setAttribute("name", "zhaoliu");//page域
%>
$name 

输出结果是page域中的zhaoliu 如果将page域删掉则输出wangwu 依次类推

哥们 这是javaee基础知识 建议学好基础在整框架 不然只会傻瓜式的复制粘贴 不知道内部工作原理

追问

嗯...可能是我表述还有些问题.....
其实想知道的不是el表达式的原理,是SpringMVC的原理。

追答

可以将SpringMVC看成一个大的servlet 就是对servlet的一个封装

参考技术A 容器在启动的时候,会把jsp编译为class,你所用的el表达式,会按照el标准类库翻译为javaclass语言,这个class会动态输出html页面流。实例就是servlet原理。你想了解这个,就去看看servlet原理追问

哦?主要不是想知道el表达式的原理,是想了解一下el表达式是怎样取值的...

参考技术B 呵呵,兄弟你多半是在jsp页面用$取不到值而疑神疑鬼了,在jsp中怎样使用$取值跟在HTML没什么两样,如果你在HTML中EL可以而jsp中却出了问题,问题多半跟EL无关。追问

那一般跟什么有关?

追答

页面用EL表达式取不到值只有这么几种情况:

    后台发送的参数没有传递到页面,EL表达式接收不到。

    EL要取的参数与后台传递的不是同一个参数。

    EL取的目标参数在被封装在另外一个对象内部,EL无法获取到。


spring这个东西强大是强大了,不过往往也因此破换了某些规则,如单例模式碰上Spring就有点行不通,EL表达式在这里不知道是啥情况,期待,呵呵。

参考技术C

el表达式取值必需是servlet四大作用(servletContext>session>request>pageContext)中有的值

    EL表达式可以取JavaBean的值,也可以取Attribute的值,下面是取Attribute的值

2.$name 取值是从作用域最小的域进行取值,这里就是pageContext开始取值,即以上四个语句都有的时候,取到的name值是pageContext里面的Attribute中name值pageContextName

javascript里面使用需要在最外层加引号:“$name”

3.c标签又常与EL表达式使用: 

JSP中用EL表达式取 传回来的Attribute中list值(假设list值是 读取数据库数据返回的resultset类转成list类值)

参考技术D 1:el表达式原本属于是JSTL这么一个库自定义语言,后来由于它的方便性,el表达式已经成为jsp2.0/servlet2.4的标准功能,跟springMVC无关。
2:el表达式是从session,request或者application context中所取的“属性。
3:el表达式只是一种从上下文中获取数据的手段,你要取得什么信息,先放入上下文中,然后el表达式才可以获取。上下文就是指session,request或者application context、pagecontext
4:以下是如何从web.xml中获取配置信息的一个例子

===================================================

/*通过 getServletConfig() 获取单一值*/
String value = getServletConfig().getInitParameter("name1");
/*获取所有初始化变量*/
java.util.Enumeration enum = getServletConfig().getInitParameterNames();
for (; enum.hasMoreElements(); )
// 获取初始化参数的名字
String name = (String)enum.nextElement(); // 获取对应值
value = getServletConfig().getInitParameter(name);
/* 通过 getServletContext() 获取单一值*/ String value = getServletContext().getInitParameter("name1");追问

    就是说现在的spring已经不需要配置jps属性了?

   3. 一般来说应该是取request里面的值,那在SpringMVC里面就是ModleAndView咯?

追答

spring只是封装了servlet而已,不需要配置的
mvc你能控制的也就是M和V,C你也就是顶多配置一下

如何将servlet中的变量在jsp页面中显示---jsp中的EL表达式

1.EL(Expression Language)表达式
语 法:$,放在body中


2.EL表式一般情况下,从作用域对象中取值
作用域对象有四个:pageContext,request,session,application,从小到大

例如:
<%
int a = 1234;
//利用作用域对象设置key-value,即变量
pageContext.setAttribute("a", a);
%> -----这是设置在<!DOCTYPE html >标签之上

可由$a,来获取变量a的值。

3.EL表达式优先从哪个作用域对象取值?默认情况下从最小作用域取值,前提是几个作用域对象的key都相等

例如:
<%
pageContext.setAttribute("scope", "pageContext");
request.setAttribute("scope", "request");
session.setAttribute("scope", "session");
application.setAttribute("scope", "application");
%>
可有$scope,获取scope的值。

4.EL表达式从指定作用域对象中取值:pageContext,request,session,application

例如:
<%
pageContext.setAttribute("scope", "pageContext");
request.setAttribute("scope", "request");
session.setAttribute("scope", "session");
application.setAttribute("scope", "application");
%>

可由$pageScope.scope,$requestScope.scope,$sessionScope.scope,$applicationScope.scope获取相应的scope的值


5.EL表达式能取什么类型的数据?基本数据类型,对象类型,复合对象类型,Map,List等

例如:方式一:
List list = new ArrayList();
//往list中添加对象
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
//再将list放到作用域对象request中
request.setAttribute("list", list);
可由:$list---$list[2],获取相应的值

方式二
Map map = new HashMap();
//往map添加数据
map.put("name", "李四");
map.put("gender", "男");
map.put("address", "天河区");
//将map放到作用域对象request中
request.setAttribute("map", map);
可由:$map---$map.gender,获取相应的值

方式三
User user = new User("lisi","123456000","李四","男",20,new Address("广东省","广州市","天河区") );
request.setAttribute("user", user);
$user.realname---$user["realname"]----$user.addr.town,获取相应的值

6.EL表达式获取请求参数的数据:param,paramValue

在浏览器地址栏输入:127.0.0.1:8080/servlet名/jsp文件名?name=luo&fav=lq&fav=zq&fav=ppq

可由:$param.name,$paramValues.fav[1]来获取相应的值


7.EL表达式可以做为空判断:空字符串,null,空List,空Map,这几个值为true

例如:
<%
request.setAttribute("aaa", "");
request.setAttribute("bbb", null);
request.setAttribute("ccc", new ArrayList());
request.setAttribute("ddd", new HashMap());
%>

可由$empty aaa,$empty bbb,$empty ccc,$empty ddd,对其进行判断,empty为关键字

8.EL表达式可以做基本的逻辑运算和数学运算

例如:
$5>4,$5<4,$5>=4,$5<=4,$5==4
$5+4,$5-4,$5*4,$5/4,$5%4
还有$5+"4",其值为9,因为在EL中没有字符串拼接功能,$5+"a",在页面会显示500的错误,因为在EL中也没有字符的概念。

9.EL表达式中pageContext可以获取pageContext作用域对象本身

例如:
$pageContext

以上是关于JSP中el表达式的取值过程是怎样的?的主要内容,如果未能解决你的问题,请参考以下文章

EL表达式属性的范围

JSP-EL表达式

SpringMVC返回数据给jsp页面(EL表达式取值)

JSPEL表达式语言

EL表达式简单总结

EL表达式&Ognl框架