1.struts1.x于struts2.x区别
2.struts2基础学习
2.1 配置文件
<constant name="struts.i18n.encoding" value="gbk" />
<pre name="code" class="html"> <constant name="struts.devMode" value="true" />
<package name="action" namespace="/action" extends="struts-default">
<action name="action" class="com.struts.action.Action">
<result name="success">/pagestruts/Action.jsp</result>
</action>
<action name="actionimpl" class="com.struts.action.ActionExtends">
<result name="success">/pagestruts/Action.jsp</result>
</action>
<action name="actionextends" class="com.struts.action.ActionImpl">
<result name="success">/pagestruts/Action.jsp</result>
</action>
</package>
c) 配置命名空间(namespace)(通过不同的命名空间划分不同的功能模块,利于多人协作开发时保持相互之间的独立性,提高开发效率)
<package name="wildcard" namespace="/wildcard" extends="struts-default">
<action name="*_*" class="com.struts.wildcard.{1}Action" method="{2}">
<result>/pagestruts/{1}_{2}.jsp</result>
</action>
</package>
d) 配置Action(将url、Action类、展示页面三者绑定)
type值 | 使用说明 |
chain | 用来处理Action链,将一个action的执行与另外一个配置好的action串连起来。用第一个action的getter方法和第二个action的setter方法来完成action之间属性的复制。服务器端跳转到action |
dispatcher | 用来转向JSP页面,这是默认的结果类型,如果在action配置中没有配置其他的结果类型,它就会被使用。服务器端跳转到视图 |
freemaker | 处理FreeMarker模板 |
httpheader | 控制特殊HTTP行为的结果类型 |
redirect | 重定向到一个URL。客户端跳转到视图 |
redirectAction | 重定向到一个Action。客户端跳转到Action |
stream | 向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据 |
velocity | 处理Velocity模板 |
xslt | 处理XML/XLST模板 |
plainText | 显示原始文件内容,例如文件源代码 |
<package name="test" namespace="/globalResult" extends="struts-default">
<global-results>
<span style="white-space:pre"> </span><result name="mainpage">/main.jsp</result>
<span style="white-space:pre"> </span></global-results>
</package>
e) include 多配置文件配置
<include file="XXXXX.xml" />
2.2 Action
package com.struts.action;
public class Action {
public final String SUCCESS = "success";
public String execute(){
return SUCCESS;
}
}
package com.struts.action;
import com.opensymphony.xwork2.Action;
public class ActionImpl implements Action{
public String execute() throws Exception {
return SUCCESS;
}
}
package com.struts.action;
import com.opensymphony.xwork2.ActionSupport;
public class ActionExtends extends ActionSupport{
private static final long serialVersionUID = 8545758502007427546L;
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
action的动态调用 访问方式为actionname!methodname
2.3 struts标签
<li>property: <s:property value="username"/> </li>
<li>property 取值为字符串: <s:property value="'username'"/> </li>
<li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
2.3.2 set 设置变量值
<pre name="code" class="html"> <li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li>
<li>set 从request取值: <s:property value="#request.adminName" /></li>
<li>set 从ActionContext取值: <s:property value="#adminName" /></li>
<s:debug></s:debug>
<%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>
<li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %></li>
--%>
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="session"/></li>
<li>set 使用#取值: <s:property value="#adminPassword"/> </li>
<li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>
2.3.3 action 执行Action
<s:action var="a" name="testOgnl" namespace="/" executeResult="true" ignoreContextParams="false" >
<s:param name="uname">老高</s:param>
</s:action>
2.3.4 include 包含其他资源执行结果
<li>include _include1.html 包含静态英文文件,说明%用法
<s:set var="incPage" value="%{'/_include1.html'}" />
<s:include value="%{#incPage}"></s:include>
</li>
2.3.5 if elseif else 流程控制标签
<%
request.setAttribute("random",new Random().nextInt(100));
%>
<s:if test="#request.random>=80">
<b>优秀!</b>
</s:if>
<s:elseif test="#request.random>=60">
<b>一般!</b>
</s:elseif>
<s:else>
<b>不合格!</b>
</s:else>
2.3.5 date 输出日期
<%
request.setAttribute("d",new Date(23432432L));
%>
<s:date name="#request.d" format="yyyy-MM-dd" nice="true" /> <!-- 增加nice,format属性不起作用 -->
<hr/>
<s:date name="#request.d" format="yyyy-MM-dd" var="c"/> <!-- 使用var,时间不会打印出,而是保存在c变量中! -->
2.3.6 iterator 循环迭代标签
1. value 将要迭代的集合,使用OGNL表示
2. var 指向集合中正被迭代的对象
3. begin 如果指定,迭代器从begin指定的索引开始
4. end 如果指定,迭代器到end指定的索引结束(包含end索引指向的对象)
5. step 如果指定,迭代器每次递增的增量。如果不指定,默认是1
6. status 用来表示迭代器状态的变量。他有如下的方法:int getIndex() 返回当前迭代的索引值
boolean isEven() 当前迭代的索引值是否偶数
boolean isFirst() 当前迭代的索引值是否第一个元素
boolean isLast() 当前迭代的索引值是否最后一个元素
boolean isOdd() 当前迭代的索引值是否奇数
<body>
<s:set var="s" value="{00,11,22,33,44,55,66,77,88,99}" ></s:set>
<table width="200px" border="1">
<s:iterator value="#request.s" var="temp" begin="0" end="7" step="1" status="idx">
<s:if test="#idx.odd">
<tr bgcolor="gray"><td><s:property value="#idx.index"/>---<s:property value="#temp" /></td></tr>
</s:if>
<s:else>
<tr><td><s:property value="#idx.index"/>---<s:property value="#temp" /></td></tr>
</s:else>
</s:iterator>
</table>
</body>
2.3.7 textfield 文本域 | textarea 多行文本域 | file 文件域 | checkbox | checkboxlist 复选框 | radio 单选按钮 | selet下拉框 等参见开发文档
2.4 ognl
<body>
<s:set var="list" value="{'a','b','c'}" scope="request"></s:set>
<p><s:property value="#request.list.get(2)" /></p>
</body>
<body>
<%
request.setAttribute("a","123456");
%>
<s:set var="m" value="#{'name':'老高','pwd':#request.a}" scope="request"></s:set>
<p><s:property value="#request.m.name" /></p>
<p><s:property value="#request.m.pwd" /></p>
</body>
<body>
<s:set var="s" value="{'a','b','c'}" scope="request"></s:set>
<s:set var="m" value="#{'name':'老高','pwd':'123456'}" scope="request"></s:set>
<p><s:property value="'a' in {'a','b','c'}" /></p>
<p><s:property value="'a' not in #request.s" /></p>
<p><s:property value="'name' in #request.m.keys" /></p>
<p><s:property value="'老高' in #request.m.values" /></p>
</body>
2.4.3 过滤/投影(我们把过滤集合中的元素产生一个子集合,叫做投影)
<html>
<head>
<title>测试OGNL</title>
</head>
<body>
<%
User u1 = new User("张三","123456");
User u3 = new User("王五","123456");
User u5 = new User("高淇","654321");
User u6 = new User("马士兵","654321");
List list = new ArrayList();
list.add(u1);
list.add(u3);
list.add(u5);
list.add(u6);
request.setAttribute("s",list);
%>
<s:set var="s1" value="#request.s.{?#this.pwd=='654321'}" scope="request" ></s:set>
<s:iterator value="#request.s1" var="temp" >
<p><s:property value="#temp.uname" /></p>
</s:iterator>
</body>
</html>
2.4.4 OGNL其他技术
• 调用对象普通方法 直接调用即可:<s:property value="#request.t5.test1()" />
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />