异常配置和常用通用标签
异常配置
配置单个异常处理
exception-mapping 元素
1)action的子标签
2)配置当前action的声明式异常处理包含两个属性:
exception:异常的全类名
result:返回结果
<action name="product-save" class="com.atguigu.struts2.helloworld.Product"
method="save">
<exception-mapping result="input" exception="java.lang.ArithmeticException"></exception-mapping>
<result name="details">/WEB-INF/pages/details.jsp</result>
<result name="input">/input.jsp</result>
</action>
3)当某个 exception-mapping 元素声明的异常被捕获到时, ExceptionMappingInterceptor 拦截器就会向 ValueStack 中添加两个对象:
exception: 表示被捕获异常的 Exception 对象
exceptionStack: 包含着被捕获异常的栈
获取报错信息代码如下:
<s:property value="exception"/>
<br>
<s:property value="exception.message"/>
配置全局异常处理
global-exception-mappings元素
1)package子标签
2)语法示例如下:
<global-results><!--必须放在global-exception-mappings之前,否则报错,并且在action方法之前-->
<result name="input">/input.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="input" exception="java.lang.ArithmeticException"></exception-mapping>
</global-exception-mappings>
异常捕获机制
声明式异常处理机制由 ExceptionMappingInterceptor 拦截器负责处理。
Struts2自动将Action对象放入到值栈的时间点
1)先创建一个StrutsActioinProxy对象中
2)在创建StrutsActionProxy之后,对其进行初始化,把Action对象放入了值栈中。
常用通用标签
property 标签
url 标签
作用:创建url
1)构建一个普通的url请求
<s:url value="" var="">
<!--value:默认跟在应用后面;var:url访问变量名-->
<s:param name="" value=""></s:param>
<!--name:路径后面的变量名;
value:变量参数值,并且会自动的进行OGNL解析,
若不希望解析使用但引号引起来-->
</s:url>
例子代码:
<s:url value="/getProduct" var="url">
<s:param name="productId" value="1001"></s:param>
</s:url>
${url}
输出结果:
/struts2-5/getProduct?productId=1001
2)构建一个action url请求
例子代码:
<s:url action="testAction" namespace="/helloWorld" method="save" var="url4"></s:url>
<br>
输出结果:
/struts2-5/helloWorld/testAction!save.action
3)获取请求参数中的标签
<!--includeParams:get(只获得get传送过来的请求参数)、all(获取所有请求惨事)、none-->
<s:url value="testUrl" var="url5" includeParams="all"></s:url>
${url5}
set标签
<s:set name="productName" value="productName" scope="request"></s:set>
<!--对value进行OGNL解析,且经测试单引号没有办法完成赋值操作-->
productName:${requestScope.productName}
push标签
1)将把一个对象压入 ValueStack 而不是压入 ContextMap,标签结束时将对象弹出栈.
<%
Product product=new Product();
product.setProductId(1111222);
product.setProductName("xxxxx");
request.setAttribute("product",product);
%>
<br>
<s:push value="#request.product">
${productName}
</s:push>
<br>
${productName}<!--对象被弹出-->
if, else 和 elseif 标签
<s:if test="productPrice>1000">
I7处理器
</s:if>
<s:elseif test="productPrice>800">
I5处理器
</s:elseif>
<s:else>
I3处理器
</s:else>
iterator 标签
iterator 标签用来遍历一个数组, Collection 或一个 Map, 并把这个可遍历对象里的每一个元素依次压入和弹出 ValueStack 栈
<%
List<Product> product2=new ArrayList<Product>();
product2.add(new Product(000001,"aaa","aaaaaa",111));
product2.add(new Product(000002,"bbb","bbbbbb",111));
product2.add(new Product(000003,"ccc","cccccc",1111));
product2.add(new Product(000004,"ddd","dddddd",1111));
request.setAttribute("product2",product2);
%>
<s:iterator value="#request.product2" status="status" begin="1" end="3">
${status.index}-${status.count}:${productName}<br>
</s:iterator>
<s:debug></s:debug>
输出结果:
0-1:bbb
1-2:ccc
2-3:ddd
sort 标签
sort 标签用来对一个可遍历对象里的元素进行排序.
<s:sort comparator="#request.comparator" source="#request.product2" var="product2"></s:sort>
<!--var放到域对象里面的key所对应的值-->
<s:iterator value="#attr.product2" status="status" begin="1" end="3">
<!--value取出值-->
${status.index}-${status.count}:${productName}<br>
</s:iterator>
date 标签
date 标签用来对 Date 对象进行排版
<s:data name="#session.date" format="yyyy-MM-dd hh:mm:ss" var="date2"/>
date:${date2}
a 标签
a 标签将呈现为一个 HTML 连接. 这个标签可以接受 HTML 语言中的 a 元素所能接受的所有属性.
<s:iterator value="#request.product2" status="status" begin="1" end="3">
<br>
<s:a href="getName.action?productName=%{productName}">${productName}</s:a>
</s:iterator>