- 浏览: 187282 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xiaoqiangcn:
-->使用Spring测试套件,Spring容器只会初始 ...
spring junit完美解决方案 -
huomiam:
wei5201 写道ynyee 写道@ContextConfi ...
spring junit完美解决方案 -
ae6623:
@Test
//@Ignore
public void ...
集合操作工具类CollectionUtils -
hejun5918:
java.lang.NoSuchMethodError: or ...
spring junit完美解决方案 -
u010100704:
垃圾垃圾垃圾垃圾垃圾垃圾垃圾垃圾垃圾
实用的json工具类gson
OGNL表达式语言很抽象,按下面的方式应该很好理解,解释了我们为什么在struts2的action中能为复合类型的属性赋值,以及我们为什么可以在jsp页面里使用ongl表达式(从request,session,application中取值等)
Struts2的OGNL表达式语言是基于Xwork的OGNL的,它在Xwork的基础上对OGNL进行了一些封装,因此先了解Xwork的OGNL是十分有必要的。Xwork的OGNL使用时比较容易理解。它有两个重要的概念:上下文环境和根对象。上下文环境是一个Map对象,所有的数据存取都是在上下文环境中进行的,你可以在存取数据时指定不同Map作为上下文环境。访问根对象时不需要加#前缀,而访问上下文环境中的其它对象需要加入#前缀。
Xwork中的OGNL通过Ognl类操作数据。
Java代码
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Object name = Ognl.getValue(Ognl.parseExpression("name"), user);
System.out.println(name);
}
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Object name = Ognl.getValue(Ognl.parseExpression("name"), user);
System.out.println(name);
}
以上代码将User作为根对象(可以参见Ognl的API),访问其name属性,所以不需要前缀#,输出lijie。
Java代码
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
Object name = Ognl.getValue(Ognl.parseExpression("name"), context,user);
System.out.println(name);
}
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
Object name = Ognl.getValue(Ognl.parseExpression("name"), context,user);
System.out.println(name);
}
上述代码将Map对象context作为上下文,user是其中的根对象,所以直接访问name属性,输出lijie。
Java代码
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
context.put("country", "China");
Object country = Ognl.getValue(Ognl.parseExpression("#country"), context,user);
System.out.println(country);
}
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
context.put("country", "China");
Object country = Ognl.getValue(Ognl.parseExpression("#country"), context,user);
System.out.println(country);
}
上述代码在context上下文中加入了一个String对象country,由于country不是根对象,所以访问时必须加前缀#,否则会抛出异常,指明根对象中没有country属性。上述代码输出China。
Java代码
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Ognl.setValue("name", user, "Tom");
System.out.println(user.getName());
}
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Ognl.setValue("name", user, "Tom");
System.out.println(user.getName());
}
上述代码向User对象设置,输出Tom。
Struts2中的OGNL表达式语言是对Xwork的OGNL的封装。我们要理解一下几点:
1. Struts2中将ActionContext作为OGNL的上下文环境(ActionContext内部含有一个Map对象)
2. Struts2中的OGNL表达式语言的根对象是一个ValueStack,ValueStack中的每一个对象都被视为根对象。
Struts2框架将实例化的Action对象放入ValueStack中,如果是Action链,则多个Action都存在于ValueStack中。而ValueStack中除了Action外,Struts2框架还将parameters,request,response,session,application,attr等对象放到ActionContext中,访问这些对象需要加前缀#。
总结:Struts2中的数据处理基于Xwork的OGNL,它在OGNL的基础上进行了一定的封装。OGNL的核心概念是根对象(root)和上下文环境(context)---你可以传入一个Map对象作为上下文,向其中put进一个对象,那么这个对象可以作为根对象(ognl中可以向函数中传入不同的Map对象作为根对象来操作,也可以指定不同的根对象,而Struts2中,它固定了根对象ValueStack)。在Struts2中,ActionContext作为OGNL的上下文环境,它的根对象是一个ValueStack,ValueStack中的每个对象都被视为根对象。Struts2中的Action作为根对象存在(如果多个Action以chain的形式存在,则多个Action均存在于ValueStack中,均为根对象)。
以上是我大概的理解,具体的细节大家可以参考一些资料,不妥之处,希望大家批评指正。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
以下,为摘抄别人的ongl表达式:
struts2总结之 OGNL表达式(2010-02-23 12:19:52)
最近的项目开发中使用了struts2的框架,但是好多人都不清楚struts2的标签的具体的用法,要想完全掌握struts2标签的用法,那么你必须先精通了struts2中OGNL的用法。struts2中很多东西其实理解就行,但是惟独OGNL虽然内容不多,但是确必须的精通,这是学习struts2的基础。
Struts2 中内置了OGNL表达式的支持,使得Struts2的具有比Struts1更为强大的数据访问的功能。本文主要讲解OGNL的使用方法,并不会去讲解一些原理性的东西,想要了解的朋友可以自己去查阅相关的资料
在OGNL的使用主要分以下部分来讲解:1.使用OGNL访问对象(不同范围的取值)
2.OGNL的集合操作(OGNL元素符,以及过滤和投影功能)
3.OGNL访问静态成员(怎么访问静态成员)
4. lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结(在总结之后会详解Struts2的标签的使用)
一、使用OGNL访问对象
1 读取struts2中的ValueStack中的值
struts2中引入了ValueStack的概念,在struts2中默认使用ValueStack作为OGNL的StackContext的根元素
OGNL在读取根元素的时候能够直接进行读取
假设action中有
private Cat cat; private Dog dog; 俩个对象,那么在jsp页面读取方法就是
<s:property value="cat.name"/> 读取Cat的name属性的值
<s:property value="dog.name"/> 读取Dog的name属性值
2 使用#读取parameters request session application 范围内的值()
<s:property value="#request.id"/> 相当于 request.getAttribute("id")
<s:property value="#parameters.id"/> 相当于 request.getParameter("id")
<s:property value="#session.id"/> 相当于 session.getAttribute("id")
<s:property value="#application.id"/> 相当于 application.getAttribute("id")
<s:property value="#attr.id"/> 依次搜索PageContext HttpServletRequest HttpSession ServletContext 范围 ,查找属性,找到为止
二、OGNL的集合操作
1 创建一个集合
{e1,e2,e3} 直接创建一个List类型的集合
#{Key1:Value1,Key2:Value2} 构建一个Map类型的集合
使用: <s:set name="sex" value="#{'1':'男','2':'女'}"/>
<s:property value="#sex[id]"/> 在ValueStack范围内找到id的值, 并用它作为key去查找对应的
value 并显示出来
2 OGNL元素符
对于集合,OGNL提供了两个元素符:in和not in,其中in判断某个元素是否在指定集合中;not in则用于
判断某个元素是否不在指定集合中。
判断一个对象是否在List内存在:
<s:if test="'foo' in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
<s:if test="'foo' not in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
3 过滤与投影集合
假设有一个books的List集合存在于ValueStack中,存放了多个Book类型的对象
我们可以通过这样进行过滤取值
<s:iterator value="books.{?#this.price>35}"> 这样只会取到价格大于35的书籍,很好的起到了过滤的
作用,
?取出所有符合逻辑的元素
^ 取出符合逻辑的第一个元素
$ 取出符合逻辑的最后一个元素
三、OGNL访问静态成员
在实际的开发中像页面的参数传递是绝对拒绝使用硬编码的,最好的解决方式有2种:一种是写在国际化配置文件中;另外的一种就是建立一个类,专门维护静态成员,所有硬编码的地方都调用它就可以了。
struts2 中默认提供了一些访问静态成员的方式,但是默认是关闭的,所以应该在struts2的配置文件中先设置
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
设置之后就可以用以下的表达式来访问静态成员了。
1 访问静态方法
<s:property value="@com.netsdar.song.manager.util.AppUtil@getName()"/>
2 访问静态常量
<s:property value="@com.netsdar.song.manager.util.AppUtil@Index_Title"/>
四、lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结
1 lambda表达式
这个表达式,我其实也很少去用,这里给大家拿个例子讲解一下吧
<s:property value="#conv =:[#this==1?'男':#this==2?'女':''], #conv(1)" />
这句的作用就是,value="#conv =: 定义一个函数 conv
[#this==1?'男' 定义 conv(1)=男
#this==2?'女' 定义 conv(2)=女
当然这个只是一个简单的例子,这里支持复杂的函数运算。对于一些简单的逻辑更推荐使用struts2的标签来处理。复杂点的不做具体讲解,引用别人的一个例子
例如:
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) 调用了这个表达式。
2 总结
这里主要讲解一下使用注意事项
<s:url value="#foobar['foo1']"> 如果你这样使用标签 ,那么它绝对不会是你想要的,它会按照你的
输入原样的输出的 #foobar['foo1']
正确的使用: <s:url value="%{#foobar['foo1']}"> %{} 用于对括号内用ognl求值
struts2的action,大家都习惯了生成get与set方法,其实新版的没有这俩个方法也能插值进去的,它采用了java的反射机制来实现,不过官方还是建议按照旧的方法用。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jsp页面代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.rao.bean.Sex"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My page</title>
<s:head theme="xhtml"/>
<sx:head parseContent="true"/>
</head>
<body>
Struts 2.1 Tags
<br/>
<br/>
一、控制标签<br/><hr size="3" color="red">
#、if /elseif/ else @用于逻辑判断<br/>
<s:set name="bir" value="-12"></s:set>
<s:if test="#bir>=180 || #bir<0">
你是何方妖怪?
</s:if>
<s:elseif test="#bir<=18 && #bir>=0">
未成年人不能进入!
</s:elseif>
<s:elseif test="#bir<=60 && #bir>=18">
您已经成年!
</s:elseif>
<s:else>
您已经老了!
</s:else>
<br/>--------------------------------------------------------------<br/>
#、append @用于将多个集合合并<br/>
<s:set name="appList1" value="{'111','222','333','444'}"></s:set>
<s:set name="appList2" value="{'aaa','bbb','ccc','ddd'}"></s:set>
<s:append var="newAppList">
<s:param value="appList1"></s:param>
<s:param value="appList2"></s:param>
</s:append>
<s:iterator value="#newAppList">
<s:property/> |
</s:iterator>
<br/>--------------------------------------------------------------<br/>
#、generator <br/>
generator标签,该标签可以将指定字符串按指定分隔符分割成多个字串。生成的多个字串可以用iterator标签进行迭代输出。可以这么理解:generator标签将一个字符串转换成一个List集合。在该标签体内,整个临时生成的集合将为Valuestack的顶端,但一旦该标签结束,生成的集合将被移除Valuestack。generator标签有如下几个属性:
<br/>
1、count属性:指定生成集合中元素的总数。可选属性。<br/>
2、val属性:必填属性,指定被解析的字符串。<br/>
3、separator属性:这是一个必填属性,指定用于分割字符串的分隔符。<br/>
4、converter属性:可选属性,指定一个转换器,转换器负责将生成的集合中的每个字符串转换成对象,通过这个转换器可以将一个含有分隔符的字符串解析成对象的集合。转换器必须一个继承org.apache.struts2.util.IteratorGenerator.Converter的对象。
<br/>
5、var属性,可选属性。如果指定了该属性,则将生成的集合保存在Stack Context中。如果不指定该属性,则将生成的集合放入ValueStack的顶端,该标签一结束,生成的集合就被移除。该属性也可替换成id。
<br/>
<s:generator val="'aaa,bbb,ccc,ddd'" separator="," count="2">
<s:iterator>
<s:property/>
</s:iterator>
</s:generator><br/>
<br/>--------------------------------------------------------------<br/>
#、iterator 用于迭代数据<br/>
<s:set name="iterList" value="{'aaa','bbb','ccc','ddd'}"></s:set>
<table border="1">
<tr>
<td> 索引 </td>
<td> 值 </td>
<td> 奇? </td>
<td> 偶? </td>
<td> 首? </td>
<td> 尾? </td>
<td> 当前迭代数量 </td>
</tr>
<s:iterator value="{'aaa','bbb','ccc','ddd','eee','fff'}" begin="1" status="s">
<tr bgcolor="<s:if test="#s.odd">pink</s:if>">
<td><s:property value="#s.index"/></td>
<td><s:property/></td>
<td><s:property value="#s.even"/></td>
<td><s:property value="#s.odd"/></td>
<td><s:property value="#s.first"/></td>
<td><s:property value="#s.last"/></td>
<td><s:property value="#s.count"/></td>
</tr>
</s:iterator>
</table>
<br/>--------------------------------------------------------------<br/>
#、merge @和类似:用于将多个集合合并<br/>
<s:set name="merList1" value="{'111','222','333','444'}"></s:set>
<s:set name="merList2" value="{'aaa','bbb','ccc','ddd'}"></s:set>
<s:append var="newMerList">
<s:param value="merList1"></s:param>
<s:param value="merList2"></s:param>
</s:append>
<s:iterator value="#newMerList">
<s:property/> |
</s:iterator>
<br/>--------------------------------------------------------------<br/>
#、sort @用于排序<br/>
<s:bean var="myComparator" name="com.rao.comparator.MyComparator"></s:bean>
<s:sort comparator="#myComparator" source="{1,45,56,0,345,3}">
<s:iterator>
<s:property/>,
</s:iterator>
</s:sort>
<br/>--------------------------------------------------------------<br/>
#、subset @用户截取集合中的子集; 注:decider:可选属性,指定由开发者自己决定是否选中该元素.
<br/>
<s:set name="subList" value="{'@@@','***','&&&','###'}"></s:set>
<s:subset source="#subList" start="1" count="2">
<s:iterator>
<s:property/>,
</s:iterator>
</s:subset>
<br/>--------------------------------------------------------------<br/>
二、数据标签<br/>
<hr size="3" color="red">
#、action @用于导入一个Action<br/>
使用action标签,可以允许在jsp页面中直接调用Action,在调用Action时候,可以指定需要被调用的Action的name和namespace.如果指定了executeResult参数的属性值为true,该标签会把Action的处理结果(视图资源)包含到本页面中. 使用action标签指定属性有:
<br/>
id: 可选属性,作为该Action的引用ID <br/>
name:必选属性,指定调用Action <br/>
namespace:可选属性,指定该标签调用Action所属namespace <br/>
executeResult:可选属性,指定是否将Action的处理结果包含到本页面中.默认值为false,不包含. <br/>
ignoreContextParam:可选参数,指定该页面的请求参数是否需要传入调用的Action中,默认值是false,即传入参数.<br/>
s:param是以request方式的值的,而不是以参数传值,所以request.getParameter("")会获取不到值,通过request.getAttribute("")方式可以获取<br/>
<s:action name="tagsAction1" ignoreContextParams="true" executeResult="true" namespace="/com/rao">
<s:param name="userName" value="'三毛'"></s:param>
</s:action>
<br/>--------------------------------------------------------------<br/>
#、bean @用于导入一个javaBean,相当于:jsp:useBean 标签<br/>
<s:bean name="com.rao.bean.UserBean" var="user">
<s:param name="userId" value="1001"></s:param>
<s:param name="userName" value="'张三'"></s:param>
</s:bean>
userId:<s:property value="#user.userId"/><br>
userName:<s:property value="#user.userName"/>
<br/>--------------------------------------------------------------<br/>
#、date @用于格式化日期<br/>
<s:set name="dt" value="new java.util.Date()"></s:set>
当期系统时间是:<s:date name="dt" format="yyyy-MM-dd HH:ss:mm"/>
<br/>--------------------------------------------------------------<br/>
#、debug @用于调试程序,让开发人员一目了然的知道当前请求、值栈、栈中的各项参数<br/>
<s:debug/>
<br/>--------------------------------------------------------------<br/>
#、i18n @用于访问国际化资源文件的内容<br/>
1.默认访问全局范围内的资源文件;
<br>
<s:text name="welcome">
<s:param>三毛</s:param>
<s:param>学习</s:param>
</s:text>
<hr>
2.访问包范围内的资源文件;
<br>
<s:i18n name="com/rao/action/package">
<s:text name="welcome">
<s:param>三毛</s:param>
<s:param>学习</s:param>
</s:text>
</s:i18n>
<hr>
3.访问Action范围内的资源文件;
<br>
<s:i18n name="com/rao/action/GlobalNativeAction">
<s:text name="welcome">
<s:param>三毛</s:param>
<s:param>学习</s:param>
</s:text>
</s:i18n>
<br/>--------------------------------------------------------------<br/>
#、include @用于导入一个jsp文件,等同于:jsp:include标签<br/>
<s:include value="success.jsp"></s:include>
<br/>--------------------------------------------------------------<br/>
#、param @用于给指定参数设置值<br/>
<s:bean name="com.rao.bean.UserBean" var="user">
<s:param name="userId" value="1001"></s:param>
<s:param name="userName" value="'张三'"></s:param>
</s:bean>
userId:<s:property value="#user.userId"/><br>
userName:<s:property value="#user.userName"/>
<br/>--------------------------------------------------------------<br/>
#、property @输出结果,很像EL表达式,但是可以依托于OGNL表带是很强大<br/>
同上
<br/>--------------------------------------------------------------<br/>
#、push @该标签可以把程序员在ActionContext中引用的对像压入valuestack中,为以后访问对象提供了方便<br/>
<s:push value="#request.user"><s:property value="userName"/></s:push>
<br/>--------------------------------------------------------------<br/>
#、set @用户声明对象或属性<br/>
<s:set name="uName" value="#request.user.userName"></s:set>
<s:property value="#uName"/>,你好啊!
<br/>--------------------------------------------------------------<br/>
#、text @用户获取国际化资源文件的内容<br/>
请参考 il8n标签
<br/>--------------------------------------------------------------<br/>
#、url @用于组拼一个请求路径<br/>
<s:url var="url1" action="MyAction" method="add">
<s:param name="id" value="%{23}"></s:param>
<s:param name="name" value="%{'tom'}"></s:param>
</s:url>
<s:property value="#url1"/>
<br/>
注意:<br/>
<s:set name="myurl" value="'http://www.baidu.com'"></s:set>
value以字符处理: <s:url value="#myurl"></s:url><br>
value明确指定以ognl表达式处理: <s:url value="%{#myurl}"></s:url>
<br/>--------------------------------------------------------------<br/>
三、UI标签<br/>
<hr size="3" color="red">
<s:form>
#、checkboxlist @复选框列表<br>
1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
name:checkboxlist的名字<br>
list:checkboxlist要显示的列表<br>
value:checkboxlist默认被选中的选项,checked=checked<br>
<s:checkboxlist theme="simple" name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" ></s:checkboxlist>
<br>
2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
name:checkboxlist的名字<br>
list:checkboxlist要显示的列表<br>
listKey:checkbox 的value的值<br>
listValue:checkbox 的lablel(显示的值)<br>
value:checkboxlist默认被选中的选项,checked=checked<br>
<s:checkboxlist theme="simple" name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" ></s:checkboxlist>
<br/>--------------------------------------------------------------<br/>
#、combobox <br/>
<s:combobox theme="simple" label="选择你喜欢的颜色" name="colorNames" headerValue="------请选择------" headerKey="1" list="{'红','橙','黄','绿','青','蓝','紫'}" />
<br/>--------------------------------------------------------------<br/>
#、radio @单选框<br/>
<%
Sex sex1 = new Sex(1,"男");
Sex sex2 = new Sex(2,"女");
List<Sex> list = new ArrayList<Sex>();
list.add(sex1);
list.add(sex2);
request.setAttribute("sexs",list);
%>
这个与checkboxlist差不多;<br>
1>.如果集合为javabean:<s:radio theme="simple" name="sex" list="#request.sexs" listKey="id" listValue="name"></s:radio><br>
2>.如果集合为list:<s:radio theme="simple" name="sexList" list="{'男','女'}"></s:radio><br>
3>.如果集合为map:<s:radio theme="simple" name="sexMap" list="#{1:'男',2:'女'}" listKey="key" listValue="value"></s:radio><br>
<hr>
<br/>--------------------------------------------------------------<br/>
#、select @下拉列表框<br/>
这个与s:checkboxlist差不多;<br>
1>.如果集合为javabean:<s:select theme="simple" name="sex" list="#request.sexs" listKey="id" listValue="name"></s:select><br>
2>.如果集合为list:<s:select theme="simple" name="sexList" list="{'男','女'}"></s:select><br>
3>.如果集合为map:<s:select theme="simple" name="sexMap" list="#{1:'男',2:'女'}" listKey="key" listValue="value"></s:select><br>
<br/>--------------------------------------------------------------<br/>
#、doubleselect @级联菜单 <br/>
<!-- 可以用直接指定,当然也可以跟数据库绑定的 -->
<s:set name="proviList" value="{'江西省','湖北省'}"></s:set>
<s:set name="jxList" value="{'南昌市','赣州市','九江市','上饶市','鹰潭市'}"></s:set>
<s:set name="hbList" value="{'武汉市','恩施市','十堰市','荆州市','襄樊市'}"></s:set>
<s:doubleselect theme="simple" name="provi" doubleList="top=='江西省' ? #jxList : #hbList" list="#proviList" doubleName="city"></s:doubleselect>
<br/>--------------------------------------------------------------<br/>
#、optiontransferselect <br/>
<s:optiontransferselect theme="simple" label="change" name="abc" doubleList="{'111','222','333','444'}" list="{'aaa','bbb','ccc','ddd'}" doubleName="number"></s:optiontransferselect>
<br/>--------------------------------------------------------------<br/>
#、updownselect @可上下选择的select <br/>
<s:updownselect label="selectCity" emptyOption="true" name="selectCity" list="#jxList" headerValue="-Please Select The City-" headerKey="-1"></s:updownselect>
<br/>--------------------------------------------------------------<br/>
#、sx:datetimepicker @日期选择控件 <br/>
使用步骤:声明:我这里用的是strut 2.1.8.1,在struts2.0的版本中可能有所不同;<br/>
1.导入struts2-dojo-plugin-2.1.8.1.jar DoJo 插件包;<br/>
2. 导入标签:<%--@ taglib prefix="sx" uri="/struts-dojo-tags"--%>;<br/>
3.在需要使用的页面中的head标签之间加上<%-- <sx:head parseContent="true"/> --%>;<br/>
<sx:datetimepicker label="birthday" name="bir" value="#dt"></sx:datetimepicker>
<br/>--------------------------------------------------------------<br/>
#、sx:tabbedpanel @选项卡控件 <br/>
声明:这个标签代码转至:http://blog.sina.com.cn/s/blog_6145ed810100ecud.html,版权归作者所有;写的挺好拿来大家共同学习。
<!-- tabbedpanel标签 -->
<!-- 最简单的选项卡,两个选项卡加载都是本页面 -->
<hr color="blue">
<b>最简单的选项卡:</b>
<br>
<sx:tabbedpanel id="tab1" beforeSelectTabNotifyTopics="/beforeSelect">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 加载其他页面的选项卡 -->
<hr color="blue">
<b>加载其他页面的选项卡:</b>
<br>
<sx:tabbedpanel id="tab2">
<sx:div label="Remote Tab 1" href="upload.jsp">
Remote Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="multipleUpload.jsp" >
Remote Tab 1
</sx:div>
</sx:tabbedpanel>
<!-- 设置选项卡底下的内容懒加载,即等需要的时候再加载,使用属性preload="false"-->
<hr color="blue">
<b>设置选项卡底下的内容懒加载,即等需要的时候再加载,使用属性preload="false":</b>
<br>
<sx:tabbedpanel id="tab3">
<sx:div label="Remote Tab 1" href="upload.jsp">
Remote Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="multipleUpload.jsp" preload="false">
Remote Tab 1
</sx:div>
</sx:tabbedpanel>
<!-- 固定大小的选项卡 -->
<hr color="blue">
<b>固定大小的选项卡,使用属性cssStyle和doLayout:</b>
<br>
<sx:tabbedpanel cssStyle="width: 200px; height: 100px;" doLayout="true" id="tab4">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 每次点击选项卡时都重新刷新内容 -->
<hr color="blue">
<b>每次点击选项卡时都重新刷新内容,使用属性refreshOnShow:</b>
<br>
<sx:tabbedpanel id="tab5">
<sx:div label="Remote Tab 1" href="upload.jsp" refreshOnShow="true">
Remote Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="multipleUpload.jsp" refreshOnShow="true">
Remote Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 使得其中一个选项卡失效 -->
<hr color="blue">
<b>使得其中一个选项卡失效:</b>
<br>
<sx:tabbedpanel id="tab6">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" disabled="true">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 设置选项卡在底部显示 (可以是: top, right, bottom, left) -->
<hr color="blue">
<b>设置选项卡在底部显示 (可以是: top, right, bottom, left):</b>
<br>
<sx:tabbedpanel id="tab7" labelposition="bottom" cssStyle="width:200px;height:100px;" doLayout="true">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 设置选项卡允许关闭,使用属性closeable -->
<hr color="blue">
<b>设置选项卡允许关闭,使用属性closeable:</b>
<br>
<sx:tabbedpanel id="tab8">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" closable="true">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<br/>--------------------------------------------------------------<br/>
#、sx:textarea @textarea控件 <br/>
<sx:textarea label="简介" value="sx:textareasx:textareasx:<br/>textareasx:textareasx:textareasx:<br/>textareasx:textareasx:<br/>textareasx:textarea"></sx:textarea>
<br/>--------------------------------------------------------------<br/>
#、sx:tree @树控件 <br/>
<sx:tree id="tree1" label="根节点">
<sx:treenode id="tn1" label="财务部" />
<sx:treenode id="tn2" label="开发部">
<sx:treenode id="tn3" label="JAVA" />
<sx:treenode id="tn4" label=".NET" />
</sx:treenode>
<sx:treenode id="tn5" label="人事部" />
</sx:tree>
</s:form>
</body>
</html>
Struts2的OGNL表达式语言是基于Xwork的OGNL的,它在Xwork的基础上对OGNL进行了一些封装,因此先了解Xwork的OGNL是十分有必要的。Xwork的OGNL使用时比较容易理解。它有两个重要的概念:上下文环境和根对象。上下文环境是一个Map对象,所有的数据存取都是在上下文环境中进行的,你可以在存取数据时指定不同Map作为上下文环境。访问根对象时不需要加#前缀,而访问上下文环境中的其它对象需要加入#前缀。
Xwork中的OGNL通过Ognl类操作数据。
Java代码
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Object name = Ognl.getValue(Ognl.parseExpression("name"), user);
System.out.println(name);
}
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Object name = Ognl.getValue(Ognl.parseExpression("name"), user);
System.out.println(name);
}
以上代码将User作为根对象(可以参见Ognl的API),访问其name属性,所以不需要前缀#,输出lijie。
Java代码
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
Object name = Ognl.getValue(Ognl.parseExpression("name"), context,user);
System.out.println(name);
}
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
Object name = Ognl.getValue(Ognl.parseExpression("name"), context,user);
System.out.println(name);
}
上述代码将Map对象context作为上下文,user是其中的根对象,所以直接访问name属性,输出lijie。
Java代码
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
context.put("country", "China");
Object country = Ognl.getValue(Ognl.parseExpression("#country"), context,user);
System.out.println(country);
}
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Map context = new HashMap();
context.put("user", user);
context.put("country", "China");
Object country = Ognl.getValue(Ognl.parseExpression("#country"), context,user);
System.out.println(country);
}
上述代码在context上下文中加入了一个String对象country,由于country不是根对象,所以访问时必须加前缀#,否则会抛出异常,指明根对象中没有country属性。上述代码输出China。
Java代码
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Ognl.setValue("name", user, "Tom");
System.out.println(user.getName());
}
public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");
Ognl.setValue("name", user, "Tom");
System.out.println(user.getName());
}
上述代码向User对象设置,输出Tom。
Struts2中的OGNL表达式语言是对Xwork的OGNL的封装。我们要理解一下几点:
1. Struts2中将ActionContext作为OGNL的上下文环境(ActionContext内部含有一个Map对象)
2. Struts2中的OGNL表达式语言的根对象是一个ValueStack,ValueStack中的每一个对象都被视为根对象。
Struts2框架将实例化的Action对象放入ValueStack中,如果是Action链,则多个Action都存在于ValueStack中。而ValueStack中除了Action外,Struts2框架还将parameters,request,response,session,application,attr等对象放到ActionContext中,访问这些对象需要加前缀#。
总结:Struts2中的数据处理基于Xwork的OGNL,它在OGNL的基础上进行了一定的封装。OGNL的核心概念是根对象(root)和上下文环境(context)---你可以传入一个Map对象作为上下文,向其中put进一个对象,那么这个对象可以作为根对象(ognl中可以向函数中传入不同的Map对象作为根对象来操作,也可以指定不同的根对象,而Struts2中,它固定了根对象ValueStack)。在Struts2中,ActionContext作为OGNL的上下文环境,它的根对象是一个ValueStack,ValueStack中的每个对象都被视为根对象。Struts2中的Action作为根对象存在(如果多个Action以chain的形式存在,则多个Action均存在于ValueStack中,均为根对象)。
以上是我大概的理解,具体的细节大家可以参考一些资料,不妥之处,希望大家批评指正。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
以下,为摘抄别人的ongl表达式:
struts2总结之 OGNL表达式(2010-02-23 12:19:52)
最近的项目开发中使用了struts2的框架,但是好多人都不清楚struts2的标签的具体的用法,要想完全掌握struts2标签的用法,那么你必须先精通了struts2中OGNL的用法。struts2中很多东西其实理解就行,但是惟独OGNL虽然内容不多,但是确必须的精通,这是学习struts2的基础。
Struts2 中内置了OGNL表达式的支持,使得Struts2的具有比Struts1更为强大的数据访问的功能。本文主要讲解OGNL的使用方法,并不会去讲解一些原理性的东西,想要了解的朋友可以自己去查阅相关的资料
在OGNL的使用主要分以下部分来讲解:1.使用OGNL访问对象(不同范围的取值)
2.OGNL的集合操作(OGNL元素符,以及过滤和投影功能)
3.OGNL访问静态成员(怎么访问静态成员)
4. lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结(在总结之后会详解Struts2的标签的使用)
一、使用OGNL访问对象
1 读取struts2中的ValueStack中的值
struts2中引入了ValueStack的概念,在struts2中默认使用ValueStack作为OGNL的StackContext的根元素
OGNL在读取根元素的时候能够直接进行读取
假设action中有
private Cat cat; private Dog dog; 俩个对象,那么在jsp页面读取方法就是
<s:property value="cat.name"/> 读取Cat的name属性的值
<s:property value="dog.name"/> 读取Dog的name属性值
2 使用#读取parameters request session application 范围内的值()
<s:property value="#request.id"/> 相当于 request.getAttribute("id")
<s:property value="#parameters.id"/> 相当于 request.getParameter("id")
<s:property value="#session.id"/> 相当于 session.getAttribute("id")
<s:property value="#application.id"/> 相当于 application.getAttribute("id")
<s:property value="#attr.id"/> 依次搜索PageContext HttpServletRequest HttpSession ServletContext 范围 ,查找属性,找到为止
二、OGNL的集合操作
1 创建一个集合
{e1,e2,e3} 直接创建一个List类型的集合
#{Key1:Value1,Key2:Value2} 构建一个Map类型的集合
使用: <s:set name="sex" value="#{'1':'男','2':'女'}"/>
<s:property value="#sex[id]"/> 在ValueStack范围内找到id的值, 并用它作为key去查找对应的
value 并显示出来
2 OGNL元素符
对于集合,OGNL提供了两个元素符:in和not in,其中in判断某个元素是否在指定集合中;not in则用于
判断某个元素是否不在指定集合中。
判断一个对象是否在List内存在:
<s:if test="'foo' in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
<s:if test="'foo' not in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
3 过滤与投影集合
假设有一个books的List集合存在于ValueStack中,存放了多个Book类型的对象
我们可以通过这样进行过滤取值
<s:iterator value="books.{?#this.price>35}"> 这样只会取到价格大于35的书籍,很好的起到了过滤的
作用,
?取出所有符合逻辑的元素
^ 取出符合逻辑的第一个元素
$ 取出符合逻辑的最后一个元素
三、OGNL访问静态成员
在实际的开发中像页面的参数传递是绝对拒绝使用硬编码的,最好的解决方式有2种:一种是写在国际化配置文件中;另外的一种就是建立一个类,专门维护静态成员,所有硬编码的地方都调用它就可以了。
struts2 中默认提供了一些访问静态成员的方式,但是默认是关闭的,所以应该在struts2的配置文件中先设置
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
设置之后就可以用以下的表达式来访问静态成员了。
1 访问静态方法
<s:property value="@com.netsdar.song.manager.util.AppUtil@getName()"/>
2 访问静态常量
<s:property value="@com.netsdar.song.manager.util.AppUtil@Index_Title"/>
四、lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结
1 lambda表达式
这个表达式,我其实也很少去用,这里给大家拿个例子讲解一下吧
<s:property value="#conv =:[#this==1?'男':#this==2?'女':''], #conv(1)" />
这句的作用就是,value="#conv =: 定义一个函数 conv
[#this==1?'男' 定义 conv(1)=男
#this==2?'女' 定义 conv(2)=女
当然这个只是一个简单的例子,这里支持复杂的函数运算。对于一些简单的逻辑更推荐使用struts2的标签来处理。复杂点的不做具体讲解,引用别人的一个例子
例如:
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) 调用了这个表达式。
2 总结
这里主要讲解一下使用注意事项
<s:url value="#foobar['foo1']"> 如果你这样使用标签 ,那么它绝对不会是你想要的,它会按照你的
输入原样的输出的 #foobar['foo1']
正确的使用: <s:url value="%{#foobar['foo1']}"> %{} 用于对括号内用ognl求值
struts2的action,大家都习惯了生成get与set方法,其实新版的没有这俩个方法也能插值进去的,它采用了java的反射机制来实现,不过官方还是建议按照旧的方法用。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jsp页面代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.rao.bean.Sex"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My page</title>
<s:head theme="xhtml"/>
<sx:head parseContent="true"/>
</head>
<body>
Struts 2.1 Tags
<br/>
<br/>
一、控制标签<br/><hr size="3" color="red">
#、if /elseif/ else @用于逻辑判断<br/>
<s:set name="bir" value="-12"></s:set>
<s:if test="#bir>=180 || #bir<0">
你是何方妖怪?
</s:if>
<s:elseif test="#bir<=18 && #bir>=0">
未成年人不能进入!
</s:elseif>
<s:elseif test="#bir<=60 && #bir>=18">
您已经成年!
</s:elseif>
<s:else>
您已经老了!
</s:else>
<br/>--------------------------------------------------------------<br/>
#、append @用于将多个集合合并<br/>
<s:set name="appList1" value="{'111','222','333','444'}"></s:set>
<s:set name="appList2" value="{'aaa','bbb','ccc','ddd'}"></s:set>
<s:append var="newAppList">
<s:param value="appList1"></s:param>
<s:param value="appList2"></s:param>
</s:append>
<s:iterator value="#newAppList">
<s:property/> |
</s:iterator>
<br/>--------------------------------------------------------------<br/>
#、generator <br/>
generator标签,该标签可以将指定字符串按指定分隔符分割成多个字串。生成的多个字串可以用iterator标签进行迭代输出。可以这么理解:generator标签将一个字符串转换成一个List集合。在该标签体内,整个临时生成的集合将为Valuestack的顶端,但一旦该标签结束,生成的集合将被移除Valuestack。generator标签有如下几个属性:
<br/>
1、count属性:指定生成集合中元素的总数。可选属性。<br/>
2、val属性:必填属性,指定被解析的字符串。<br/>
3、separator属性:这是一个必填属性,指定用于分割字符串的分隔符。<br/>
4、converter属性:可选属性,指定一个转换器,转换器负责将生成的集合中的每个字符串转换成对象,通过这个转换器可以将一个含有分隔符的字符串解析成对象的集合。转换器必须一个继承org.apache.struts2.util.IteratorGenerator.Converter的对象。
<br/>
5、var属性,可选属性。如果指定了该属性,则将生成的集合保存在Stack Context中。如果不指定该属性,则将生成的集合放入ValueStack的顶端,该标签一结束,生成的集合就被移除。该属性也可替换成id。
<br/>
<s:generator val="'aaa,bbb,ccc,ddd'" separator="," count="2">
<s:iterator>
<s:property/>
</s:iterator>
</s:generator><br/>
<br/>--------------------------------------------------------------<br/>
#、iterator 用于迭代数据<br/>
<s:set name="iterList" value="{'aaa','bbb','ccc','ddd'}"></s:set>
<table border="1">
<tr>
<td> 索引 </td>
<td> 值 </td>
<td> 奇? </td>
<td> 偶? </td>
<td> 首? </td>
<td> 尾? </td>
<td> 当前迭代数量 </td>
</tr>
<s:iterator value="{'aaa','bbb','ccc','ddd','eee','fff'}" begin="1" status="s">
<tr bgcolor="<s:if test="#s.odd">pink</s:if>">
<td><s:property value="#s.index"/></td>
<td><s:property/></td>
<td><s:property value="#s.even"/></td>
<td><s:property value="#s.odd"/></td>
<td><s:property value="#s.first"/></td>
<td><s:property value="#s.last"/></td>
<td><s:property value="#s.count"/></td>
</tr>
</s:iterator>
</table>
<br/>--------------------------------------------------------------<br/>
#、merge @和类似:用于将多个集合合并<br/>
<s:set name="merList1" value="{'111','222','333','444'}"></s:set>
<s:set name="merList2" value="{'aaa','bbb','ccc','ddd'}"></s:set>
<s:append var="newMerList">
<s:param value="merList1"></s:param>
<s:param value="merList2"></s:param>
</s:append>
<s:iterator value="#newMerList">
<s:property/> |
</s:iterator>
<br/>--------------------------------------------------------------<br/>
#、sort @用于排序<br/>
<s:bean var="myComparator" name="com.rao.comparator.MyComparator"></s:bean>
<s:sort comparator="#myComparator" source="{1,45,56,0,345,3}">
<s:iterator>
<s:property/>,
</s:iterator>
</s:sort>
<br/>--------------------------------------------------------------<br/>
#、subset @用户截取集合中的子集; 注:decider:可选属性,指定由开发者自己决定是否选中该元素.
<br/>
<s:set name="subList" value="{'@@@','***','&&&','###'}"></s:set>
<s:subset source="#subList" start="1" count="2">
<s:iterator>
<s:property/>,
</s:iterator>
</s:subset>
<br/>--------------------------------------------------------------<br/>
二、数据标签<br/>
<hr size="3" color="red">
#、action @用于导入一个Action<br/>
使用action标签,可以允许在jsp页面中直接调用Action,在调用Action时候,可以指定需要被调用的Action的name和namespace.如果指定了executeResult参数的属性值为true,该标签会把Action的处理结果(视图资源)包含到本页面中. 使用action标签指定属性有:
<br/>
id: 可选属性,作为该Action的引用ID <br/>
name:必选属性,指定调用Action <br/>
namespace:可选属性,指定该标签调用Action所属namespace <br/>
executeResult:可选属性,指定是否将Action的处理结果包含到本页面中.默认值为false,不包含. <br/>
ignoreContextParam:可选参数,指定该页面的请求参数是否需要传入调用的Action中,默认值是false,即传入参数.<br/>
s:param是以request方式的值的,而不是以参数传值,所以request.getParameter("")会获取不到值,通过request.getAttribute("")方式可以获取<br/>
<s:action name="tagsAction1" ignoreContextParams="true" executeResult="true" namespace="/com/rao">
<s:param name="userName" value="'三毛'"></s:param>
</s:action>
<br/>--------------------------------------------------------------<br/>
#、bean @用于导入一个javaBean,相当于:jsp:useBean 标签<br/>
<s:bean name="com.rao.bean.UserBean" var="user">
<s:param name="userId" value="1001"></s:param>
<s:param name="userName" value="'张三'"></s:param>
</s:bean>
userId:<s:property value="#user.userId"/><br>
userName:<s:property value="#user.userName"/>
<br/>--------------------------------------------------------------<br/>
#、date @用于格式化日期<br/>
<s:set name="dt" value="new java.util.Date()"></s:set>
当期系统时间是:<s:date name="dt" format="yyyy-MM-dd HH:ss:mm"/>
<br/>--------------------------------------------------------------<br/>
#、debug @用于调试程序,让开发人员一目了然的知道当前请求、值栈、栈中的各项参数<br/>
<s:debug/>
<br/>--------------------------------------------------------------<br/>
#、i18n @用于访问国际化资源文件的内容<br/>
1.默认访问全局范围内的资源文件;
<br>
<s:text name="welcome">
<s:param>三毛</s:param>
<s:param>学习</s:param>
</s:text>
<hr>
2.访问包范围内的资源文件;
<br>
<s:i18n name="com/rao/action/package">
<s:text name="welcome">
<s:param>三毛</s:param>
<s:param>学习</s:param>
</s:text>
</s:i18n>
<hr>
3.访问Action范围内的资源文件;
<br>
<s:i18n name="com/rao/action/GlobalNativeAction">
<s:text name="welcome">
<s:param>三毛</s:param>
<s:param>学习</s:param>
</s:text>
</s:i18n>
<br/>--------------------------------------------------------------<br/>
#、include @用于导入一个jsp文件,等同于:jsp:include标签<br/>
<s:include value="success.jsp"></s:include>
<br/>--------------------------------------------------------------<br/>
#、param @用于给指定参数设置值<br/>
<s:bean name="com.rao.bean.UserBean" var="user">
<s:param name="userId" value="1001"></s:param>
<s:param name="userName" value="'张三'"></s:param>
</s:bean>
userId:<s:property value="#user.userId"/><br>
userName:<s:property value="#user.userName"/>
<br/>--------------------------------------------------------------<br/>
#、property @输出结果,很像EL表达式,但是可以依托于OGNL表带是很强大<br/>
同上
<br/>--------------------------------------------------------------<br/>
#、push @该标签可以把程序员在ActionContext中引用的对像压入valuestack中,为以后访问对象提供了方便<br/>
<s:push value="#request.user"><s:property value="userName"/></s:push>
<br/>--------------------------------------------------------------<br/>
#、set @用户声明对象或属性<br/>
<s:set name="uName" value="#request.user.userName"></s:set>
<s:property value="#uName"/>,你好啊!
<br/>--------------------------------------------------------------<br/>
#、text @用户获取国际化资源文件的内容<br/>
请参考 il8n标签
<br/>--------------------------------------------------------------<br/>
#、url @用于组拼一个请求路径<br/>
<s:url var="url1" action="MyAction" method="add">
<s:param name="id" value="%{23}"></s:param>
<s:param name="name" value="%{'tom'}"></s:param>
</s:url>
<s:property value="#url1"/>
<br/>
注意:<br/>
<s:set name="myurl" value="'http://www.baidu.com'"></s:set>
value以字符处理: <s:url value="#myurl"></s:url><br>
value明确指定以ognl表达式处理: <s:url value="%{#myurl}"></s:url>
<br/>--------------------------------------------------------------<br/>
三、UI标签<br/>
<hr size="3" color="red">
<s:form>
#、checkboxlist @复选框列表<br>
1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
name:checkboxlist的名字<br>
list:checkboxlist要显示的列表<br>
value:checkboxlist默认被选中的选项,checked=checked<br>
<s:checkboxlist theme="simple" name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" ></s:checkboxlist>
<br>
2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
name:checkboxlist的名字<br>
list:checkboxlist要显示的列表<br>
listKey:checkbox 的value的值<br>
listValue:checkbox 的lablel(显示的值)<br>
value:checkboxlist默认被选中的选项,checked=checked<br>
<s:checkboxlist theme="simple" name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" ></s:checkboxlist>
<br/>--------------------------------------------------------------<br/>
#、combobox <br/>
<s:combobox theme="simple" label="选择你喜欢的颜色" name="colorNames" headerValue="------请选择------" headerKey="1" list="{'红','橙','黄','绿','青','蓝','紫'}" />
<br/>--------------------------------------------------------------<br/>
#、radio @单选框<br/>
<%
Sex sex1 = new Sex(1,"男");
Sex sex2 = new Sex(2,"女");
List<Sex> list = new ArrayList<Sex>();
list.add(sex1);
list.add(sex2);
request.setAttribute("sexs",list);
%>
这个与checkboxlist差不多;<br>
1>.如果集合为javabean:<s:radio theme="simple" name="sex" list="#request.sexs" listKey="id" listValue="name"></s:radio><br>
2>.如果集合为list:<s:radio theme="simple" name="sexList" list="{'男','女'}"></s:radio><br>
3>.如果集合为map:<s:radio theme="simple" name="sexMap" list="#{1:'男',2:'女'}" listKey="key" listValue="value"></s:radio><br>
<hr>
<br/>--------------------------------------------------------------<br/>
#、select @下拉列表框<br/>
这个与s:checkboxlist差不多;<br>
1>.如果集合为javabean:<s:select theme="simple" name="sex" list="#request.sexs" listKey="id" listValue="name"></s:select><br>
2>.如果集合为list:<s:select theme="simple" name="sexList" list="{'男','女'}"></s:select><br>
3>.如果集合为map:<s:select theme="simple" name="sexMap" list="#{1:'男',2:'女'}" listKey="key" listValue="value"></s:select><br>
<br/>--------------------------------------------------------------<br/>
#、doubleselect @级联菜单 <br/>
<!-- 可以用直接指定,当然也可以跟数据库绑定的 -->
<s:set name="proviList" value="{'江西省','湖北省'}"></s:set>
<s:set name="jxList" value="{'南昌市','赣州市','九江市','上饶市','鹰潭市'}"></s:set>
<s:set name="hbList" value="{'武汉市','恩施市','十堰市','荆州市','襄樊市'}"></s:set>
<s:doubleselect theme="simple" name="provi" doubleList="top=='江西省' ? #jxList : #hbList" list="#proviList" doubleName="city"></s:doubleselect>
<br/>--------------------------------------------------------------<br/>
#、optiontransferselect <br/>
<s:optiontransferselect theme="simple" label="change" name="abc" doubleList="{'111','222','333','444'}" list="{'aaa','bbb','ccc','ddd'}" doubleName="number"></s:optiontransferselect>
<br/>--------------------------------------------------------------<br/>
#、updownselect @可上下选择的select <br/>
<s:updownselect label="selectCity" emptyOption="true" name="selectCity" list="#jxList" headerValue="-Please Select The City-" headerKey="-1"></s:updownselect>
<br/>--------------------------------------------------------------<br/>
#、sx:datetimepicker @日期选择控件 <br/>
使用步骤:声明:我这里用的是strut 2.1.8.1,在struts2.0的版本中可能有所不同;<br/>
1.导入struts2-dojo-plugin-2.1.8.1.jar DoJo 插件包;<br/>
2. 导入标签:<%--@ taglib prefix="sx" uri="/struts-dojo-tags"--%>;<br/>
3.在需要使用的页面中的head标签之间加上<%-- <sx:head parseContent="true"/> --%>;<br/>
<sx:datetimepicker label="birthday" name="bir" value="#dt"></sx:datetimepicker>
<br/>--------------------------------------------------------------<br/>
#、sx:tabbedpanel @选项卡控件 <br/>
声明:这个标签代码转至:http://blog.sina.com.cn/s/blog_6145ed810100ecud.html,版权归作者所有;写的挺好拿来大家共同学习。
<!-- tabbedpanel标签 -->
<!-- 最简单的选项卡,两个选项卡加载都是本页面 -->
<hr color="blue">
<b>最简单的选项卡:</b>
<br>
<sx:tabbedpanel id="tab1" beforeSelectTabNotifyTopics="/beforeSelect">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 加载其他页面的选项卡 -->
<hr color="blue">
<b>加载其他页面的选项卡:</b>
<br>
<sx:tabbedpanel id="tab2">
<sx:div label="Remote Tab 1" href="upload.jsp">
Remote Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="multipleUpload.jsp" >
Remote Tab 1
</sx:div>
</sx:tabbedpanel>
<!-- 设置选项卡底下的内容懒加载,即等需要的时候再加载,使用属性preload="false"-->
<hr color="blue">
<b>设置选项卡底下的内容懒加载,即等需要的时候再加载,使用属性preload="false":</b>
<br>
<sx:tabbedpanel id="tab3">
<sx:div label="Remote Tab 1" href="upload.jsp">
Remote Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="multipleUpload.jsp" preload="false">
Remote Tab 1
</sx:div>
</sx:tabbedpanel>
<!-- 固定大小的选项卡 -->
<hr color="blue">
<b>固定大小的选项卡,使用属性cssStyle和doLayout:</b>
<br>
<sx:tabbedpanel cssStyle="width: 200px; height: 100px;" doLayout="true" id="tab4">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 每次点击选项卡时都重新刷新内容 -->
<hr color="blue">
<b>每次点击选项卡时都重新刷新内容,使用属性refreshOnShow:</b>
<br>
<sx:tabbedpanel id="tab5">
<sx:div label="Remote Tab 1" href="upload.jsp" refreshOnShow="true">
Remote Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="multipleUpload.jsp" refreshOnShow="true">
Remote Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 使得其中一个选项卡失效 -->
<hr color="blue">
<b>使得其中一个选项卡失效:</b>
<br>
<sx:tabbedpanel id="tab6">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" disabled="true">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 设置选项卡在底部显示 (可以是: top, right, bottom, left) -->
<hr color="blue">
<b>设置选项卡在底部显示 (可以是: top, right, bottom, left):</b>
<br>
<sx:tabbedpanel id="tab7" labelposition="bottom" cssStyle="width:200px;height:100px;" doLayout="true">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- 设置选项卡允许关闭,使用属性closeable -->
<hr color="blue">
<b>设置选项卡允许关闭,使用属性closeable:</b>
<br>
<sx:tabbedpanel id="tab8">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" closable="true">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<br/>--------------------------------------------------------------<br/>
#、sx:textarea @textarea控件 <br/>
<sx:textarea label="简介" value="sx:textareasx:textareasx:<br/>textareasx:textareasx:textareasx:<br/>textareasx:textareasx:<br/>textareasx:textarea"></sx:textarea>
<br/>--------------------------------------------------------------<br/>
#、sx:tree @树控件 <br/>
<sx:tree id="tree1" label="根节点">
<sx:treenode id="tn1" label="财务部" />
<sx:treenode id="tn2" label="开发部">
<sx:treenode id="tn3" label="JAVA" />
<sx:treenode id="tn4" label=".NET" />
</sx:treenode>
<sx:treenode id="tn5" label="人事部" />
</sx:tree>
</s:form>
</body>
</html>
发表评论
-
struts2,spring的action后台日志打印plugin
2011-06-08 10:39 1146同事,无聊,写了个action后台日志打印的plugin, 用 ... -
struts-Logic标签简单介绍
2010-08-19 17:23 69[/b]在Struts应用中,Struts Logic标签库主 ... -
struts 表单限制重复提交
2010-07-12 14:54 1301struts2的限制表单重复提交,除了可以限制提交外,还可以让 ... -
struts2重点来了,ognl表达式讲解
2010-07-09 17:48 172首先看看OGNL的结构图: 所以如果请求被重定向的话,则 ... -
关于struts2国际化
2010-07-08 14:38 69首先我们准备我们的资源文件,资源文件得按下面图片的要求准备: ... -
关于struts2的表单效验
2010-07-08 11:46 742种方式进行输入效验: 1.1 手动编码方式对action中 ... -
struts2 文件上传
2010-07-05 16:08 14301.单文件上传,不多说,见图: 注意第3步action中的 ... -
struts2转换器以及获得servlet对象
2010-07-05 11:53 14241.sruts2用什么来代替struts1中的formBean ... -
struts2 注意事项2
2010-07-05 10:58 1124接着上面我所说的: 1.如果你不想适应struts2特有的ur ... -
struts2 注意事项1
2010-07-01 15:08 9401.pojo式的开发,action类无需继承任何类. < ... -
struts2项目环境配置
2010-07-01 11:41 281-- jar包 最小jar包环境: 1.struts2-c ... -
关于struts2 拦截器
2010-07-01 10:51 30首先,我们得先定义我们 ...
相关推荐
这个压缩包包含了Struts2中的ONGL包源码,对于理解Struts2的工作原理和深入学习OGNL的使用非常有帮助。 OGNL是Object-Graph Navigation Language的缩写,它的主要功能是在对象图中导航并执行操作。在Struts2中,...
Java Struts2 OGNL(Object-Graph Navigation Language)标签是用于在JSP页面中动态地访问和操作Java对象的强大工具。以下是对这些知识点的详细解释: 1. **对象树的访问**: OGNL允许开发者通过点号(`.`)来遍历...
struts2标签详解(经典)struts2标签详解(经典)struts2标签详解(经典)
很好的介绍ONGL的相关知识,一看就明白,对想学习struts2或ONGL的人来说是必需的
这个“Struts2标签库详解(非常不错)”的资源应该包含了对Struts2所有标签的详细介绍,以及相关的API文档。 Struts2标签库的核心在于提供了一种声明式编程的方式,使得开发者可以更专注于业务逻辑,而不是繁琐的JSP...
Struts2的标签详解Struts2的标签详解Struts2的标签详解Struts2的标签详解Struts2的标签详解Struts2的标签详解Struts2的标签详解Struts2的标签详解Struts2的标签详解
Struts2标签是Java开发中一个非常重要的工具,它极大地简化了MVC框架下的视图层构建,使得开发者能够...提供的“Struts2标签详解.doc”文档将对这些概念进行详细的解释,是深入学习和理解Struts2标签的重要参考资料。
### Struts2常用标签详解(实用版) #### 引言 在Java Web开发领域中,Struts2框架因其丰富的功能及灵活的配置而备受开发者们的青睐。为了更好地掌握Struts2框架并提升开发效率,本文将详细介绍Struts2中常用的...
在本文中,我们将深入探讨Struts2标签的用法,包括它们的基本概念、类型以及如何在实际开发中应用。 一、Struts2标签基础 Struts2标签库是基于JavaServer Pages (JSP) 标准标签库(JSTL)的扩展,它包含了一系列与...
Struts2 标签库详解 Struts2 提供了一个强大的标签库,用于简化 Web 应用程序的开发过程。这些标签可以分为两类:通用标签和 UI 标签。下面,我们将详细介绍 Struts2 标签库的使用。 4.1 通用标签 通用标签用来...
Struts2标签详解与实例 在Java Web开发中,Struts2框架因其强大的MVC(模型-视图-控制器)架构而备受青睐。Struts2提供了丰富的标签库,简化了视图层的开发,使开发者可以更加专注于业务逻辑。本文将深入探讨Struts...
在压缩包中的"example"文件可能包含了一个或多个使用Struts2标签的实际示例,可以参考这些示例来理解和学习Struts2标签的用法。通过实践,你会更好地掌握这些标签的功能和用法,从而在开发过程中更加得心应手。
本文将深入解析Struts2中的常用标签,这些标签在实际开发中非常实用,对于初学者理解并掌握Struts2的运行机制至关重要。 首先,我们需要了解Struts2标签库的主要组成部分,它们分为Action、Display、Logic、Field和...
本资料包包含的是《Struts2深入详解》一书的源码分析,涵盖了从第一章到第五章的内容,并附带了相关的jar包,方便读者结合理论与实践进行学习。 首先,让我们从第一章开始,Struts2的基础知识。这一章通常会介绍...
本文将深入探讨Struts2自定义标签的实现机制、优点以及如何在实际项目中进行应用。 一、Struts2自定义标签的概念 自定义标签是JSP的一种扩展,允许开发者创建自己的HTML标签,这些标签可以封装复杂的业务逻辑,使得...
"Struts2标签库详解" Struts2标签库是Struts2框架中的一个重要组件,它提供了一系列的标签,帮助开发者快速构建Web应用程序。在Struts2标签库中,标签可以分为UI标签和非UI标签两大类。UI标签用于生成HTML控件,如...
Struts2标签库详解 Struts2框架是Java Web开发中的一个强大工具,它提供了丰富的标签库,使得开发者能够更方便地在JSP页面中处理业务逻辑...学习和理解Struts2标签库详解文档,对于提升Java Web开发技能具有重要意义。
### Struts2配置详解 #### 一、总览 在深入了解Struts2的配置细节之前,我们先来简要概述一下Struts2框架的核心特点及其配置文件的基本结构。Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web...
下面我们将深入探讨如何在Struts2中实现自定义标签,以及其背后的原理。 自定义标签的创建主要涉及以下三个步骤: 1. **创建taglib文件 (.tld)**:TLD(Tag Library Descriptor)文件是自定义标签的元数据,用于...
这个实例项目展示了如何在实际应用中结合Struts2、国际化、类型转换以及Struts2自定义标签来实现用户管理功能,包括用户数据的增删改查。 首先,我们来看Struts2的核心概念。Struts2作为MVC框架,它负责处理HTTP...