当Web容器收到客户端的请求时,便会根据Web。xml文件中的相关配置信息找到相应的处理
servlet。一般情况下struts框架会截获所有的 。do 请求并有ActionServlet统一处理。
现在我想看看struts在处理请求的过程中发生异常时他是怎么处理的!首先,可以看看我大概花的
一个时序图:
1、2就不细说了struts拦截到客户端的do请求并由ActionServlet统一做处理!
3、ActionServlet中 doGet、doPost方法都在调用自身的process方法,process中对请求做简单处理
后又交由RequestProcessor对象中的Process方法处理。代码:
/**
* <p>Perform the standard request processing for this request, and create
* the corresponding response.</p>
*
* @param request The servlet request we are processing
* @param response The servlet response we are creating
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception is thrown
*/
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
ModuleUtils.getInstance().selectModule(request, getServletContext());
ModuleConfig config = getModuleConfig(request);
RequestProcessor processor = getProcessorForModule(config);
if (processor == null) {
processor = getRequestProcessor(config);
}
processor.process(request, response);
}
4、RequestProcessor对象Process方法又会调用自身ProcessActionPerform方法。代码:
// Call the Action instance itself
ActionForward forward =
processActionPerform(request, response,
action, form, mapping);
// Process the returned ActionForward instance
processForwardConfig(request, response, forward);
processActionPerform方法便会调用struts-config.xml文件中配置的action的execute方法
/**
* <P>Ask the specified <code>Action</code> instance to handle this
* request. Return the <code>ActionForward</code> instance (if any)
* returned by the called <code>Action</code> for further processing.
* </P>
*
* @param request The servlet request we are processing
* @param response The servlet response we are creating
* @param action The Action instance to be used
* @param form The ActionForm instance to pass to this Action
* @param mapping The ActionMapping instance to pass to this Action
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception occurs
*/
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));
}
}
关键点到了!!这里用了一个try{}catch(e)语句来尝试执行Action类中的execute方法,如果
发生异常便会被catch到交由processException()来处理!
5、processException函数好像有点长啊!先贴出来!
/**
* <p>Ask our exception handler to handle the exception. Return the
* <code>ActionForward</code> instance (if any) returned by the
* called <code>ExceptionHandler</code>.</p>
*
* @param request The servlet request we are processing
* @param response The servlet response we are processing
* @param exception The exception being handled
* @param form The ActionForm we are processing
* @param mapping The ActionMapping we are using
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception occurs
*/
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);
}
}
这里他首先,判断异常是不是servlet抛出的IOException、ServletException如果是则直接抛出,否则
构造一个ExceptionHandler实例并将异常和相关参数交由该实例的execute()去处理!
6、ExceptionHandler.execute()方法其实很简单,大概功能就是将错误信息收集起来并保存起来!
/**
* <p>Handle the <code>Exception</code>.
* Return the <code>ActionForward</code> instance (if any) returned by
* the called <code>ExceptionHandler</code>.
*
* @param ex The exception to handle
* @param ae The ExceptionConfig corresponding to the exception
* @param mapping The ActionMapping we are processing
* @param formInstance The ActionForm we are processing
* @param request The servlet request we are processing
* @param response The servlet response we are creating
*
* @exception ServletException if a servlet exception occurs
*
* @since Struts 1.1
*/
public ActionForward execute(
Exception ex,
ExceptionConfig ae,
ActionMapping mapping,
ActionForm formInstance,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException {
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 {
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;
}
7、RequestProcessor对象实例接受到ExceptionHandler.execute()返回的forward后,又将forward的传给
processForwardConfg()方法处理
8、processForwardConfg()找到uri返回
/**
* <p>Forward or redirect to the specified destination, by the specified
* mechanism. This method uses a <code>ForwardConfig</code> object instead
* an <code>ActionForward</code>.</p>
*
* @param request The servlet request we are processing
* @param response The servlet response we are creating
* @param forward The ForwardConfig controlling where we go next
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception occurs
*/
protected void processForwardConfig(HttpServletRequest request,
HttpServletResponse response,
ForwardConfig forward)
throws IOException, ServletException {
if (forward == null) {
return;
}
if (log.isDebugEnabled()) {
log.debug("processForwardConfig(" + forward + ")");
}
String forwardPath = forward.getPath();
String uri = null;
// paths not starting with / should be passed through without any processing
// (ie. they're absolute)
if (forwardPath.startsWith("/")) {
uri = RequestUtils.forwardURL(request, forward, null); // get module relative uri
} else {
uri = forwardPath;
}
if (forward.getRedirect()) {
// only prepend context path for relative uri
if (uri.startsWith("/")) {
uri = request.getContextPath() + uri;
}
response.sendRedirect(response.encodeRedirectURL(uri));
} else {
doForward(uri, request, response);
}
}
- 大小: 51.1 KB
分享到:
相关推荐
在Java Web开发中,Struts框架是一个流行的选择,它提供了强大的...通过这种方式,开发者可以创建一个统一的异常处理流程,提高代码的可维护性和用户体验,因为错误信息会被适当地呈现给用户,而不是简单的堆栈跟踪。
Struts2作为一款流行的Java Web框架,其异常处理机制是开发者必须掌握的关键部分。这篇博客主要探讨了在Struts2中如何有效地管理和处理异常,从而提高应用的稳定性和用户体验。 在Struts2中,异常处理主要通过两种...
本源码提供的是一个基于Struts框架开发的简易BBS论坛社区,其设计简洁,适合初学者学习和理解Struts的工作原理以及Web应用开发的基本流程。 在Struts框架中,主要包含以下几个核心组件: 1. **ActionServlet**:这...
Struts是一个开源的Java EE框架,它主要用于构建和维护可扩展、模块化和易于管理的Web应用程序。...随着对Struts的理解加深,你可以逐渐添加更复杂的功能,如国际化、异常处理和事务管理,以构建更全面的Web应用。
通过这个简单的实例,你将了解Struts2的基本工作流程和核心组件。随着对框架的深入理解和实践,你可以掌握更高级的功能,如国际化、文件上传、AJAX集成等,进一步提升Web应用的开发效率和质量。
在这个实例中,可能有预设的拦截器链,如`defaultStack`,它包含了默认的异常处理和结果映射等拦截器。 7. **部署与运行**: - 项目结构:"Web2"目录可能包含WEB-INF下的`web.xml`文件,配置了Struts2的过滤器,...
6. **异常处理**:引入了`ActionError`和`ActionSupport`类的改进,使异常处理更加灵活。 7. **插件更新**:许多插件进行了更新,以适应新的框架版本,比如国际化支持和JSON视图。 在提供的压缩包文件中,可能包含...
6. **异常处理**:Struts2提供了一套完整的异常处理机制,可以捕获并控制应用程序中可能出现的异常,使开发者能够优雅地处理错误。 7. **国际化支持**:Struts2支持多语言环境,通过资源文件可以轻松实现应用程序的...
11. **异常处理**:Struts1允许开发者通过配置ActionError和ActionMessage来处理和展示异常信息,提供友好的用户反馈。 12. **国际化与本地化**:Struts1支持多语言,可以通过资源文件进行国际化处理,使应用能够...
9. **异常处理**:框架提供了全局的异常处理机制,可以统一处理应用程序中出现的异常,提高代码的健壮性。 下载的"struts1.2-jars"压缩包很可能包含了Struts1.2框架所需的全部JAR文件,包括核心库、标签库、以及...
- **异常处理**:配置异常拦截器,实现全局异常捕获和处理,提升用户体验。 - **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松实现文件上传功能;同时也可以配置下载功能,满足文件分发的需求。 - **...
9. **异常处理**:Struts2通过全局异常映射(Global Exception Mapping)来统一处理应用程序中抛出的异常,提高代码的可维护性。 10. **国际化与本地化**:Struts2支持多语言环境,可以通过资源包(properties文件...
7. **错误处理和异常捕获**: 我们可以配置`struts-config.xml`中的`global-exceptions`元素来捕获全局异常,并定义错误页面。同时,Action类中的`execute`方法可以抛出`ActionError`或`ActionException`来处理特定的...
本项目“使用struts实现的简单登入注册功能”旨在展示如何利用Struts2框架来处理用户登录和注册的基本流程。以下将详细介绍涉及的技术和关键步骤。 1. **Struts2框架**:Struts2是Apache软件基金会的一个开源项目,...
Struts和Hibernate是两种在Java Web开发中广泛使用的开源框架,...此外,还可以深入学习关于请求处理、表单验证、国际化、异常处理等方面的知识。对于想要提升Java Web开发技能的初学者而言,这是一个很好的实践平台。
7. **异常处理**:Struts提供了全局的异常处理机制,可以捕获和处理运行时的异常,使应用程序更具健壮性。 8. **拦截器**:Struts2引入了拦截器的概念,它们是一系列处理请求的组件,可以在Action执行前后执行...
10. **异常处理**:Struts 提供了一种机制来处理应用程序中的异常,通过配置文件可以定义全局或特定 Action 的异常处理策略。 总的来说,“struts入门简单例子”涵盖了 Struts 的基本组成部分和工作流程,包括用户...
此外,实际操作实践,如创建简单的Struts应用程序,理解请求流程,以及如何使用Struts进行数据验证和错误处理等,都是提升技能的关键步骤。这个Word文档可能包含这些内容的详细讲解和示例,可以帮助你深入理解并应用...
9. **异常处理**:Struts2提供了一套完善的异常处理机制,通过`<global-exception-mappings>`和`<package>`内的`<exception-mapping>`标签,可以定义全局或局部的异常处理策略。 10. ** strut2-helloworld 示例**:...
综上所述,Struts2是一个功能强大的Java Web框架,它通过源码解析,我们可以学习到MVC模式的实现、拦截器的设计、数据校验和异常处理策略,以及视图层的组织方式等多方面的知识。而通过工具的使用,如插件和配置,...