异常处理:exception-mapping元素

exception-mapping元素:配置当前的action的声明式异常处理

exception-mapping元素有两个属性:

--exception:指定需要铺货的异常类型

--result:指定一个响应结果,该结果将在捕获到指定异常时被执行,既可以来自当前action的声明也可以来自global-results声明。

可以通过global-exception-mappings元素为应用程序提供一个全局性的异常补货映射,但是在global-exception-mapping元素下声明的任何exception-mapping元素只能在global-results元素下声明的某个result元素。

声明式异常处理机制由ExceptionMappingInteceptor拦截器负责处理,当某个exception-mapping元素声明的异常被捕获到时,ExceptionMappingInterceptor拦截器就会向ValueStack中添加两个对象:

--exception:表示被捕获异常的Exception对象

--exceptionStack:包含着呗捕获异常的栈

可以在视图上通过<s:property/>标签显示异常消息

看代码:

package logan.struts.study;

import java.util.Map;

import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack; public class Product implements RequestAware,SessionAware{ private Integer productId;
private String productName;
private String productDesc; private double productPrice; public Integer getProductId() {
return productId;
} public void setProductId(Integer productId) {
this.productId = productId;
} public String getProductName() {
return productName;
} public void setProductName(String productName) {
this.productName = productName;
} public String getProductDesc() {
return productDesc;
} public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
} public double getProductPrice() {
return productPrice;
} public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
} @Override
public String toString() {
return "Product [productId=" + productId + ", productName=" + productName + ", productDesc=" + productDesc
+ ", productPrice=" + productPrice + "]";
} public String save(){
System.out.println("save: " + this); ValueStack valueStack = ActionContext.getContext().getValueStack();
Test test = new Test(); test.setProductDesc("AABBCCDD");
test.setProductName("ABCD");
valueStack.push(test); session.put("product", this); request.put("test", test); int i = 10/0; return "success";
} private Map<String, Object> session;
private Map<String, Object> request; @Override
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.session = session; } @Override
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
this.request = request; }
}
package logan.struts.study;

public class Test {

    private String productName;
private String productDesc;
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
} }

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 打开静态方法调用的限制 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="product-save" class="logan.struts.study.Product" method="save">
<exception-mapping result="input" exception="java.lang.ArithmeticException"></exception-mapping>
<result name="input">/input.jsp</result>
<result>/details.jsp</result> </action> </package> </struts>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>struts2-5</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

details.jsp

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
productId:${productId }
<br><br>
productName:${productName }
<br><br>
productDesc:${productDesc }
<br><br>
productPrice:${productPrice }
<br><br>
productPrice:<s:property value="productPrice"/>
<br><br>
productName1:${sessionScope.product.productName }
<br><br>
productName1.1:<s:property value="#session.product.productName"/>
<br><br>
productName2:${requestScope.test.productName }
<br><br>
productName2.1:<s:property value="#request.test.productName"/>
<br><br>
<!-- 使用 OGNL 调用public 类的public类型的静态字段和静态方法 -->
<s:property value="@java.lang.Math@PI"/>
<br><br>
<s:property value="@java.lang.Math@cos(0)"/>
<br><br>
<!-- 调用对象栈的方法为一个属性赋值 -->
<s:property value="setProductName('logan')"/>
<br><br>
<s:property value="productName"/>
<br><br>
<%
String [] names = new String[]{"aa","bb","cc","dd"};
request.setAttribute("names", names);
%>
length: <s:property value="#attr.names.length"/>
<br><br>
names[2]:<s:property value="#attr.names[2]"/>
<br><br>
<%
Map<String,String> letters = new HashMap<String,String>();
request.setAttribute("letters", letters);
letters.put("AA", "a");
letters.put("BB", "b");
letters.put("CC", "c"); %>
<!-- 使用OGNL访问Map -->
<s:property value="#attr.letters.size"/>
<br><br>
AA:<s:property value="#attr.letters['AA']"/> </body>
</html>

input.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<br>
<s:property value="exception"/>-${exception }
<br>
<s:property value="exception.message"/>-${exception.message }
<br> <form action="product-save.action" method="post">
ProductName:<input type="text" name="productName">
<br><br>
ProductDesc:<input type="text" name="productDesc">
<br><br>
ProductPrice:<input type="text" name="productPrice">
<br><br>
<input type="submit" value="Submit">
<br><br>
</form> </body>
</html>

Struts2学习第八课 声明式异常处理的更多相关文章

  1. Struts2学习---拦截器+struts的工作流程+struts声明式异常处理

    这一节我们来看看拦截器,在讲这个之前我是准备先看struts的声明式异常处理的,但是我发现这个声明式异常处理就是由拦截器实现的,所以就将拦截器的内容放到了前面. 这一节的内容是这样的: 拦截器的介绍 ...

  2. Struts2的声明式异常处理

    在struts2应用程序中你还在使用try catch语句来捕获异常么?如果是这样的,那你OUT啦!struts2支持声明式异常处理,可以再Action中直接抛出异常而交给struts2来 处理,当然 ...

  3. struts的声明式异常处理

    情景 使用Struts封装的下载文件的功能 当下载文件找不到的时候,struts获取的InputStream为null 这个时候,就会报500错误 java.lang.IllegalArgumentE ...

  4. 6.声明式异常处理、I18N

    声明式异常处理 1.在Action 中进行异常映射 <exception-mapping result="error" exception="java.sql.SQ ...

  5. Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板

    原文:Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...

  6. 学习Struts框架系列(三):声明式异常处理

    在Struts1.X的版本中加入了对异常的处理Exception Handler,有了它我们可以不使用try/catch捕获异常,一旦出现了我们已经定义的异常,那么就会转到相应的页面,并且携带异常信息 ...

  7. JAVAWEB 一一 框架整合(SSH,Spring+Struts2+Hibernate IOC/DI AOP声明式事务处理 定时任务)

    package org.springframework.orm.hibernate3; import java.io.Serializable; import java.util.List; impo ...

  8. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring声明式事务管理(基于Annotation注解方式实现)

    在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理. 使用 Annotation 的方式非常简单,只需要在项目 ...

  9. Struts2声明式异常处理

    通过配置.xml文件的方式处理异常信息: 注意:配置.xml文件的同时还要抛出异常 标签:<exception-mapping></exception-mapping>和< ...

随机推荐

  1. systemverilog FAQ(zz)

    1. What is clocking block? Ans: Clocking block can be declared using the keywords clocking and endcl ...

  2. 斯坦福机器学习视频笔记 Week2 多元线性回归 Linear Regression with Multiple Variables

    相比于week1中讨论的单变量的线性回归,多元线性回归更具有一般性,应用范围也更大,更贴近实际. Multiple Features 上面就是接上次的例子,将房价预测问题进行扩充,添加多个特征(fea ...

  3. Sqoop-1.4.4工具import和export使用详解

    转自:http://blog.csdn.net/wodatoucai/article/details/46343291 Sqoop可以在HDFS/Hive和关系型数据库之间进行数据的导入导出,其中主要 ...

  4. 大话设计模式--访问者模式 Visitor -- C++实现实例

    1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...

  5. 【海量之道】海量之道之SET模型

    本文介绍了set模型. 一 提供海量服务时面对的场景 场景1:如何令黄村机房的TWS机器访问黄村机房的APP服务,避免TWS跨机房调用永丰机房的APP机器? 场景2:DB和Redis如何实现快慢分离, ...

  6. Unity3D之Mesh(七)绘制长方体

    前言: 从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型mesh!依然从简单入手:长方体. 一.基本思路 由于是创建长方体mesh,由之前的研究得知,两个数据必须要有,即:顶点的数据:ver ...

  7. Python习题-统计日志中访问次数超过限制的IP

    #1.1分钟之内ip访问次数超过200次的,就给他的ip加入黑名单#需求分析: #1.读日志,1分钟读一次 #2.获取这1分钟之内所有访问的ip #3.判断ip出现的次数,如果出现200次,那么就加入 ...

  8. Git_学习_06_ 放弃本地修改

    一.未使用 git add 缓存代码时 git checkout -- filepathname // 放弃某个文件 git checkout . // 放弃所有文件 git checkout . 用 ...

  9. Android之SharedPreferences权限

    import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; pub ...

  10. 优秀开源项目之一:视频监控系统iSpy

    iSpy是一个开源的视频监控软件,目前已经支持中文.自己用了一下,感觉还是很好用的.翻译了一下它的介绍. iSpy将PC变成一个完整的安全和监控系统 iSpy使用您的摄像头和麦克风来检测和记录声音或运 ...