1、配置struts.xml
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="p1" extends="struts-default">
<action name="demo1" class="com.itstar.action.Demo1Action"
method="demo1">
<result name="success">demo1.jsp</result>
</action>
<action name="demo2" class="com.itstar.action.Demo2Action"
method="demo2">
<result name="success">demo2.jsp</result>
</action>
</package>
</struts>
2、Demo1Action代码
package com.itstar.action;
import com.opensymphony.xwork2.ActionSupport;
public class Demo1Action extends ActionSupport {
private String username = “小明”;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String demo1() {
return SUCCESS;
}
}
2、Demo1Action代码
package com.itstar.action;
import com.opensymphony.xwork2.ActionSupport;
import freemarker.core.ReturnInstruction.Return;
public class Demo2Action extends ActionSupport{
public String demo2() {
return SUCCESS;
}
}
注:可以jsp页面加入<s:debug/>
方便查看(开发结束记得去除)
示例:
<!-- 引入-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- property:输出数据到页面。 -->
<s:property value="name" />
<br />
<!-- value不写:取栈顶对象 -->
<s:property />
<br />
<s:property value="'<hr/>'" escapeHtml="false" />
<br />
<hr />
<!-- set:放数据
scope:application|session|request|page|action
默认范围是action:1、放到请求范围2放到contextMap中
-->
<s:set value="'value1'" var="v1" scope="session"></s:set>
<hr />
<s:set value="'value2'" var="v2"></s:set>
contextMap:
<s:property value="#v2" />
<br /> requestScope:
<s:property value="#request.v2" />
<br />
<!-- s:debug没有显示出来 -->
<hr />
<!-- push:把对象压入栈顶,结束标签后,弹栈 -->
<s:push value="'value3'"></s:push>
<hr />
<!-- bean:给一个类取一个名字 ,把对象放到contextMap中-->
<s:bean name="java.util.Date" var="now"></s:bean>
<s:property value="#now.time" />
<hr />
<!-- action:指向一个动作:struts2中的包含 -->
<s:action name="demo2" executeResult="true"></s:action>
运行结果
iterator:forEach使用频率相当高:
<!-- iterator:forEach使用频率相当高 -->
<table border="1">
<tr>
<th>key</th>
<th>value</th>
</tr>
<!-- 指定了var:当前遍历的元素存到contentMap中,key就是var指定的值 vv=Map.Entry -->
<s:iterator value="#request" var="vv">
<tr>
<td><s:property value="#vv.key" /></td>
<td><s:property value="#vv.value" /></td>
</tr>
</s:iterator>
</table>
--------------------------------------------------------------
运行结果
#
<!-- 不指定var:把当前遍历的元素存到根栈的栈顶,Map.Entry
status属性:指向一个对象,记录着当前遍历的元素信息。存放到contextMap中
该对象有以下方法:isOdd ; isEven ; isLast ; isFirst ; getCount ;getIndex
-->
<style type="text/css">
.odd {
background-color: #c3f3c3;
}
.even {
background-color: #f3c3f3;
}
</style>
<table border="1">
<tr>
<th>key</th>
<th>value</th>
<th>序号</th>
</tr>
<s:iterator value="#request" status="s">
<tr class="<s:property value='#s.odd?"odd":"even"'/>">
<td><s:property value="key" /></td>
<td><s:property value="value" /></td>
<td><s:property value="#s.count" /></td>
</tr>
</s:iterator>
</table>
运行结果
#
<s:radio name="gender" label="'性别'" list="{'male','female'}"></s:radio>
<hr>
<s:set value="'java'" var="hobby1"></s:set>
<s:checkboxlist name="hobby1"
list="#{'sleep':'睡觉','read':'看书','java':'学java'}"></s:checkboxlist>
<hr>
<!-- if else if 类似:jstl when otherwise -->
<s:set value="A" var="grade" />
<s:if test="#grade==A">优秀
<s:elseif test="#grade==B">良好
<s:else>不及格</s:else>
</s:elseif>
</s:if>
运行结果
<!-- url:和jstl中的url一样的。URL地址重写;结合参数使用:参数进行url编码;/代表当前应用 -->
<s:url action="demo2" var="u1">
<s:param name="hello" value="'你好'"></s:param>
</s:url>
<a href="${u1 }">猛搓</a>
运行结果