平时使用jstl、struts2教程时,不知道如何查询各个方法的使用.请问一下你在这方面是怎么做的?

取Session中的值
&c:out value=&${sessionScope.user.userId}&&&/c:out&&br&&&
&c:out value=&${user.userLoginName}&&&/c:out&&br&&&&&
&s:property value=&#session.user.userId&/&&br&&&
${session.user.userId}&br&&&
${sessionScope.user.userId}&br&&&&&&&
4.5节&OGNL
OGNL是Object Graph Navigation Language的简称,详细相关的信息可以参考:。这里我们只涉及Struts2框架中对OGNL的基本支持。
OGNL是一个对象,属性的查询语言。在OGNL中有一个类型为Map的Context(称为上下文),在这个上下文中有一个根元素(root),对根元素的属性的访问可以直接使用属性名字,但是对于其他非根元素属性的访问必须加上特殊符号#。
在Struts2中上下文为ActionContext,根元素位Value Stack(值堆栈,值堆栈代表了一族对象而不是一个对象,其中Action类的实例也属于值堆栈的一个)。ActionContext中的内容如下图:
&&&&&&&&&&&&&&|
&&&&&&&&&&&&&&|--application
&&&&&&&&&&&&&&|
&&&&&&&&&&&&&&|--session
context map---|
&&&&&&&&&&&&&&|--value stack(root)
&&&&&&&&&&&&&&|
&&&&&&&&&&&&&&|--request
&&&&&&&&&&&&&&|
&&&&&&&&&&&&&&|--parameters
&&&&&&&&&&&&&&|
&&&&&&&&&&&&&&|--attr (searches page, request, session, then application scopes)
&&&&&&&&&&&&&&|
因为Action实例被放在Value Stack中,而Value Stack又是根元素(root)中的一个,所以对Action中的属性的访问可以不使用标记#,而对其他的访问都必须使用#标记。
引用Action的属性
&s:property value=&postalCode&/&
ActionContext中的其他非根(root)元素的属性可以按照如下的方式访问:
&s:property value=&#session.mySessionPropKey&/& or
&s:property value=&#session[&mySessionPropKey&]&/& or
&s:property value=&#request[&mySessionPropKey&]/&
Action类可以使用ActionContext中的静态方法来访问ActionContext。
ActionContext.getContext().getSession().put(&mySessionPropKey&, mySessionObject);
OGNL与Collection(Lists,Maps,Sets)
生成List的语法为: {e1,e2,e3}.
&s:select label=&label& name=&name&
list=&{'name1','name2','name3'}& value=&%{'name2'}& /&
上面的代码生成了一个HTML Select对象,可选的内容为:&name1,name2,name3,默认值为:name2。
生成Map的语法为:#{key1:value1,key2:value2}.
&s:select label=&label& name=&name&
list=&#{'foo':'foovalue', 'bar':'barvalue'}& /&
上面的代码生成了一个HTML Select对象,foo名字表示的内容为:foovalue,bar名字表示的内容为:barvalue。
判断一个对象是否在List内存在:
&s:if test=&'foo' in {'foo','bar'}&&
&&&muhahaha
&s:if test=&'foo' not in {'foo','bar'}&&
&&&muhahaha
取得一个List的一部分:
?&&–&&所有满足选择逻辑的对象
^&&-&&&第一个满足选择逻辑的对象
$&&-&&&最后一个满足选择逻辑的对象
person.relatives.{? #this.gender == 'male'}
上述代码取得这个人(person)所有的男性(this.gender==male)的亲戚(relatives)
Lambda&表达式
OGNL支持简单的Lambda表达式语法,使用这些语法可以建立简单的lambda函数。
Fibonacci:
if n==0 return 0;
elseif n==1 return 1;
else return fib(n-2)+fib(n-1);
fib(0) = 0
fib(1) = 1
fib(11) = 89
OGNL的Lambda表达式如何工作呢?
Lambda表达式必须放在方括号内部,#this表示表达式的参数。例如:
&s:property value=&#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)& /&
#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)]定义了一个Lambda表达式,
#fib(11)&调用了这个表达式。
所以上述代码的输出为:89
在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题,
一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文件:
&jsp-config&
&&&&&jsp-property-group&
&&&&&&&url-pattern&*.jsp&/url-pattern&
&&&&&&&el-ignored&true&/el-ignored&
&&&&&/jsp-property-group&
&/jsp-config&
一、EL简介
& 1.语法结构
&&& ${expression}
& 2.[]与.运算符
&&& EL 提供.和[]两种运算符来存取数据。
&&& 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如:
&&&&&&& ${user.My-Name}应当改为${user[&My-Name&] }
&&& 如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
&&&&&&& ${sessionScope.user[data]}中data 是一个变量
&&& EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
&&& 因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
&&& 假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
&&& 属性范围在EL中的名称
&&&&&&& Page&&&&&&&& PageScope
&&&&&&& Request&&&&&&&& RequestScope
&&&&&&& Session&&&&&&&& SessionScope
&&&&&&& Application&&&& ApplicationScope
二、EL隐含对象
& 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.其他隐含对象
& 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运算符
& 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)}
四、EL函数(functions)。
& 语法:ns:function( arg1, arg2, arg3 …. argN)
& 其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置
---------------------------------------------
&%@ taglib prefix=&c& uri=&& %&
&c:forEach items=&${messages}&
var=&item&
varStatus=&var&&
&/c:forEach&
&c:out value=&${logininfo.username}&/&
c:out&将value 中的内容输出到当前位置,这里也就是把logininfo 对象的
username属性值输出到页面当前位置。
${……}是JSP2.0 中的Expression Language(EL)的语法。它定义了一个表达式,
其中的表达式可以是一个常量(如上),也可以是一个具体的表达语句(如forEach循环体中
的情况)。典型案例如下:
? ${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表达式中指定搜寻范围:
${pageScope.logininfo.username}
${requestScope.logininfo.username}
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
在Spring 中,所有逻辑处理单元返回的结果数据,都将作为Attribute 被放
置到HttpServletRequest 对象中返回(具体实现可参见Spring 源码中
org.springframework.web.servlet.view.InternalResourceView.
exposeModelAsRequestAttributes方法的实现代码),也就是说Spring
MVC 中,结果数据对象默认都是requestScope。因此,在Spring MVC 中,
以下寻址方法应慎用:
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
结果为表达式计算结果,即整数值3。
如果变量值i&1的话,将返回bool类型true。与上例比较,可以发现EL会自
动根据表达式计算结果返回不同的数据类型。
表达式的写法与java代码中的表达式编写方式大致相同。
IF / CHOOSE:
&c:if test=&${var.index % 2 == 0}&&
判定条件一般为一个EL表达式。
&c:if&并没有提供else子句,使用的时候可能有些不便,此时我们可以通过&c:choose&
tag来达到类似的目的:
&c:choose&
&c:when test=&${var.index % 2 == 0}&&
&c:otherwise&
&/c:otherwise&
&/c:choose&
类似Java 中的switch 语句,&c:choose&提供了复杂判定条件下的简化处理手法。其
中&c:when&子句类似case子句,可以出现多次。上面的代码,在奇数行时输出“*”号,
而偶数行时输出“!”。
---------------------------------------------
&1&&& EL表达式用${}表示,可用在所有的HTML和JSP标签中 作用是代替JSP页面中复杂的JAVA代码.
&&&&&&& 2&& EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}. ${param}表示返回请求参数中单个字符串的值. ${paramValues}表示返回请求参数的一组值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量.
&&&&&&& 3&& &%@& page isELIgnored=&true&%& 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.
&&&&&&& 4&& EL语言可显示 逻辑表达式如${true and false}结果是false&&& 关系表达式如${5&6} 结果是false&&&& 算术表达式如 ${5+5} 结果是10
&&&&&&& 5&& EL中的变量搜索范围是:page request session application&& 点运算符(.)和&[ ]&都是表示获取变量的值.区别是[ ]可以显示非词类的变量
1.${}是EL语言的 %{}这样的形式是ognl表过式语言的,在struts2的标签内部,使用%{}这样的形式,在标签外部可以使用${}EL语言的方式。如果在struts2的标签内部使用${}这样的方式,会出现以下的错误提示:&
According to TLD or attribute directive in tag file, attribute value does not accept any expressions&
2.很多时候,我们使用struts2的一些标签,属性是需要接受集合的,如果集合是保存在 request,session,或者是值栈(非根对象的栈顶),可以使用#变量名的方式,如果获取的值是在Action中通过特定的方法来获取,就需要使用如 value=&userList&这样的方式,只是去掉了前面的#。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:251493次
积分:2452
积分:2452
排名:第10420名
原创:19篇
转载:82篇
评论:48条
(19)(12)(7)(2)(1)(21)(31)(8)在Action中查询出SQL SERVER表的数据,返回一个list。怎么在JSP页面中使用Struts标签,显示出表中的内容?_百度知道
在Action中查询出SQL SERVER表的数据,返回一个list。怎么在JSP页面中使用Struts标签,显示出表中的内容?
提问者采纳
s;id&;/&&#47:property value=&td&gt你在action中如果有 public String list()throws Exception{
UserDaoImp ud=new UserDaoImp();&就可以了;&td&gt.put(&quot.getAll();name&
&lt:iterator value=&&list&
&lt:property value=&td&&/User&gt:property value=&quot:iterator&;
}这种的话;td&& list=/td&
return &s;&lt,在页面中可以这样写;&&list&/s,list);
&tr&gt.list&s;
List&s;#tr&td&/password&/&&lt, &/
其他类似问题
为您推荐:
其他2条回答
给你截取一小段,全文到上面网址自己看吧。
Struts2安全缺陷
可以看到struts2在数据流向方面,有两个重点,一个是进入(in),一个是输出(out)。而我在做漏洞挖掘的思路,也是跟着这个数据的流 程,开始分析的,下面我们就开始让数据进入。
Action属性默认值可以被覆盖缺陷:
在日常的java项目中,我们经常会遇到保存一个新的对象(比如注册一个用户),然后给这个对象赋予一些用户提交上来的属性值,在这里,只需要定义 一个对象类:
public class User {
private Long id=0l;
private Integer type=1;
。。。下面的get和set方法代码略
定义后,在action中,添加一个属性
用户注册的页面代码如下:
&form XX...
把要展示的信息定义为一个存储对象(DTO对象)把DTO放入List 。在Action中 request.setAttribute(&list&,List);在jsp中就可以用struts标签接收了。先用&logic:iterator& 循环 再用&bean:write & 把数据打印了。
struts的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1166人阅读
struts2(1)
1.以前一直使用jstl标签,后来也开始使用struts2的一些标签,毕竟struts2的有些标签使用起来还是比较方便
项目中常常会出现struts2标签和jstl标签混和用的情况,比如在自定义标签或者在循环标签等
1.在jstl中使用struts2
1.&c:forEach var=&ee& items=&${requestScope.serviceList}& &&&
2.&&&& jstl:&c:out value=&${ee.id}&&&/c:out&&&
3.&&&& el:${ee.id}&&
4.&&&& struts2: &s:property value=&#attr.ee.id&/&&&
5.&/c:forEach&&
& c:forEach var=&ee& items=&${requestScope.serviceList}& &
&&&&&&&& jstl:&c:out value=&${ee.id}&&&/c:out&
&&&&&&&& el:${ee.id}
&&&&&&&& struts2: &s:property value=&#attr.ee.id&/&
&/c:forEach&
通过struts2标签取jstl标签的变量时,如果有设置scope,可以从scope中取值
如果没有就需要用#attr来取值
2.从jstl标签中获取值
1.&c:set var=&ctime& value=&${el.createtime}& scope=&request&/&&&
2.&c:set var=&ctime2& value=&${el.createtime}& /&&&
3.&s:property value=&#request.ctime&/&&&
4.&s:property value=&#attr.ctime2&/&&
& c:set var=&ctime& value=&${el.createtime}& scope=&request&/&
& c:set var=&ctime2& value=&${el.createtime}& /&
& s:property value=&#request.ctime&/&
& s:property value=&#attr.ctime2&/&[/code]3.在struts2标签中使用jstl
1.&s:iterator value=&#request.serviceList& id=&bs&&&&
2.&&& struts2:&s:property value=&#bs.keyid&/&&&
3.&&& el:${bs.keyid}&&
4.&&& jstl:&c:out value=&${bs.keyid}&&&/c:out&&&
5.&/s:iterator&&
& s:iterator value=&#request.serviceList& id=&bs&&
&&&&&&& struts2:&s:property value=&#bs.keyid&/&
&&&&&&& el:${bs.keyid}
&&&&&&& jstl:&c:out value=&${bs.keyid}&&&/c:out&
&/s:iterator&
4.从struts2标签中取值
1.&!-- 数字类型 --&&&
2.&s:set name=&pp& value=&11&&&/s:set&&&&&&&
3.struts2:&s:property value=&#pp&/&&&
4.el:${pp}&&
5.jstl:&c:out value=&${pp}&&&/c:out&&&&&
6.&!-- 字符串类型 --&&&
7.&s:set name=&pp2& value=&'abc'& scope=&request&&&/s:set&&&
8.struts2:&s:property value=&#request.pp2&/&&&
9.el:${pp2}&&
10.jstl:&c:out value=&${pp2}&&&/c:out&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:17918次
排名:千里之外
原创:10篇
转载:10篇
(1)(1)(4)(2)(5)(1)(4)(2)Struts2 缺点 至少5条?_百度知道
Struts2 缺点 至少5条?
我有更好的答案
一、 转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的 jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之 后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统,这样的操作简单不可想象。现在就是这样, 几十上百个人同时在线使用我们的系统,大家可以想象一下,我的烦恼有多大。
二、 Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了 线程安全的问题。
三、 测试不方便. Struts的每个 Action都同Web层耦合在一起,...
我问的是Struts2的缺点
1Struts2中Action中取得从jsp中传过来的参数时还是有点麻烦、Action属性默认值可以被覆盖缺陷、2struts2把所有public的方法都暴露了出去,导致现在用户输入了 userlogin!list.action 用户访问这个链接后,struts2调用list方法,然后返回结果给用户,所以没有登陆,就显示了所有用户信息、action中的属性定义有缺陷,都得是public的、3返回类型有缺陷,知道的就这点了
其他类似问题
为您推荐:
您可能关注的推广
struts2的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 struts2教程 的文章

 

随机推荐