2.3 非表单标签
2.3.1 <s:actionerror>标签,
this.addActionError("错误信息1"); //使用addActionError方法前提是继承Actionsupport类
this.addActionError("错误信息2");
显示消息的标签是:<s:actionerror />显示全部的 Action级别的错误消息,可以加CSS
2.3.2 <s:actionmessage>标签
addActionMessage("相关信息") //使用addActionError方法前提是继承Actionsupport类
this.addActionMessage("信息1");
this.addActionMessage("信息2");
显示消息的标签是:<s:actionmessage/>可以显示全部的消息
2.3.3 <s:fielderror>标签
addFieldError("字段名","错误信息"); //给一个字段(属性)添加错误消息
this.addFieldError("pwd1", "错误信息1");
this.addFieldError("pwd2", "错误信息2");
显示消息的方法1:标签是:<s:fielderror /> //显示全部的错误消息;
显示消息的方法2:
<s:fielderror fieldName="pwd1"></s:fielderror>
显示消息的方法3:如果什么都不写,则默认显示在相应字段上方
2.4 数据显示标签
2.4.1 action标签:在页面中执行一个Action,不需要通过超链接到Action的方式执行。
表示找到命名空间为"/tag"中action名为"themeAction"的Action类并执行这个类的execute方法。
其中属性executeResult="true" 意思是包含action执行完成之后返回的result页面。
2.4.2 bean标签:在页面上实例化一个javaBean
- var="dogBean" 表示这个对象的引用值为dogBean,name属性值填DogBean的完整包名,bean标签实例化的数据放在非狭义值栈当中,用#来获取。
2.4.3 param标签:设置属性(一般与<s:bean>标签一起用,可以设置bean标签实例化后的对象的属性值。)
结果:
dog_name赋值不成功
- 注意value="旺财" 中的中文(字符串也一样比如value="wangcai")被当作广义值栈中的属性来看待,这时候OGNL表达式会到值栈中找有没有变量名为"旺财"的属性,然后把这个属性值赋给dog_name,明显值栈中并没有这个属性,所以dog_name赋值失败。解决方法:value="‘旺财’"(value="'wangcai'") 加单引号即可。 value=“100” 中的100为int型不会被当成属性对待。
2.4.4 date标签:格式化日期类型的数据
- 在action中往值栈中设置属性值
@Override public String execute() throws Exception { ActionContext actionContext=ActionContext.getContext(); actionContext.put("date", new Date()); return "datashow"; }
- 显示日期数据的页面
<body> <s:date name="#date" format="yyyy/MM/dd"/> </body>
结果:
2.4.5 include标签: 在页面中包含另一个页面。(动态包含)
- 动态包含只是包含另一个页面最终显示出来的结果,可以定义重复变量。
- 静态包含另一个页面的代码,不能定义重复变量。
- 对被请求页面传值,
在被请求页面中获取值。 传中文会乱码,最好不要传中文。
2.4.6 property标签,用来输出(常用就不演示了)
2.4.7 push标签:在一个页面临时性的把一个对象放到valueStack中。
- <s:debug>要放在<s:bean>标签内才能在用<s:debug>中看到临时添加的对象。
2.4.7 set便签:定义变量(定义9种类型的基本变量,定义复杂类型的变量由bean标签来定义)
2.5 控制标签
-
if/else判断标签
-
循环标签
第一种使用方法:<s:iterator begin="1" end="5" step="1" var="i"> <s:property value="#i"/> </s:iterator> <br/> 第二种使用方法:<s:iterator begin="1" end="5" step="1"> <s:property /> </s:iterator>
结果:
如上代码,第一种和第二种的区别在于有没有设置var,无论设置了var与否,都会把每次循环的结果放到狭义值栈中去,如果设置了var,那么在把值放到值栈中去的时候,也会把对象放到非狭义值栈中,并且名称为var指定的名称这里是i。
- 循环集合和Map
- 在action中对定义集合并且设置初始值。
DataShowAction.java
package tag; import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.util.ValueStack; import actionUtil.BaseAction; import bean.UserBean; public class DateShowAction extends BaseAction{ List<UserBean> userList; Map<String,Object> userMap; public List<UserBean> getUserList() { return userList; } public void setUserList(List<UserBean> userList) { this.userList = userList; } public Map<String, Object> getUserMap() { return userMap; } public void setUserMap(Map<String, Object> userMap) { this.userMap = userMap; } @Override public String execute() throws Exception { UserBean user=null; this.userList=new ArrayList<UserBean>(); for(int i=0;i<4;i++){ user=new UserBean(i+"","姓名"+i,"性别"+i); userList.add(user); } this.userMap=new LinkedHashMap<String, Object>(); userMap.put("001", new UserBean("001","张三","男")); userMap.put("002", new UserBean("002","李四","女")); return "datashow"; } }
在jsp页面上输出值
<body> <s:debug></s:debug> 遍历List:<s:iterator value="userList" var="user"> <s:property value="#user.getUserName()"/> </s:iterator> <br/>
遍历Map:<s:iterator value="userMap" var="user"> key=<s:property value="#user.Key"/> value=<s:property value="#user.Value"/><br/> </s:iterator> </body>
注意:<s:iterator value="userMap" var="user"> 对狭义值栈中的userMap对象循环,每次循环的对象放到非狭义值栈中且对象名为user。
<s:property value="#user.Key"/>取出非狭义值栈中的对象为user的key值,
value=<s:property value="#user.Value"/>取出非狭义值栈中的对象为user的value值。
结果:
-
- 循环的状态
<s:iterator begin="1" end="10" step="1" status="statue"> 下标=<s:property value="#statue.index"/> 是否第一条: <s:property value="#statue.first"/> 是否最后一条:<s:property value="#statue.last"/> 是否奇偶行:<s:property value="#statue.odd"/><br/> </s:iterator>
注意: status状态值也是存放在非狭义值栈当中。
结果:
-
- 表格的奇偶行变色
<table border="1" width="100%"> <s:iterator begin="1" end="10" step="1" status="statue"> <tr style="<s:if test="!#statue.odd">background-color: grey</s:if>"> <td>下标=<s:property value="#statue.index"/> </td> <td>是否第一条: <s:property value="#statue.first"/></td> <td>是否最后一条:<s:property value="#statue.last"/> </td> <td>是否奇偶行:<s:property value="#statue.odd"/><br/></td> <tr> </s:iterator> </table>
-
字符串分割标签《s:generator》
<s:generator separator=";" val="'aa;bb;cc'" var="strs"> 遍历字符串:<s:iterator var="str" value="#strs"> 子串为:<s:property value="#str"/> </s:iterator> </s:generator>
注意:<s:generator separator=";" val="'aa;bb;cc'" var="strs"> separator属性为分隔符,val属性为要分割的字符串,而var是指分割后的结果(为字符串数组)存放在非狭义值栈中且对象名为strs。注意这里的val="'aa;bb;cc'" 字符串里要有单引号,否则ognl表达式把它当成对象名到狭义值栈力的找,而不是当成字符串。
结果:
-
append和merge标签
append标签:将多个集合或者数组进行追加。
merge标签:将多个集合或者数组进行交叉合并。
结果:
- subset标签:对集合进行截取
结果:
2.6 ajax标签
-
使用前提:
1. 必须引入支持ajax标标签的jar包。(struts2-dojo-plugin-2.3.14.jar)
2. 通过指令元素引入标签。<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
3. 在head标签内引入<sx:head />标签
4. 使用标签
- A、 <sx:datetimepicker>标签(不推荐使用,推荐使用my97插件)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <%@ taglib prefix="sx" uri="/struts-dojo-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <sx:head/> </head> <body> <sx:datetimepicker></sx:datetimepicker> </body> </html>
结果:
B、 选项卡标签<sx:datetimepicker>
结果:
C、树形节点(建议使用ZTree插件)
结果: