声明式的异常处理
Exception-mapping 元素:配置当前action的声明式异常处理
Exception-mapping元素中有两个属性
-exception:制定需要捕获的异常类型 ,异常的全类名
-result:指定一个响应结果,该结果将在捕获到指定异常时被执行,即可以来自当前的action声明,也可以来自global-results声明。
可以通过global-exception-mappings元素为应用程序提供一个全局性的异常捕获映射 ,但在global-exception-mappings元素下声明的任何exception-mapping元素只能引用在global-results元素下声明的某个result元素
声明式异常处理机制由 ExceptionMappingInterceptor 拦截器负责处理,当某个exception-mapping元素声明的异常被捕获到时,ExceptionMappingInterceptor拦截器就会向ValueStack中添加两个对象 ,
Exception:表示被捕获异常的Exception对象
ExceptionStack :包含着被捕获的异常栈
可以在试图上通过<s:property>标签显示异常消息
Struts2 自动把Action对象 放入值栈中,
放入的时间点为:Struts2终将调用Action类的Action方法,但在调用该方法之前 ,:
先创建一个StrutsActionProxy对象
在创建StrutsActionProxy之后,对其进行初始化时,把Action对象放入了值栈中。
S:property :打印值栈中的属性值的:
对于对象栈,打印值栈中对应的属性值
<s:property value=”productName”/>
对于Map栈,打印 request,session .application . 或者某个请求参数的值
<%
Session.setAttribute(“”,””);
%>
<s:property value=”#session.date”/>
//获得请求参数的值 获得的是一个数组 ,所以这样调用
<S:property value=”#parameters.name[0]” />
S:rul创建一个URL 字符串的方式:手动方式创建
<s:url value=”/getProduct” var = “url”>
指定url包含的请求参数,2002不可能是一个属性名,struts2直接把2002直接作为属性值
<s:param name=”productId” value=”1001”></s:param>
</s:url> 把这个rul放在域对象里面
${ url }
打印结果为
/struts2-4/getProduct?productId=1001
如果希望value 是值栈中的对象的属性
动态创建URL
<s:url value=”/getProduct” var = “url”>
对于value值会自动的进行OGNL解析,强制的进行OGNL解析
<s:param name=”productId” value=”productId”></s:param>
<s:param name=”date” value=”#session.date”></s:param>
</s:url> 把这个rul放在域对象里面
${ url }
如果不希望进行OGNL解析希望它就是个字符串
<s:url value=”/getProduct” var = “url”>
对于value值会自动的进行OGNL解析,若不希望进行OGNL解析则使用单引号引起来
<s:param name=”productId” value=” ‘productId’ ”></s:param>
</s:url> 把这个rul放在域对象里面
${ url }
构建一个请求action的字符串地址
<s:url action=”testAction” namespace=”helloworld” method=”save” var=”url4”></s:property>
${url4 }
打印结果是
/struts2-4/helloworld/testAction!save.action
如果要通过这个方式进行访问 ,则需要先打开struts2的某个参数
这个url地址只包含get请求的请求参数 includeParams 可以是get, all,null
(在一个页面输入参数 ,经过action转发到另一个页面(页面中包含这个标签)因为是转发所以会得到这些请求参数)
<s:url value=”testUrl” var = “url5” includeParams=”get”></s:url>
<${url5}
OGNL会强制的对value属性值进行解析 ,如果不希望进行解析的话 ,我们可以使用单引号
也可以把value属性的值写在开始标签和结束标签之间,利用这种方式可以来传递一个EL表达式的值
S:set :向page,request ,session ,application 域对象中加入一个属性值
对value属性值 自动的进行OGNL解析
<s:set name=”productName” value=”pruductName” scope=”request”></s:set>
productName:${requestScope.productName}
s:push : 把一个对象在标签开始后把对象压入到值栈中 ,标签结束后,弹出值栈
<%
Person person = new Person();
Person.setName(“atguigu”);
Person.setAge(10);
Request.setAttribute(“person” ,person);
%>
<s:push value=”#request.person”>
<s:property value=”name”/>或者使用
${name}
</s:push>
S:if , s:else , s: elseif
直接使用值栈中的属性
<s:if test=”productPrice>1000”>
I7处理器
</s:if>
<s:elseif test=”productPrice > 800”>
I5处理器
</s:elseif>
<s:else>
I3处理器
</s:else>
<s:if test=”#request.person.age > 10”>
大于10岁
</s:if>
<s:else>
小于等于10岁
</s:else>
开始直行时,iterator标签会把IteratorStatuslei
S:iterator:遍历集合的,它会把可遍历对象里的每一个元素一次压入和弹出
<%@page import = “java.util.List” %>
<%@page import = “java.util.ArrayList” %>
<%
List<Person> persons = new ArrayList<Person>();
Persons.add(new Person(“AA”,10))
Persons.add(new Person(“BB”,20))
Persons.add(new Person(“CC”,30))
Persons.add(new Person(“DD”,40));
Request.setAttribute(“persons”,persons);
%>
可以有status来制定状态有index count , first , last , 等状态 把status放在了对象里 所以写的话 像这么写
<s:iterator value=”#request.persons” status=”status”>
Index: ${status.index}- count:${status.count} ${name} - ${age }<br/>
</s:iterator>
S:sort 标签:
import java.util.Comparator;
public class PersonComparator implements Comparator<Person> {
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}
Common-tags.jsp
<body>
s:sort 可以对集合中的元素进行排序
<br/>
<br/>
之前Comparator需要放在一个位置
<%
PersonComparator pc = new PersonComparator();
request.setAttribute("comparator",pc);
%>
<!-- var指的是放大域对象中的key的值 -->
<s:sort comparator="#request.comparator" source="persons" var="persons">
<s:iterator value="#attr.persons">
${name } - ${age }<br/>
</s:iterator>
</s:sort>
</body>
S:date 可以对 Date对象进行排版,将var后面的变量放入域对象中
<s:date name="#session.date" format="yyyy-MM-dd hh:mm:ss" var="date2"/>
date:${date2 }
struts2标签
<s:iterator value="persons">
<!--
可以使用%{}把属性包装起来 使其进行强制OGNL解析 struts2标签元素中不能有
EL表达式标签但可以用%{}进行强转
-->
<s:a href="getPerson.action?name=%{name}">${name}</s:a>
</s:iterator>