struts2.1.6教程六、使用标签
1.基础表单标签
准备工作:建立struts2tag项目,搭建好struts2的开发环境。在html我们常用的基础表单标签主要有文本域、密码域、提交、重置四种。它们在strust2中可以通过标签来生成。下面建立login.jsp页面,与这四种标签相关的内容如下:
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<body>
<s:form action="login" method="post" namespace="/my">
<s:textfield label="用户名" name="user.username" required="true" requiredposition="right"/>
<s:password label="密码" name="user.password" required="true" />
<s:reset value="重置" align="left"/>
<s:submit value="注册" align="left"/>
</s:form>
</body>
</html>
说明:label中的内容是显示在表单前的提示内容,required设为true,表示此表单项为必填内容。
2.单选按钮和复选框:
<s:radio list="#{1:'男',0:'女'}" value="1" label="性别" name="user.sex"/>
<s:checkboxlist list="#{1:'足球',2:'排球',3:'蓝球',4:'网球'}" name="user.love" label="爱好"/>
3.三种方式实现下拉列表
<s:bean id="p" name="com.asm.NativePlaceFormAction"></s:bean>
<s:bean name="com.asm.NativePlaceMapFormAction" id="pMap"></s:bean>
<s:bean name="com.asm.NativePlaceProFormAction" id="pp"></s:bean> <s:select list="#p.place" label="籍贯" name="user.place"/>
<s:select list="#pMap.place" label="籍贯2" name="user.place"/>
<s:select list="#pp.place" listKey="pId" listValue="pName" label="籍贯3" name="user.place" headerKey="-1" headerValue="---省---" emptyOption="true"/>
说明:三种方式实现下拉列表分别对应了三个java类,这三个类的内容为:
NativePlaceFormAction主要代码为:
package com.asm;
public class NativePlaceFormAction extends ActionSupport {
private List<String> place;
public NativePlaceFormAction(){
place=new ArrayList<String>();
place.add("山东省");
place.add("山西省");
place.add("河南省");
place.add("河北省");
place.add("四川省");
place.add("云南省");
}
...省略place的get/set方法
}
NativePlaceMapFormAction主要代码为:
package com.asm;
public class NativePlaceMapFormAction extends ActionSupport {
private Map<Integer, String> place; public NativePlaceMapFormAction() {
place = new HashMap<Integer, String>();
place.put(1, "山东省");
place.put(2, "山西省");
place.put(3, "河南省");
place.put(4, "河北省");
place.put(5, "四川省");
place.put(6, "云南省");
}
...省略place的get/set方法
}
NativePlaceProFormAction主要代码为:
package com.asm;
public class NativePlaceProFormAction extends ActionSupport {
private List<Object> place;
public NativePlaceProFormAction(){
place=new ArrayList<Object>();
new Province(1,"山东省","济南");
place.add(new Province(1,"山东省","济南"));
place.add(new Province(2,"山西省","太原"));
place.add(new Province(3,"河南省","郑洲"));
place.add(new Province(4,"河北","石家庄"));
place.add(new Province(5,"四川","成都"));
place.add(new Province(6,"云南","昆明"));
}
...省略place的get/set方法
}
说明:此三种实现效果一样,但是在它们提交时传递给服务器的参数不同,具体可以参看login.jsp页面的源码。另外,这三种实现其实都依赖了<s:bean>设定的对象,如果我们不希望依赖<s:bean>来设定,
可以通过配置action来实现:下面我们以NativePlaceFormAction说明:首先在struts.xml中配置此action,配置内容如下
<action name="npf" class="com.asm.NativePlaceFormAction">
<result>/login2.jsp</result>
</action>
随后,我们在login.jsp中增加如下内容:
<a href="<%=request.getContextPath()%>/my/npf.action">另一个注册页面</a>
其中login2.jsp中的关键内容为:
<s:select list="place" label="籍贯" name="user.place"/>
我们可以发现:在login2.jsp中填写list的值时并没有用ognl表达式,因为我们通过npf.action来访问时,此Action已经被写入到了值栈中,所以我们可以直接引用。
<s:select list="place" label="籍贯" name="user.place"/>place不用加#号了
后面所用到的实例,我们都会把这样的类做成Action,这样如果我们想通过这种方式访问便只需要在struts.xml中配置即可
4.二级联动
<s:bean name="com.asm.TwoSelectAction" id="ts"></s:bean>
<s:doubleselect list="#ts.place" listKey="pId" listValue="pName" name="user.place"
doubleList="#ts.citys[top]"
doubleListKey="cId" doubleListValue="cName"
doubleName="user.city"
label="籍贯4(二级联动)">
</s:doubleselect>
它所依赖的TwoSelectAction类的主要代码如下:
package com.asm;
public class TwoSelectAction extends ActionSupport {
private List<Province> place;
private Map<Province,List<City>> citys;
...省略place 、citys中get/set方法
public TwoSelectAction(){
place= new ArrayList<Province>();
citys=new HashMap<Province,List<City>> (); Province p1=new Province(1,"山东省","济南");
Province p2=new Province(2,"山西省","太原");
Province p3=new Province(3,"河南省","郑洲");
Province p4=new Province(4,"河北","石家庄");
Province p5=new Province(5,"四川","成都");
Province p6=new Province(6,"云南","昆明");
place.add(p1);
place.add(p2);
place.add(p3);
place.add(p4);
place.add(p5);
place.add(p6); //山东省的市:
City c1=new City(1,"济南");
City c2=new City(2,"招远市");
City c3=new City(2,"寿光市");
List p1City=new ArrayList();
p1City.add(c1);
p1City.add(c2);
p1City.add(c3); //山西省的市:
City c4=new City(4,"太原市");
City c5=new City(5,"大同市");
City c6=new City(6,"晋中市");
List p2City=new ArrayList();
p2City.add(c4);
p2City.add(c5);
p2City.add(c6); //河南省的市:
City c7=new City(7,"郑州市");
City c8=new City(8,"卫辉市");
City c9=new City(8,"信阳市");
List p3City=new ArrayList();
p3City.add(c7);
p3City.add(c8);
p3City.add(c9); //河北省的市:
City c10=new City(10,"石家庄");
City c11=new City(11,"晋州市");
City c12=new City(12,"鹿泉市");
List p4City=new ArrayList();
p4City.add(c10);
p4City.add(c11);
p4City.add(c12); //四川省的市:
City c13=new City(13,"成都");
City c14=new City(14,"南充");
City c15=new City(15,"绵阳");
List p5City=new ArrayList();
p5City.add(c13);
p5City.add(c14);
p5City.add(c15); //云南省的市:
City c16=new City(16,"昆明市");
City c17=new City(17,"安宁市");
City c18=new City(18,"曲靖市");
List p6City=new ArrayList();
p6City.add(c16);
p6City.add(c17);
p6City.add(c18); citys.put(p1,p1City );
citys.put(p2,p2City );
citys.put(p3,p3City );
citys.put(p4,p4City );
citys.put(p5,p5City );
citys.put(p6,p6City );
}
}
简要分析:此实例有些繁琐,主要思想:我们的place对象主要为一级列表服务,只要理解了前面的下拉列表,这里不难理解一级列表。而二级列表中我们使用#ts.citys[top]取出的一个List对象,这样也正是下拉列表所要求的对象类型(List,Map),而top是非常关键的,它明确指出我们取出的是栈顶的对象,这样就能根据一级列表的值来动态生成这个List对象。
5.其它表单标签
<s:select name="singer" list="{}" label="歌星" headerKey="0" headerValue="--歌手名单--" emptyOption="true">
<s:optgroup list="#{1:'任贤齐',2:'刘德华',3:'周杰伦'}" label="男歌手"/>
<s:optgroup list="#{1:'萧亚轩',2:'蔡依林',3:'she'}" label="女歌手"/>
</s:select>
<s:combobox label="来源调查" list="{'朋友介绍','电视广告','网络广告'}" name="from" />
<s:updownselect
list="{'java','C#','VC','php','vb','vc','python'}"
moveDownLabel="下移一位"
moveUpLabel="上移一位"
selectAllLabel="全部选中"
label="您常用编程语言排名"
/>
<s:optiontransferselect
leftTitle="选择喜欢做的事:"
list="{'听歌','看电影','编程','玩游戏','chat'}"
name="love"
headerKey="0"
headerValue="喜欢做的事"
emptyOption="true"
rightTitle="选择讨厌做的事:"
doubleList="{'跳舞','唱歌','打篮球','旅游','shopping'}"
doubleName="hate"
doubleHeaderKey="0"
doubleHeaderValue="不喜欢的事"
doubleEmptyOption="true"
label="个人兴趣说明"
leftUpLabel="上移"
leftDownLabel="下移"
rightUpLabel="上移"
rightDownLabel="下移"
addToLeftLabel="<—添加"
addToRightLabel="添加—>"
addAllToLeftLabel="<—添加(All)"
addAllToRightLabel="添加(All)—>"
selectAllLabel="全选"
/>
<s:checkbox label="接受服务条款" value="false" name="user.accept"/>
有了前面的标签学习,这些标签很容易理解,只需结合显示效果和查看源码来加深它们的理解。但是特别要注意的是<s:checkbox>标签与</s:checkboxlist>的区别。
补充:使用struts2生成的表单标签会在标签内嵌套一些特殊的格式,在使用了struts2生成的标签所在网页内查看源代码可以发现多了一些如<tr><td>这样的格式化代码。如果不想struts2增加这些多余的格式化代码,可以在struts.xml中配置如下内容:
<!-- struts2生成的表单标签使用默认的主题,即不附加格式化标签 -->
<constant name="struts.ui.theme" value="simple"/>
6.其它常用标签的使用(代码参名为“补充”的文件夹下的tag.jsp)
(1)<s:set>标签
此标签主要用于设置一些属性值。
Scope:指定变量被设置的范围,该属性可以接受application、session、request、page或Action。如果没有设置该属性,则默认放置在OGNL Context中,我们可以通过#号来引用。
Value:赋给变量的值,如果没有设置该属性,则将ValueStack栈顶的值赋给变量。
Id/name/var:属性的引用名称,id/name均过时,建议用var来取代他们。
(2)<s:property>
Default:可选属性,如果需要输出的属性值为null,则显示属性指定的值
Escape:可选属性,指定是否格式化html代码。
Value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值
Id:可选属性,指定该元素的标识
(3)<s:Iterator>
Value:可选属性,指定迭代的集合,如果没有指定该属性,则使用ValueStack栈顶的集合
Id:可选属性,指定集合里元素的id(已被标记为过时)
Status:可选属性,该属性指定迭代时当前迭代对象的一个实例,并把此实例放在ognl的上下文中,我们可以通过#号来引用这个实例。该实例包含如下几下方法:
Int getCount:返回当前迭代了几个元素。
Int getIndex:返回当前被迭代的元素的索引
Boolean isEven:返回当前被迭代的元素的索引是否是偶数
Boolean isOdd:返回当前被迭代的元素的索引是否是奇数
Boolean isFirst:返回当前被迭代的元素是否是第一个元素
Boolean isLast:返回当前被迭代的元素是否是最后一个元素
说明:因为iterator会把每次迭代的实例放在值栈的栈顶,而<s:property>默认访问的是值栈的栈顶元素。所以如下代码可行:
<s:set var="list" value="{'第一个','第二个','第三个'}"/>
<!-- iterator迭代的特点:会把迭代的对象放到值栈的栈顶 -->
<s:iterator value="#list">
<s:property/>
</s:iterator>
如果想用status来实现一些功能,可参下面的代码:
<br/>-------------------奇数红色,偶数蓝色---------------<br/>
<s:iterator value="#list" status="i">
<font color='<s:if test="#i.even">blue</s:if><s:else>red</s:else>' >
<s:property/>
</font><br/>
</s:iterator>
(4)url标签
<br/><br/>-----------使用url---------------<br/>
<s:set var="age" value="25" scope="request"/>
<s:url action="asm" namespace="/" >
<s:param name="age" value="#request.age"></s:param>
</s:url>
说明:它会根据action及namespace并附加上下文路径构建一个链接。
<br/><!-- value的值中一定要用单引号引起,这样才表示它的值是一个字串 -->
<s:set var="bdUrl" value="'http://www.baidu.com'" />
<s:url value="#bdUrl" /> <br/>
<s:url value="%{#bdUrl}" />
说明:由于url标签的value属性默认不支持ognl,所以我们要使用%{}来表示{}中的#bdUrl是一个ognl表达式。
struts2.1.6教程六、使用标签的更多相关文章
- struts2官方 中文教程 系列十二:控制标签
介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项 ...
- struts2官方 中文教程 系列十:Form标签
介绍 在本教程中,我们将探索其他Struts 2表单控件.在前面的教程中,我们介绍了如何使用Struts 2表单(处理表单.表单验证和消息资源文件),我们介绍了如何使用Struts 2 head, f ...
- 无废话ExtJs 入门教程六[按钮:Button]
无废话ExtJs 入门教程六[按钮:Button] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个按钮“提交”与重置.如下所示代码区的第68行位置, butt ...
- Laravel教程 六:表单 Forms
Laravel教程 六:表单 Forms 此文章为原创文章,未经同意,禁止转载. Form laravel 5.2 之后请使用 laravelcollective/html 替换 illuminate ...
- struts2.1.6教程七、国际化
尽管国际化不是重点内容,但是也有必要了解它的使用.在struts2中国际化有三种级别:分别是针对某个Action的action级别,针对package的package级别,针对webapp的webap ...
- struts2官方 中文教程 系列十四:主题Theme
介绍 当您使用一个Struts 2标签时,例如 <s:select ..../> 在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...
- struts2官方 中文教程 系列十一:使用XML进行表单验证
在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...
- struts2官方 中文教程 系列九:Debugging Struts
介绍 在Struts 2 web应用程序的开发过程中,您可能希望查看由Struts 2框架管理的信息.本教程将介绍两种工具,您可以使用它们来查看.一个工具是Struts 2的配置插件,另一个是调试拦截 ...
- struts2官方 中文教程 系列八:异常处理
在本教程中,我们将探讨如何启用Struts 2框架处理web应用程序生成的任何未捕获的异常.Struts 2提供了健壮的异常处理,包括能够自动记录任何未捕获的异常,并将用户重定向到错误web页面. 贴 ...
随机推荐
- com.android.ide.common.process.PrecessException:org.gradle.process....finished with non-zero exit value 1
1.问题描述: 如图,在生成apk文件时出现如下错误, 2.原因分析: 我在网上搜了很多类似的问题,但试了又试也没有解决.然后我想上次编译时都没有出错,应该是最近的操作导致的错误. 3.解决办法: 把 ...
- 使用SQL存储过程有什么好处 用视图有什么好处
随便胡乱说几点,大家补充一下.1.预编译,已优化,效率较高.避免了SQL语句在网络中传输然后再解释的低效率.2.如果公司有专门的DBA,写存储过程可以他来做,程序员只要按他提供的接口调用就好了.这样分 ...
- html/css/javascript的含义、作用及理解
HTML(HyperText Markup Language/超文本标记语言) 含义:HTML是一种用于创建网页的标准标记语言. 作用:页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 理解:主 ...
- Web性能优化工具WebPageTest(一)——总览与配置
网站性能优化工具大致分为两类:综合类和RUM类(实时监控用户类),WebPageTest属于综合类. WebPageTest通过布置一些特定的场景进行测试,例如不同的网速.浏览器.位置等. 测试完成后 ...
- MySQL5.7下修改root密码
本地安装了个mysql5.7,发现修改root密码和以往有区别了,特此记录下 进入mysql 更改密码: mysql> update mysql.user set authentication ...
- Unity3D 正六边形,环状扩散,紧密分布,的程序
最近在做一个正六边形的游戏,被一开始的布局难倒了. 需求:中心有个正六边形,输入围绕中心扩散的环数,自动创建和摆放. 大概就是这样的吧,我觉得这个非常轻松的就可以搞定了.啊~~~~~啊~~~ 五环~~ ...
- LINQ to XML编程之编程基础
1.声明,LINQ to XML让xml的创建变得非常简单. XDocument myDocument = new XDocument( new XDeclaration("1.0" ...
- Javascript的内容
JS简介和变量 {JS的三种方式} 1 HTML中内嵌JS(不提倡使用) <button onclick="javascript:alert ...
- jmeter导入DB数据再再优化
前言:分享和规定命名规范后,各位测试人员一致认为这样jmeter的jmx文件限制太死,主要体现六方面: 第一:规定了一个jmx文件只能录入一个接口,这样会导致jmx文件很多 第二:导入DB的jmx文件 ...
- web安全—浏览器的进制
浏览器的进制 字符的ascii码值可以转化为进制形式.可以用来绕过XSS filter. HTML属性值中的进制使用 .十进制使用a 表示,&#作为前缀,;作为后缀,后缀也可以没有. 如果要使 ...