一. 异常处理
1. 局部异常处理
在之前的ValidatorAction.java中修改execute方法:
public String execute() {
if (!"Jerry".equals(username)) {
throw new RuntimeException("用户名不正确");
}
return SUCCESS;
}
这里当用户名不为Jerry的时候抛出一个异常,然后在struts配置文件中action添加以下标签:
<action name="validator" class="com.thr.struts2.action.ValidatorAction">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
<exception-mapping result="error"
exception="java.lang.RuntimeException"></exception-mapping>
</action>
这个意思就是说当出现RuntimeException的时候,页面就乎你自动跳转到result结果集为input的jspo页面,这里配置的是当前result的结果集,也可以配置全局的结果集。
在error.jsp中这样子写:
<body>
<s:actionerror />
<pre>
<s:property value="exception.message" />
<s:property value="exception.stackTrace" />
</pre>
</body>
就可以获取到错误信息了,因为这里处在栈顶的是exception异常,使用getMessage和getStrackTrace就可以获取相关信息。
2. 全局异常处理
当把异常处理的映射配置到全局,在<global-results>之后就可以处理全局的异常:
<global-results>
<result name="login">/login.jsp?id=%{#loginid}</result>
<result name="input">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="input"
exception="java.lang.RuntimeException"></exception-mapping>
</global-exception-mappings>
这样子配置,不管是哪个Action,只要出现RuntimeException或者是继承自RuntimeException的异常都会跳转至error.jsp页面。
二. Struts标签
1. if ... else ...
创建Action:
public class TagTestAction {
public String execute() {
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add("成员" + i);
}
ActionContext.getContext().put("list", list);
return "success";
}
}
添加几个元素进List,然后jsp页面中这样使用标签:
<s:if test="!#list.empty">
<s:iterator value="#list" status="i">
<s:property value="#i.index" />,<s:property />
<br />
</s:iterator>
</s:if>
<s:else>
数据为空
</s:else>
2. 迭代器
修改Action类:
private List myList1;
private List myList2;
private List myList3;
public List getMyList1() {
return myList1;
}
public List getMyList2() {
return myList2;
}
public List getMyList3() {
return myList3;
}
public String execute() {
myList1 = new ArrayList();
myList1.add("1");
myList1.add("2");
myList1.add("3");
myList2 = new ArrayList();
myList2.add("a");
myList2.add("b");
myList2.add("c");
myList3 = new ArrayList();
myList3.add("A");
myList3.add("B");
myList3.add("C");
return "success";
}
jsp页面中这样子使用:
<s:append var="allList">
<s:param value="myList1" />
<s:param value="myList2" />
<s:param value="myList3" />
</s:append>
<s:iterator value="#allList">
<s:property />
</s:iterator>
3. 根据字符串创建集合
<s:generator val="'a, b, c'" separator=",">
<s:iterator>
<s:property /><br />
</s:iterator>
</s:generator>
三. UI标签
用户表单<br />
<s:form namespace="/test" action="from" method="post">
<s:hidden name="method:add"/>
<s:textfield name="username" label="用户名" />
<s:password name="password" label="密码" />
<s:textfield name="age" label="年龄"/>
<s:submit value="提交"/>
</s:form>
生成的表单自带换行,而且是对整齐的。
四. Freemarker模板
要想修改struts的默认模板,我们添加这样一个自己的常量:
<constant name="struts.ui.theme" value="thr" />
然后在src下创建包:template.thr
将struts-2.3.24.1\src\core\src\main\resources\template\xhtml目录下的ftl文件全部考到这个包内,修改里面的ftl文件即可。
要想使用struts自带的模板,只需要修改常量struts.ui.theme的值就行了。常用的还有simple、css_xhtml等。
还可以单独对某一个控件进行主题的设置,只需要加入theme="css_xhtml"即可,例如:
<s:password name="password" label="密码" theme="css_xhtml"/>