- 浏览: 885836 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
一、概述
在Struts1.X的版本中加入了对异常的处理 Exception Handling,有了它就不需要我们用try/catch等捕获异常,一旦出现了我们已经定义的异常那么就会转到相应得页面,并且携带定制的信息。Struts框架提供了默认的异常处理org.apache.struts.action.ExceptionHandler,它的execute()方法负责处理异常。在需要实现自定义处理时重写方法,可以在配置文件定义由谁来处理Action类中掷出的某种异常。
二、Struts框架处理异常的流程
struts的控制器负责捕获各种异常,包括控制器运行中本身抛出的异常,以及调用模型的业务方法时抛出的异常。当struts的控制器捕获到异常后,在异常处理代码块中,创建描述信息的actionMessage对象把它保存在acionMessages(或其子类actionErrors)对象中,然后把actionMessage保存在特定范围(配置文件中的scope)。然后可以用<html:errors />检索特定范围内的actionMessages对象
三、实现步骤
- 创建自己的异常处理类
- package com.fengzhiyin.common;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- 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.config.ExceptionConfig;
- import org.apache.struts.util.ModuleException;
- public class ExceptionHandler extends org.apache.struts.action.ExceptionHandler {
- /**
- * Logger for this class
- */
- private static final Log logger = LogFactory.getLog(ExceptionHandler.class);
- /*
- * (non-Javadoc)
- */
- @Override
- public ActionForward execute(Exception ex, ExceptionConfig config, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request,
- HttpServletResponse response) throws ServletException {
- if (logger.isDebugEnabled()) {
- logger.debug("execute(Exception, ExceptionConfig, ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) - start");
- }
- logger.warn("action exception.", ex);
- String f = (String) request.getAttribute("exceptionForward");
- request.setAttribute("javax.servlet.jsp.jspException", ex);
- 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 (config.getPath() != null) {
- forward = new ActionForward(config.getPath());
- } else if (f != null) {
- forward = f.indexOf(".jsp") == -1 ? mapping.findForward(f) : new ActionForward(f);
- } else {
- forward = mapping.getInputForward();
- }
- // Figure out the error
- if (ex instanceof ModuleException) {
- error = ((ModuleException) ex).getActionMessage();
- property = ((ModuleException) ex).getProperty();
- } else {
- error = new ActionMessage(config.getKey(), ex.getMessage());
- property = error.getKey();
- }
- this.logException(ex);
- // Store the exception
- request.setAttribute(Globals.EXCEPTION_KEY, ex);
- this.storeException(request, property, error, forward, config.getScope());
- if (logger.isDebugEnabled()) {
- logger.debug("execute(Exception, ExceptionConfig, ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) - end");
- }
- return forward;
- }
- }
package com.fengzhiyin.common; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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.config.ExceptionConfig; import org.apache.struts.util.ModuleException; public class ExceptionHandler extends org.apache.struts.action.ExceptionHandler { /** * Logger for this class */ private static final Log logger = LogFactory.getLog(ExceptionHandler.class); /* * (non-Javadoc) */ @Override public ActionForward execute(Exception ex, ExceptionConfig config, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws ServletException { if (logger.isDebugEnabled()) { logger.debug("execute(Exception, ExceptionConfig, ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) - start"); } logger.warn("action exception.", ex); String f = (String) request.getAttribute("exceptionForward"); request.setAttribute("javax.servlet.jsp.jspException", ex); 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 (config.getPath() != null) { forward = new ActionForward(config.getPath()); } else if (f != null) { forward = f.indexOf(".jsp") == -1 ? mapping.findForward(f) : new ActionForward(f); } else { forward = mapping.getInputForward(); } // Figure out the error if (ex instanceof ModuleException) { error = ((ModuleException) ex).getActionMessage(); property = ((ModuleException) ex).getProperty(); } else { error = new ActionMessage(config.getKey(), ex.getMessage()); property = error.getKey(); } this.logException(ex); // Store the exception request.setAttribute(Globals.EXCEPTION_KEY, ex); this.storeException(request, property, error, forward, config.getScope()); if (logger.isDebugEnabled()) { logger.debug("execute(Exception, ExceptionConfig, ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) - end"); } return forward; } }
- 定义异常处理配置文件
全局异常 在struts-config.xml中定义<global-exceptions />- <global-exceptions><!-- 元素可以包含一个或者多个<exception> -->
- <exception
- key="error.common"<!-- <message-resources parameter="MessageResources" />中的key -->
- type="com.fengzhiyin.exception.ExistException"<!-- 指定需要处理异常类的名字 -->
- handler="com.bjnv.water.common.ExceptionHandler" <!-- 指定异常处理类默认是ExceptionHandler -->
- path="/jsp/common/error.jsp"<!-- 指定当前异常发生的时候转发的路径 -->
- scope="request"><!-- 指定ActionMessages实例存放的范围 -->
- </exception>
- </global-exceptions>
<global-exceptions><!-- 元素可以包含一个或者多个<exception> --> <exception key="error.common"<!-- <message-resources parameter="MessageResources" />中的key --> type="com.fengzhiyin.exception.ExistException"<!-- 指定需要处理异常类的名字 --> handler="com.bjnv.water.common.ExceptionHandler" <!-- 指定异常处理类默认是ExceptionHandler --> path="/jsp/common/error.jsp"<!-- 指定当前异常发生的时候转发的路径 --> scope="request"><!-- 指定ActionMessages实例存放的范围 --> </exception> </global-exceptions>
上述代码在struts-config.xml中定义了一个全局异常,它的作用是抛出ExistException(本处的意思是当在添加用户时候发现该用户名已经存在)异常的时候返回到error.jsp中,并且携带自定的比较规范的异常信息expired.existName,expired.existName可以在应用程序的资源配置文件中找到,如:
expired.existName=你要添加的用户名称已经存在,请添加新的名称!
局部异常 在struts-config.xml中定义<global-exceptions />- <action-mappings>
- <action path=”/waterUser”
- type=”**Action”
- name=”*Form”>
- <exception key=”<SPAN style="FONT-SIZE: x-small">expired.existName</SPAN>”
- type=” com.fengzhiyin.exception.ExistException”
- path=”/error.jsp”/>
- <forward name=”success” path=”***”/>
- </action>
- </action-mappings>
<action-mappings> <action path=”/waterUser” type=”**Action” name=”*Form”> <exception key=”expired.existName” type=” com.fengzhiyin.exception.ExistException” path=”/error.jsp”/> <forward name=”success” path=”***”/> </action> </action-mappings>
- 创建异常信息显示页面
- <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
- <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
- <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
- <html:html locale="true">
- <head>
- <title> Exception Handler</title>
- <html:base />
- </head>
- <body>
- <h1>系统出现一个意外</h1>
- 请将下面的提示信息反馈给你的系统管理员:<br>
- <html:errors /> <!--将在这里显示”<SPAN style="FONT-SIZE: x-small; COLOR: #0000ff">你要添加的用户名称已经存在,请添加新的名称!</SPAN>”-->
- </body>
- </html:html>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <html:html locale="true"> <head> <title> Exception Handler</title> <html:base /> </head> <body> <h1>系统出现一个意外</h1> 请将下面的提示信息反馈给你的系统管理员:<br> <html:errors /> <!--将在这里显示”你要添加的用户名称已经存在,请添加新的名称!”--> </body> </html:html>
-
创建测试action
- public class **Action extends BaseAction {
- public ActionForward execute(ActionMapping mapping,
- ActionForm form,
- HttpServletRequest request,
- HttpServletResponse response)throws Exception {
- throw com.fengzhiyin.exception.ExistException();
- }
- }
public class **Action extends BaseAction { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception { throw com.fengzhiyin.exception.ExistException(); } }
转http://fengzhiyin.iteye.com/blog/432182
发表评论
-
struts2 拦截器获取 request
2011-11-26 23:23 1036ActionContext actionContext = ... -
Struts2与DWR在项目中的共存解决方案
2011-09-10 22:35 889在struts2.properties中配置即可. strut ... -
Struts串讲
2011-02-11 10:40 1219Struts串讲 一、struts概述 1、Strut ... -
struts2 配置文件中,一个package中有多个name属性相同的action的执行
2011-01-26 08:53 1261如果在一个package中有多个name属性相同的action ... -
Struts1.x note
2010-10-26 17:32 1185转自http://javaee-dev.iteye.com/ ... -
密码MD5加密及日期转换器
2010-10-26 10:21 2024今天继续学习bbs项目,汤老师讲了会员注册的实现,要对密码进行 ... -
传智播客erp项目学习,防止表单重复提交及MRP
2010-10-26 09:47 906今天结束了erp的学习, ... -
ActionForm的生命周期浅探
2010-10-21 12:48 1004看了很多的资料书籍,都提了一下ActionForm的生命周期。 ... -
Struts 1.x | <html> 标签库
2010-10-21 12:11 1759html标签库 生成html元 ... -
commons-beanutils包ConvertUtils使用(二)
2010-10-13 16:37 20131.org.apache.commons.beanutils. ... -
org.apache.commons.beanutils.ConvertUtils
2010-10-13 16:33 1355ConvertUtils,这个工具类的职能是在字符串和指定类型 ... -
透析struts中的redirect="true"与redirect="false"
2010-10-13 13:28 1723再struts-config.xml文件的forward下有个 ... -
struts-config.xml的controller 元素
2010-10-13 13:07 1312<controller>用于配置A ... -
防止刷新、重复提交
2010-09-06 10:33 744问题场景:在项目的添加方法中,添加完毕后,当用户再次刷新当前页 ... -
struts中ActionServlet核心处理RequestProcessor.process()
2010-08-29 17:04 1249public void process(HttpServlet ...
相关推荐
- 使用Spring的`@ExceptionHandler`注解处理控制器中的异常。 4. **性能优化**: - 对于Hibernate,合理配置缓存策略,减少数据库访问频率。 - 采用懒加载等技术,提升系统响应速度。 5. **安全性**: - 实现...
7. **异常处理**:项目可能会包含全局的异常处理机制,如使用Spring的`@ExceptionHandler`注解或Struts2的拦截器,来统一处理可能出现的运行时异常,提高用户体验。 8. **测试与调试**:为了保证项目的稳定性和正确...
SSH框架提供了处理异常的方式,例如使用Spring的@ControllerAdvice和@ExceptionHandler注解进行全局异常捕获和处理。 这个项目是一个综合性的学习案例,涵盖了Java Web开发的基础和进阶知识,包括前端页面设计、...
2. **异常处理**:合理配置全局异常处理,例如在Spring MVC中设置@ControllerAdvice和@ExceptionHandler。 3. **日志管理**:添加适当的日志库,如log4j或logback,以便调试和监控应用状态。 4. **事务管理**:...
8. **异常处理**:理解Spring的全局异常处理机制,如@ControllerAdvice和@ExceptionHandler注解。 9. **性能优化**:包括数据库查询优化、缓存策略、线程池配置等,以提升系统性能。 10. **安全控制**:Spring ...
- **异常处理**:统一异常处理机制可以提高应用的健壮性,如使用Spring的`@ExceptionHandler`注解或Struts的全局异常处理。 - **测试**:SSHJ整合项目通常会使用JUnit和Mockito等工具进行单元测试和集成测试,保证...
通过`exception`子元素,可以指定特定异常与ExceptionHandler的映射,处理Java运行时异常。它包括`className`、`handler`、`key`、`path`、`scope`、`type`和`bundle`等属性,用于指定处理类、消息键、转发路径等。 ...
在实际项目中,Spring MVC 可以与 Struts 和 Hibernate 整合,实现业务逻辑处理和数据持久化。在本实例中,如果标签为 "JAVA",可能意味着涉及了 Spring MVC 与其他 Java 框架的集成。 6. **模型数据传递** Model ...
- 使用Spring MVC的异常处理机制,如@ControllerAdvice和@ExceptionHandler,来统一处理全局异常。 - 配置视图解析器,如InternalResourceViewResolver,指定视图路径前缀和后缀,以便Spring MVC能正确找到JSP或...
12. `@ControllerAdvice` 和 `@ExceptionHandler`:全局异常处理,可以在一个地方处理所有控制器中的异常。 13. `@Configuration` 和 `@Bean`:这两个注解一起使用,可以替代XML配置,创建和定义Bean。 在SSH集成...