Struts2常用标签
property标签
属性如下:
例子:
<s:property value="username" default="游客"/>
取出栈顶对象(通常是action)的username 属性并输出,如果没有找到username属性,那么输出“游客”。
详细例子:
package com.struts; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.entity.Users; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 控制器类 * 作用:处理客户端的请求 * @author asus * */ public class PropertyAction extends ActionSupport { /** 成员变量:值栈中属性 */ private Users user; /** 重写execute方法 */ public String execute(){ /** 给成员变量赋值 */ user= new Users(); user.setName("admin"); user.setPassword("q12345"); /** 局部变量:非值栈中属性 */ Users userTow=user; String amp="&"; String str="ABCD"; String num="1"; List<Users> list=new ArrayList<Users>();//集合中装了两个对象 list.add(user); list.add(userTow); /** 将局部变量存入request范围里 */ Map<String, Object> request=(Map<String, Object>) ActionContext.getContext().get("request"); request.put("userTow", userTow); request.put("amp", amp); request.put("str", str); request.put("num", num); request.put("list", list); return SUCCESS; } /** JavaBean */ public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
Action 控制器类
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <body> <h1> 结果页面 </h1> <!-- property标签基本用法 --> <!-- 取值栈中的属性(Action中的成员属性) 需要生成Get,Set方法,不需要加范围与井号 --> 结果1: <s:property value="user.name" default="若value属性中没有取到值则输出此内容。" /> <br> <!-- 取非值栈中的属性(除了Action中的成员属性外) 需要加井号,与在获取request/session/application/attr/parameters这五个范围时,需要明确指定范围 --> 结果2: <s:property value="#request.userTow.password" /> <br> <!-- escape:是否转译 true:表示将value内的内容强制转换成字符串显示 如&会被转换为& false:表示将value值当做html代码去解析 会被被解析为& --> 结果3: <s:property value="#request.amp" escape="true" /> hearts; <br> 结果4:<!-- 这里结果为桃心符号 --> <s:property value="#request.amp" escape="false" /> hearts; <br> <!-- property标签灵活用法 --> <!-- value参数的类型是object,可以理解为这个默认是会解析成ognl表达式的 比如需要输入一个字符串string,在value里面的字符串string外面加了单引号,这样不会将string解析成ognl表达式了 --> 结果5: <s:property value="\'user\'" /> <br> <!-- 故value的值解析成OGNL表达式,在此表达式内,有些对象的值的使用与java代码相似,但不相同,以下取几个例子 --> 结果6: <s:property value="#request.str.length()" /> <br> 结果7: <s:property value="#request.str.substring(1,3)" /> <br> <!-- value内还可以写表达式,比如输出一个整型变量num的+1值 --> 结果8: <s:property value="#request.num+1" /> <br> <!-- value内为List集合时,取其长度 --> 结果9: <s:property value="#request.list.size" /> <br> <!-- value内为List集合时,取其内容 --> 结果10: <s:property value="#request.list.get(0).name" /> </body>
JSP结果页面
例子页面输出结果:
set标签
属性如下:
例子:
<!-- 使用bean标签定义一个javaBean实例 --> <s:bean name="lee.Person" id="p"> <s:param name="name" value="zhangsan" /> <s:param name="age" value="29" /> </s:bean> 将p放入默认范围内 <s:set value="#p" name="test" /> <s:property value="#test.name" /> <br> <s:property value="#test.age" /> <br> 将p放入application范围内。 <s:set value="#p" name="test" scope="application" /> <s:property value="#attr.test.name" /> <br> <s:property value="#attr.test.age" /> <br> 将p放入session范围内。 <s:set value="#p" name="test" scope="session" /> ${sessionScope.test.name} <br> ${sessionScope.test.age} <br>
详细例子:
package com.struts; import com.entity.Users; import com.opensymphony.xwork2.ActionSupport; /** * 控制器类 * 作用:处理客户端的请求 * @author asus * */ public class SetAction extends ActionSupport { /** 成员变量:值栈中属性 */ private Users user; /** 重写execute方法 */ public String execute(){ /** 给成员变量赋值 */ user = new Users(); user.setName("admin"); return SUCCESS; } /** JavaBean */ public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
Action 控制器类
<%@ taglib uri="/struts-tags" prefix="s"%> <body> <!-- set标签 --> <h1> set标签 </h1> <p> 将Action中成员属性:user.name的值保存到默认范围中,即Stack Context(application) </p> <s:set name="name" value="user.name" /> <!-- <s:property value="#application.name" />这种写法取不到值 --> <s:property value="#name" /> <s:property value="#attr.name" /> <p> 当指定范围类型application </p> <s:set name="nameTow" value="user.name" scope="application" /> <!-- <s:property value="#nameTow" />这种写法取不到值 --> <s:property value="#attr.nameTow" /> <s:property value="#application.nameTow" /> <p> 小结:set标签默认范围是application。 当刻意去指定范围为application时,虽然范围相同,但他们取值方式又有略微不同。 <br> 共通点:都可以使用attr <br> 区别: <br> 1)默认不指定范围的方式,取值可以不加范围标志,不能使用application范围标志打点取值。 <br> 2)指定application的方式,取值必须要加范围标志,但可以使用application范围标志打点取值。 <br> </p> </body>
JSP结果页面
例子页面输出结果:
push标签
<!-- 使用bean标签创建一个JavaBean实例,并将其放入Stack Context中 --> <s:bean name="lee.Person" id="p"> <s:param name="name" value="\'yeeku\'" /> <s:param name="age" value="29" /> </s:bean> <s:push value="#p"> <s:property value="name" /> <s:propery value="age" /> </s:push>
详细例子:
package com.struts; import com.entity.Users; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 控制器类 * 作用:处理用户的请求 * @author asus * */ public class PushAction extends ActionSupport { /** 成员变量:值栈中属性 */ private Users user; /** 重写execute方法 */ public String execute(){ user=new Users(); user.setName("固执的雨"); user.setAge(15); user.setSex("女"); //存入session会话范围 ActionContext.getContext().getSession().put("user", user); return SUCCESS; } /** JavaBean */ public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
Action 控制器类
<%@ taglib uri="/struts-tags" prefix="s"%> <body> <!-- push标签 --> <h1>push标签</h1> <h4> 普通方式访问 </h4> 姓名: <s:property value="#session.user.name" /> 年龄: <s:property value="#session.user.age" /> 性别: <s:property value="#session.user.sex" /> <h4> 使用push标签后简化的访问方式 </h4> <s:push value="#session.user"> 姓名:<s:property value="name" /> 年龄:<s:property value="age" /> 性别:<s:property value="sex" /> </s:push> </body>
JSP结果页面
例子页面输出结果:
例子:
<h2> 使用s:include标签来包含目标页面 </h2> <s:include value="include-file.jsp" /> <!--使用include标签来包含其他页面,并且传入参数--> <s:include value="include-file.jsp"> <s:param name="author" value="\'yeeku\'" /> </s:include> 被包含的页面仅使用表达式语言输出author参数,被包含页面的代码如下: <h3> 被包含的页面 </h3> <!--表达式语言输出author的请求参数--> ${param.author}
详细例子:
<body> <!-- include标签 --> <h4> 使用include标签包含(引用)jsp1.jsp </h4> <s:include value="jsp1.jsp" /> <h4> 使用include标签包含(引用)jsp2.jsp,使用嵌套的param标签向jsp2.jsp传递参数 </h4> <s:include value="jsp2.jsp"> <s:param name="name" value="\'姓拼名命\'" /> <s:param name="sex" value="\'男\'" /> </s:include> </body>
JSP结果页面
<body> 欢迎访问jsp1.jsp页面! </body>
jsp1.jsp
<body> 欢迎访问jsp2.jsp页面! <br> <!--表达式语言输出author的请求参数,无法使用s:property标签取值,只能用EL表达式--> 姓名:${param.name } 性别:${param.sex } </body>
jsp2.jsp
例子页面输出结果:
date标签
<constant name=“struts.custom.i18n.resources” value=“ApplicationResources”/>
详细例子:
struts.date.format=yyyy/MM/dd hh\:mm\:ss
ApplicationResource.properties
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 设置默认资源包 --> <constant name="struts.custom.i18n.resources" value="ApplicationResources"/> </struts>
struts.xml
<%@ page language="java" pageEncoding="UTF-8"%> <!-- 引入Struts2标签库 --> <%@ taglib uri="/struts-tags" prefix="s" %> <!-- 引入Canlendar的包 --> <%@page import="java.util.Calendar"%> <body> <% //获取当天指定点上的时间 Calendar calendar= Calendar.getInstance(); //通过calendar.set方法修改当前日期,将天数向后加10天 calendar.set(calendar.get(calendar.YEAR), calendar.get(calendar.MONTH), calendar.get(calendar.DATE) + 10); //存入application pageContext.setAttribute("futureDate",calendar.getTime()); %> <h1>date标签</h1> <h3>指定format="yyyy年MM月dd日"</h3> <s:date name="#attr.futureDate" format="yyyy年MM月dd日" /> <h3>没有使用format属性,指定nice="true",可以输出“获取到的日期值”和“现在的时间”之间的“时差”</h3> <!-- 将nice属性设为true,可以输出指定日期值和当前日期值之间的时差。 指定日期为:获取到的日期值。 当前日期为:今天,现在的时间。 --> <s:date name="#attr.futureDate" nice="true" /> <h3>没有使用format和nice属性,将以资源包中struts.date.format键的值作为格式化样式</h3> <s:date name="#attr.futureDate" /> </body>
date.jsp
例子页面输出结果:
第二步:
<!-- 引入Ajax标签 --> <%@ taglib uri="/struts-dojo-tags" prefix="sx"%> <head> <!-- 在JSP页面中加入head标签 负责在页面上导入Dojo所需要的CSS库和JavaScript库 --> <sx:head /> </head> <body> <!-- datetimepicker日期控件 日期月份会有乱码,具体解决网上百度吧~--> <sx:datetimepicker name="user.birthday" label="出生日期" value="%{\'2008-9-20\'}"/> </body>
结果页面:
if/elseif/else标签
<s:if test=“表达式”> …….. </s:if> <s:elseif test=“表达式”> …….. </s:elseif> <s:else> ……….. </s:else>
例子:
<!-- 引入Struts2标签库 --> <%@ taglib uri="/struts-tags" prefix="s"%> <body> <!-- OGNL是通常要结合Struts 2的标志一起使用。struts2标签里不能使用EL表达式。 --> <h4> 例子1 </h4> <!-- 定义一个testname属性 --> <s:set name="testname" value="%{\'Java\'}" /> <!-- 使用if标签判断--> <s:if test="%{#testname==\'Java\'}"> <div> <s:property value="%{# testname}" /> </div> </s:if> <s:elseif test="%{#testname==\'Jav\'}"> <div> <s:property value="%{# testname}" /> </div> </s:elseif> <s:else> <div> testname不是“Java” </div> </s:else> </body>
<!-- 引入Struts2标签库 --> <%@ taglib uri="/struts-tags" prefix="s" %> <body> <!-- iterator迭代标签 --> <h1>iterator迭代标签</h1> <h4>迭代List,不使用status</h4> <s:iterator value="{\'zhangsan\' , \'lisi\' , \'wangwu\'}" > <s:property/><br> </s:iterator> <h4>迭代List,使用status</h4> <table border="1" > <tr> <th>当前元素</th> <th>当前迭代的元素的总数</th> <th>当前迭代的元素的索引</th> <th>判断当前迭代的元素是否是偶数</th> <th>判断当前迭代的元素是否是奇数</th> <th>判断当前迭代的元素是否是第一个元素</th> <th>判断当前迭代的元素是否是最后一个元素</th> </tr> <s:iterator value="{\'zhangsan\' , \'lisi\' , \'wangwu\'}" status="status" > <tr> <td><s:property/></td> <td><s:property value="#status.getCount()" /></td> <td><s:property value="#status.index" /></td><!-- 简写方式:index 不简写方式:getIndex() --> <td><s:property value="#status.isEven()" /></td> <td><s:property value="#status.odd" /></td><!-- 简写方式:odd 不简写方式:isOdd() --> <td><s:property value="#status.first" /></td> <td><s:property value="#status.last" /></td> </tr> </s:iterator> </table> <h4>迭代Map,不使用status属性, \#{}是用来构造Map的写法</h4> <s:iterator value="#{\'first\':\'zhangsan\', \'second\':\'lisi\', \'third\':\'wangwu\' }" > <s:property value="key" /> = <s:property value="value" /><br> </s:iterator> </body>
结果页面:
package com.entity; import java.util.Date; /** * 用户类 * @author asus * */ public class Users { /** 属性 */ private String name; private String password; private int age; private String sex; private Date birthday; /** 构造方法 */ public Users() { super(); } public Users(String name, String password) { super(); this.name = name; this.password = password; } /** javaBean */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
Users实体类
<%@ taglib uri="/struts-tags" prefix="s" %> <body> <!-- Struts2 表单标签 --> <!-- action=loginAction 为token拦截器,重复提交,跳转错误页面 action=login2Action 为tokenSession拦截器,重复提交时,留着当前页面,且拦截本次提交 --> <s:form action="loginAction" method="post" theme="simple" > <!-- 加入token标签 --> <s:token/> 用户名:<s:textfield name="user.name" /> 密码: <s:password name="user.password" /> <s:submit value="登录按钮" /> </s:form> </body>
login.jsp
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="struts2" extends="struts-default"> <!-- token标签 1-配置token拦截器,会实现若表单重复提交则跳转错误页面。 --> <action name="loginAction" class="com.struts.LoginAction" > <result>/s_token/success.jsp</result> <!-- 当判断表单重复提交时,token拦截器则会返回invalid.token指向的视图 --> <result name="invalid.token" >/s_token/error.jsp</result> <!-- 配置防止表单重复提交的局部拦截器 Struts2自带的拦截器,当然也可以配置成全局默认的,看需求。 注意:不要忘记了引入默认的拦截器栈 --> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <!-- token标签 2-配置tokenSession拦截器,会实现若表单重复提交时不会跳转页面(留在当前页面)且拦截本次提交。 --> <action name="login2Action" class="com.struts.LoginAction" > <result>/s_token/success.jsp</result> <!-- 配置防止表单重复提交的局部拦截器 Struts2自带的拦截器,当然也可以配置成全局默认的,看需求。 注意:不要忘记了引入默认的拦截器栈--> <interceptor-ref name="tokenSession"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
struts.xml
package com.struts; import com.entity.Users; import com.opensymphony.xwork2.ActionSupport; /** * 控制器类 * 作用:处理用户的请求 * @author asus * */ public class LoginAction extends ActionSupport { /** 成员变量:值栈中属性 */ private Users user; /** 重写execute方法 */ public String execute(){ System.out.println("请求Action进入execute()方法。。");//控制台测试,是否多次重复提交。 //验证登录 if(user!=null){ if(user.getName().equals("admin") && user.getPassword().equals("a123")){ return SUCCESS; } } return SUCCESS;//只为掩饰效果,密码错误也会走成功页面 } /** JavaBean */ public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
LoginAction
<body> 登陆成功进入此页面! </body>
success.jsp
<body> 当表单重复提交时跳转到此页面! </body>
error.jsp
结果页面: