- 浏览: 1230982 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
struts声明式异常:
在配置文件中配置exception属性,并配以相应在的异常类型,那么程序中遇到这类异常就会自动处理异常信息. 如下例:登录action处理中会抛出UserNotFoundException,那么采用声明式异常: <action path="/logon" type="com.lwf.struts.action.LogonAction" name="logonForm" input="/logon.jsp" scope="session" validate="true" > <exception key="error.login.usernull" type="com.lwf.struts.util.UserNotFoundException" path="/index.jsp" ></exception> </action>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>logon</title> </head> <body> <html:errors/> <html:form action="logon"> <table border="0" width="100%"> <tr> <th align="right"><bean:message key="login.user"/></th> <td align="left"><html:text property="username" size="20" maxlength="20"></html:text></td> </tr> <tr> <th align="right"><bean:message key="login.pwd"/></th> <td align="left"><html:password property="password" size="20" maxlength="20"></html:password></td> </tr> <tr> <td align="right"><html:submit>logonin</html:submit> </td> <td align="left"><html:button property="register" >register</html:button><html:reset>reset</html:reset></td> </tr> </table> </html:form> </body> </html:html>
package com.lwf.struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; 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.ActionMessages; import com.lwf.struts.form.LogonForm; import com.lwf.struts.util.UserManageEntity; import com.lwf.struts.util.UserNotFoundException; public class LogonAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ActionMessages errors = new ActionMessages(); ActionForward forward = new ActionForward(); LogonForm logonForm = (LogonForm)form; String name = logonForm.getUsername(); String pwd = logonForm.getPassword(); UserManageEntity.UserManager(name); // try { // UserManageEntity.UserManager(name); // errors.add("logonerror1", new ActionMessage("error.login.user"," myerrmsg")); // this.saveMessages(request, errors); // request.getSession().setAttribute("user", logonForm); // forward = mapping.findForward("success"); // } catch (UserNotFoundException e) { // errors.add("logonerror2", new ActionMessage("error.login.again"," error2")); // this.saveErrors(request, errors); // forward = mapping.findForward("error"); // } // forward = mapping.findForward("success"); return forward; } }
上面注释部分就是采用编程式异常的代码.现在采用声明式异常就不用不需要再catch异常
package com.lwf.struts.util; public class UserNotFoundException extends Exception { public UserNotFoundException(){} public UserNotFoundException(String message){ super(message); } }
查看配置文件中注意:
<action path="/logon" type="com.lwf.struts.action.LogonAction" name="logonForm" input="/logon.jsp" scope="session" validate="true" > <exception key="error.login.usernull" type="com.lwf.struts.util.UserNotFoundException" path="/index.jsp" ></exception> </action>
type异常类型,key消息文本.当struts碰到这个异常会默认转向到input指向的jsp页面.消息文本为key所指的值.
如果在exception添加path属性,如上面path="/index.jsp" 那么异常会转向到index.jsp而不是logon.jsp
ApplicationResources.properties文件中内容:
error.login.usernull = user must not null
运行程序输出结果:
user must not null
看看struts源代码:
// Call the Action instance itself ActionForward forward = processActionPerform(request, response, action, form, mapping);
protected ActionForward processActionPerform(HttpServletRequest request, HttpServletResponse response, Action action, ActionForm form, ActionMapping mapping) throws IOException, ServletException { try { return (action.execute(mapping, form, request, response)); } catch (Exception e) { return (processException(request, response, e, form, mapping)); } }
protected ActionForward processException(HttpServletRequest request, HttpServletResponse response, Exception exception, ActionForm form, ActionMapping mapping) throws IOException, ServletException { // Is there a defined handler for this exception? ExceptionConfig config = mapping.findException(exception.getClass()); if (config == null) { log.warn(getInternal().getMessage("unhandledException", exception.getClass())); if (exception instanceof IOException) { throw (IOException) exception; } else if (exception instanceof ServletException) { throw (ServletException) exception; } else { throw new ServletException(exception); } } // Use the configured exception handling try { ExceptionHandler handler = (ExceptionHandler) RequestUtils.applicationInstance(config .getHandler()); return (handler.execute(exception, config, mapping, form, request, response)); } catch (Exception e) { throw new ServletException(e); } }
从上面我们知道struts声明式异常默认使用ExceptionHandler 来处理,我们可以自己定义异常处理类,从而改变默认声明式异常处理的行为.在配置文件中exception 中增加handler属性
public ActionForward execute(Exception ex, ExceptionConfig ae, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws ServletException { LOG.debug("ExceptionHandler executing for exception " + ex); ActionForward forward; ActionMessage error; String property; // 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 { 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()); if (!response.isCommitted()) { return forward; } LOG.debug("Response is already committed, so forwarding will not work." + " Attempt alternate handling."); if (!silent(ae)) { handleCommittedResponse(ex, ae, mapping, formInstance, request, response, forward); } else { LOG.warn("ExceptionHandler configured with " + SILENT_IF_COMMITTED + " and response is committed.", ex); } return null; }
以上代码是不是解释了异常会默认转向到input指向的jsp页面. 如果在exception添加path属性,如上面path="/index.jsp" 那么异常会转向到index.jsp而不是logon.jsp
上面代码也解释了为什么配置文件exception的key属性在这里要与资源文件相对应。因为
error = new ActionMessage(ae.getKey(), ex.getMessage());
这个方法传入的第一个参数为ae.getKey()即exception下的key值。
如果我们继承ExceptionHandler并复写了excute方法,可以改变传入的参数值。具体看
http://quicker.iteye.com/blog/636332
我们也可以定义全局异常
<global-exceptions> <exception key="error.login.usernull" type="com.lwf.struts.util.UserNotFoundException" path="/index.jsp" ></exception> </global-exceptions>
那么当前应用如果配置了input属性,发生异常转向该属性所指页面,如果当前应用配置了exception配置了path则转向path所指页面,如果当前应用input,path都没有或者当前应用没配置exception,那么查找是否配置全局异常,如果有配置,那么转向到全局应用的path所指页面
在上面我们知道声明式异常默认采用ExceptionHandler来处理.但我们修改资源文件将
error.login.usernull = user must not null
改为
error.login.usernull = user must not null{0}
即增加参数我们会发现默认的异常处理并不能输出参数信息.
下文将对声明式异常默认不能输出参数信息的问题进行探讨。
http://quicker.iteye.com/blog/636332
发表评论
-
DispatchAction 和DynaValidateActionForm 结合使用时的问题
2011-03-08 16:23 935使用DispatchAction使得程序员能够大大减少acti ... -
ActionForm中使用集合属性并自动组装数据
2011-01-18 14:32 929http://blog.csdn.net/m0085_cn/a ... -
Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
2010-11-10 14:13 976开的过程中碰到问题:Cannot find bean org. ... -
Struts 结合 Validate框架验证详解
2010-10-25 14:00 1508转自:http://student.csdn.net/spac ... -
JSTL与struts1标签
2010-08-31 10:17 1555JSTL与struts标签: http://www.360d ... -
如何自动清空struts表单域
2010-06-30 17:44 1270为了某种需要,formBean的SCOPE设置成了ses ... -
form验证与动态验证框架
2010-06-06 17:22 1391form验证返回ActionErrors. 动态验证则实现J ... -
resourcebundleeditor在eclipse里面的设置和使用
2010-05-30 11:30 1752我们一般使用native2ascii工具得到struts资源文 ... -
使用DispatchAction分发
2010-04-07 18:04 1160应用中经常有增、删、改、查操作,如果象一前一样使用List ... -
forward属性与ForwardAction类
2010-04-07 17:08 1174forward属性与ForwardAction类在配置文件按以 ... -
struts容错处理
2010-04-07 15:20 1188struts容错处理: 当客户请求的action不存在的时候 ... -
struts声明式异常二
2010-04-07 15:18 1175上文如果资源文件改为: error.login.usernu ... -
struts编程式异常--html:error与html:message
2010-04-03 11:39 2042struts编程式异常过程: 截获异常信息;创建异常信息; ... -
struts国际化,从资源文件读取异常信息
2010-04-03 01:56 1201示例演示登录时从资源文件读取用户名或密码错误信息 logon ... -
struts国际化,资源文件读取三
2010-04-02 23:42 1031本示例演示客户进行语言设置,从而更改整个系统语言. 客户在c ... -
struts国际化,资源文件读取二
2010-04-02 22:18 1638package com.lwf.struts.util; ... -
struts国际化,资源文件读取一
2010-04-02 00:19 1378国际化的发展 看本文之前可先看一下properties文件的 ... -
struts html标签自动保存提交的表单值。
2010-04-01 17:01 2064我们之前JSP提交值后如果还要取得值怎么做? 应该是取得a ... -
ActionMapping相关
2010-04-01 16:02 1086一、Map的设置map.put("path" ... -
ActionForward相关问题
2010-04-01 15:13 1365一、静态的ActionForward不能更改属性: stru ...
相关推荐
声明式异常处理是Struts中的一种特性,允许我们在struts.xml配置文件中定义全局的异常映射,而不是在每个Action类中单独处理。这样可以实现异常处理的统一和标准化,减少代码重复,提高可维护性。声明式异常处理通常...
在Struts2中,声明式异常处理是其强大的特性之一,它允许开发者通过配置文件来定义不同类型的异常如何被处理,而不是在每个动作类中进行硬编码。这样可以提高代码的可读性和可维护性,同时也方便了异常处理策略的...
Struts2是一个强大的Java web开发框架,它提供了一种声明式异常处理机制,极大地简化了在应用程序中处理异常的方式。本示例代码旨在演示如何在Struts2中定义和使用声明式异常,以及如何访问异常属性。 声明式异常...
- **Struts2**:支持注解和XML方式的校验,可以实现声明式校验,减少了代码量并提高了可维护性。 7. 国际化和本地化: - **Struts1**:需要手动配置资源文件,处理相对复杂。 - **Struts2**:提供了一套更直观的...
它允许开发者以声明式的方式配置应用程序的行为。 4. **拦截器(Interceptor)**:拦截器是Struts2的一个重要特性,它提供了AOP(面向切面编程)的能力。拦截器可以插入到Action调用链中,执行额外的任务,如日志...
7. **表单验证**:Struts2提供了强大的表单验证功能,可以在Action类中定义验证规则,或者使用XML配置文件进行声明式验证。 通过这个新闻管理系统,新手可以学习到如何使用Struts2搭建一个完整的web应用,包括控制...
本文将深入探讨Struts2的异常处理机制,特别是声明式异常捕捉和异常映射。 首先,Struts2的异常处理机制允许开发者在不干扰Action执行逻辑的情况下,集中处理可能出现的异常。默认情况下,由于Action的`execute()`...
- **配置文件**: Struts2的配置文件(struts.xml)用于定义Action、结果、拦截器栈等,可以实现声明式编程。 **2. Struts2的架构** Struts2的架构基于过滤器(Filter)和Servlet容器。`...
这些配置可以声明式地指定Action的映射、参数、结果类型等,增强了灵活性。 4. **拦截器(Interceptor)**:拦截器是Struts2的一个重要特性,它允许在Action执行前后插入自定义逻辑。比如,可以使用拦截器进行权限...
配置文件提供了声明式编程,简化了代码量。 4. **拦截器(Interceptors)**:Struts2的拦截器是AOP(面向切面编程)的一个体现,可以在Action执行前后插入自定义的处理逻辑,如日志记录、权限验证、性能监控等。常见...
这些核心库的引入,使得开发者可以充分利用Struts2的特性,如声明式异常处理、国际化支持、插件扩展性、以及强大的表单验证和数据绑定等功能。在实际开发中,还需要根据具体需求引入其他的库,如数据库连接池、JSON...
8. **异常处理**:Struts 2提供了一种声明式和编程式的异常处理机制。通过全局异常映射,可以统一处理特定类型的异常,提高代码的可读性和可维护性。 9. **国际化与本地化**:Struts 2支持多语言环境,开发者可以...
9. **表单验证**:Struts2提供了一种声明式的表单验证方式,开发者可以定义Action的验证规则,框架会自动进行验证。 10. **模板技术**:Struts2可以与FreeMarker、Velocity等多种模板引擎集成,用于生成动态视图。 ...
它允许开发者声明式地配置应用程序的行为。 4. **表达式语言(OGNL)**:Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表示层语言,用于在视图层与模型层之间传递数据,例如在JSP中使用`...
Struts可以通过编程式或声明式的方式来管理事务,确保数据的一致性。 8. **错误与异常处理**: Struts提供了错误和异常处理机制,当出现错误或异常时,可以跳转到特定的错误页面,或者显示错误消息。 9. **Struts...
- **声明式异常处理**:通过配置文件来处理异常,提高代码的健壮性。 #### 8. 国际化支持 - **资源文件**:通过定义资源文件来支持多语言。 - **格式化**:根据不同的语言和地区设置,自动调整日期、数字等格式。 ...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它在Java Web开发中广泛应用,极大地简化了创建交互式、数据驱动的Web应用程序的过程。这个“struts2标准jar包集”包含了运行和集成Struts2框架所需的核心库和其他...