`
xxp3369
  • 浏览: 151222 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

编程式异常 -声明式异常

阅读更多
1、编程式异常
* 截获异常
* 创建相应的异常消息
* 传递异常消息
* 转向相应的页面处理异常
2、声明式异常(自动处理的异常)
* 在struts-config.xml文件中配置<exeception/>标签
* 理解局部和全局exception
* 注意局部<exception/>标签需要配置到<forward/>标签的前面,详见dtd中的约束

<exeception/>标签中的属性说明:
* key:指异常信息对应的国际化消息文本,这个key值需要在国际化资源文件中定义
* type: 处理那种异常
* path: 定义一但出现异常,需要转向那个页面,如果不定义path,
         默认情况下将使用<action>标签中input属性对应的页面
* scope:可以取值request和session,默认为request
* handler:异常的处理类,struts默认采用org.apache.struts.action.ExceptionHandler,
            如果做个性化的异常处理可以继承此类覆写相应的方法
           
参见:ErrorCodeExceptionHandler.java和AppExceptionHandler.java
           


struts-config.xml


<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>

	<form-beans>
		<form-bean name="loginForm" type="com.bjsxt.struts.LoginActionForm"/>
	</form-beans>
	
	<global-exceptions>
	<!-- 
			<exception key="user.not.found" type="com.bjsxt.struts.UserNotFoundException" path="/login_error.jsp"/>
			<exception key="user.password.error" type="com.bjsxt.struts.PasswordErrorException" path="/login_error.jsp"/>
	 -->
	 
	 <!-- 
		<exception key="user.not.found" type="com.bjsxt.struts.UserNotFoundException" handler="org.apache.struts.action.ExceptionHandler"/>
		<exception key="user.password.error" type="com.bjsxt.struts.PasswordErrorException" handler="org.apache.struts.action.ExceptionHandler"/>
	 -->
	 
	 <!-- 
	 <exception key="error.exception" type="com.bjsxt.struts.ErrorCodeException" handler="com.bjsxt.struts.ErrorCodeExceptionHandler"/>
	  -->
	  <!-- 
	  <exception key="error.exception" type="com.bjsxt.struts.AppException" handler="com.bjsxt.struts.AppExceptionHandler"/>
	   -->	
	  
	  <exception key="error.exception" type="com.bjsxt.struts.AppException"/> 
	</global-exceptions>
		
	<action-mappings>
		<action path="/login"
				type="com.bjsxt.struts.LoginAction"
				name="loginForm"
				scope="request"
				validate="false"
				input="/login.jsp"
		>	
		<!-- 
			<exception key="user.not.found" type="com.bjsxt.struts.UserNotFoundException" path="/login_error.jsp"/>
			<exception key="user.password.error" type="com.bjsxt.struts.PasswordErrorException" path="/login_error.jsp"/>
		 -->	
			<forward name="success" path="/login_success.jsp"/>
			<forward name="error" path="/login.jsp"/>
		</action>
		
		<action path="/changelang"
				type="com.bjsxt.struts.ChangeLanguageAction"
		>
			<forward name="index" path="/index.jsp"/>
		</action>
		
		<action path="/login1"
				type="org.apache.struts.actions.ForwardAction"
				parameter="/login.jsp"
		></action>
	</action-mappings>
	
	<message-resources parameter="res.MessageResources" />
</struts-config>



login.jsp


<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>  
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>  
<!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=GB18030">
<title><bean:message key="user.title"/></title>
</head>
<body>
	<h1><bean:message key="user.title"/></h1>
	<hr>
	<!-- 
	<font color="red">
		<html:messages id="msg" property="error1">
			<bean:write name="msg"/>
		</html:messages>
	</font>	
	<font color="blue">
		<html:messages id="msg" property="error2">
			<bean:write name="msg"/>
		</html:messages>
	</font>	
	 -->
	 <html:errors/>
	<form action="login.do" method="post">
		<bean:message key="user.username"/>:<input type="text" name="username"><br>
		<bean:message key="user.password"/>:<input type="password" name="password"><br>
		<input type="submit" value="<bean:message key="user.button.login"/>">
	</form>
</body>
</html>



login_success.jsp


引用
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>      
<!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=GB18030">
<title></title>
</head>
<body>
<html:messages id="msg" message="true" property="loginSuccess1">
<bean:write name="msg"/>
</html:messages>
</body>
</html>



login_error.jsp



<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>       
   
<!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=GB18030">
<title></title>
</head>
<body>
	<font color="red">
	<!-- 
	<li>
		<html:messages id="msg" property="error1">
			<bean:write name="msg"/>
		</html:messages>
	</li>
	</font>	
	<font color="blue">
	<li>
		<html:messages id="msg" property="error2">
			<bean:write name="msg"/>
		</html:messages>
	</li>	
	</font>	
	 -->
	 <html:errors/>
</body>
</html>



login_jstl.jsp


<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<fmt:setLocale value="${header['accept-language']}"/>
<fmt:setBundle basename="res.MessageResources"/>
<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title><fmt:message key="user.title"/></title>
</head>
<body>
	<h1><fmt:message key="user.title"/></h1>
	<hr>
	<form action="login.do" method="post">
		<fmt:message key="user.username"/>:<input type="text" name="username"><br>
		<fmt:message key="user.password"/>:<input type="password" name="password"><br>
		<input type="submit" value="<fmt:message key="user.button.login"/>">
	</form>
</body>
</html>




UserManager.java


package com.bjsxt.struts;

public class UserManager {

	private static UserManager instance = new UserManager();
	
	private UserManager() {}
	
	public static UserManager getInstance() {
		return instance;
	}
	
//	public void login(String username, String password) {
//		if (!"admin".equals(username)) {
//			throw new UserNotFoundException(username);
//		}
//		if (!"admin".equals(password)) {
//			throw new PasswordErrorException();
//		}
//	}

//	public void login(String username, String password) {
//		if (!"admin".equals(username)) {
//			throw new ErrorCodeException("user.not.found", username);
//		}
//		if (!"admin".equals(password)) {
//			throw new ErrorCodeException("user.password.error");
//		}
//	}

	public void login(String username, String password) {
		if (!"admin".equals(username)) {
			throw new AppException("用户不能找到,用户=【" + username + "】");
		}
		if (!"admin".equals(password)) {
			throw new AppException("密码不正确!");
		}
	}
	
}



AppException.java


package com.bjsxt.struts;

public class AppException extends RuntimeException {
	
	public AppException(String msg) {
		super(msg);
	}
}


AppExceptionHandler.java


package com.bjsxt.struts;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.config.ExceptionConfig;
import org.apache.struts.util.ModuleException;

public class AppExceptionHandler extends ExceptionHandler {
	
	   public ActionForward execute(
		        Exception ex,
		        ExceptionConfig ae,
		        ActionMapping mapping,
		        ActionForm formInstance,
		        HttpServletRequest request,
		        HttpServletResponse response)
		        throws ServletException {
		   		
		   		if (!(ex instanceof AppException)) {
		   			return super.execute(ex, ae, mapping, formInstance, request, response);
		   		}
		   		
		        ActionForward forward = null;
		        ActionMessage error = null;
		        String property = null;

		        // Build the forward from the exception mapping if it exists
		        // or from the form input
		        if (ae.getPath() != null) {
		            forward = new ActionForward(ae.getPath());
		        } else {
		            forward = mapping.getInputForward();
		        }

		        // Figure out the error
		        if (ex instanceof ModuleException) {
		            error = ((ModuleException) ex).getActionMessage();
		            property = ((ModuleException) ex).getProperty();
		        } else {
		        	AppException appe = (AppException)ex;
		        	error = new ActionMessage(ae.getKey(), appe.getMessage());
		        	property = error.getKey();
		        	
		            //error = new ActionMessage(ae.getKey(), ex.getMessage());
		            //property = error.getKey();
		        }

		        this.logException(ex);

		        // Store the exception
		        request.setAttribute(Globals.EXCEPTION_KEY, ex);
		        this.storeException(request, property, error, forward, ae.getScope());

		        return forward;

		    }	
}
分享到:
评论

相关推荐

    spring编程式事务与声明式事务详解

    Spring 编程式事务与声明式事务详解 本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便...

    配套响应式编程代码reactor-flux

    响应式编程是一种编程范式,它允许程序员以声明式的方式处理数据流和变换,使得程序能够更高效地处理异步和并发操作。在Java生态中,Reactor与Flux是两个核心概念,它们是Spring Framework的重要组成部分,用于实现...

    全面分析 Spring 的编程式事务管理及声明式事务管理

    本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...

    Java语言编程规范--华为技术有限公司

    6. **变量声明** - 避免使用全局变量,尽可能使用局部变量。 - 优先使用final关键字,确保变量不可变。 7. **接口与实现** - 接口定义清晰,避免过多的方法,注重单一职责原则。 - 尽可能使用接口而非抽象类,...

    全面分析_Spring_的编程式事务管理及声明式事务管理.

    本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...

    Java-Java函数式编程教程

    Stream API的设计非常适合函数式编程,因为它鼓励使用声明式编程风格,而不是命令式风格。 4. **Optional类**: Optional是一个容器类,代表一个值存在或不存在。它帮助防止空指针异常,鼓励程序员显式处理缺失值...

    JAVA编程基础-07异常处理-zhouxl.pdf

    ### JAVA编程基础-07异常处理-zhouxl.pdf #### 异常简介 **异常**是在程序执行过程中发生的,导致程序不能正常运行的情况。这些情况并非由语法错误引起,而是由于程序运行时遇到的一些不可预料的情况,比如打开一...

    使用Spring的声明式事务----Annotation注解方式

    与编程式事务(即手动编写事务管理代码)不同,声明式事务是通过AOP(面向切面编程)实现的,它将事务管理逻辑与业务逻辑分离,使得事务管理更加灵活且易于维护。 在Spring中,我们可以使用XML配置文件来声明事务,...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    本主题将深入探讨Hibernate的编程式事务管理和Spring AOP的声明式事务管理,以及两者如何在实际项目中集成使用。 **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的...

    spring学习之八--Hibernate编程式事务

    编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、提交、回滚等操作。这在某些特定场景下,如复杂的事务逻辑或需要自定义事务边界时,是很有用的。 首先,我们需要了解...

    商业编程-源码-VC常见问题集.zip

    在VC编程中,编译错误是最常见的问题之一,可能涉及到语法错误、类型不匹配、未声明的变量或函数等。解决这些问题通常需要仔细检查代码,确保遵循C++语法规则,并正确引用所有必要的库和头文件。 二、链接错误 当...

Global site tag (gtag.js) - Google Analytics