struts框架中只有一个ActionServlet,但可以有多个客户化的requestProcesscor。对于struts来说真正做控制的是RequestProecssor和Action。
其中Action的process方法最终调用的是RequestProcessor类中的process方法。
下面是该方法的源码:
public void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// 如果HTTP请求方式为post,并且contentType为”multipart/form-data”开头,标准的HttpServletRequest对象将被重新包装,
// 以方便处理”multipart”类型的HTTP请求如果请求方式为get,或正congtentType属性不是”mulitipart”,就直接返回原始的HttpServletRequest对象.
request = processMultipart(request);
// 获得请求的URI的路径,这一信息可用于选择合适的Struts Action组件.
String path = processPath(request, response);
if (path == null) {
return;
}
if (log.isDebugEnabled()) {
log.debug("Processing a '" + request.getMethod() +
"' for path '" + path + "'");
}
// 当ControllerConfig对象的locale属性为true,将读取用户请求中包含的Locale信息,然后把Locale实例保存在session范围内.
processLocale(request, response);
// 读取ControllerConfig对象的conttentType属性,
// 然后调用response.setContentType(contentType)方法,设置响应结果的文档类型和字符编码.
processContent(request, response);
// 读取ControllerConfig对象的nocache属性,
// 如果nocache属性为true,在响应结果中将加入特定的头参数:Pragma,Cache-Control和Expires
processNoCache(request, response);
// 该方法不执行任何操作.直接返回true.子类可以覆盖这个方法.
// 执行客户化的预处理请求操作.
if (!processPreprocess(request, response)) {
return;
}
this.processCachedMessages(request, response);
// 寻找和用户请求的URI匹配的ActionMapping,如果不存在这样的ActionMapping,则向用户返回恰当的错误信息
ActionMapping mapping = processMapping(request, response, path);
if (mapping == null) {
return;
}
// 先判断是否为Action配置了安全角色,如果配置了安全角色,就调用isUserInRole()方法判断当前用户是否具备必需的角色,
// 如果不具备,就结束请求处理流程.,向用户返回恰当的错误消息
if (!processRoles(request, response, mapping)) {
return;
}
// 先判断是否为ActionMapping配置了ActionForm,如果配置了ActionForm,就先从ActionForm的存在范围内(request或session)寻找改ActionForm实例,
// 如果不存在,就创建一个实例,接下来把它保存在合适的范围内,保存时使用的属性key为ActionMapping的name属性。
ActionForm form = processActionForm(request, response, mapping);
// 如果为ActionMapping配置了ActionForm,就先调用ActionForm的reset()方法,再把请求中的表单数据组装到ActionForm中
processPopulate(request, response, form, mapping);
// 如果为ActionMapping配置了ActionForm,并且ActionMapping的validate属性为true,
// 就调用ActionForm的validate()方法,如果validate方法返回的ActionErrors对象中包含ActionMessage对象,
// 说明表单验证失败。就把ActionErrors对象放在request范围内,再把请求转发到ActionMapping的input属性指定的Web组件。
// 如果ActionForm的validate方法执行表单验证成功,就继续执行下面的处理流程。
try {
if (!processValidate(request, response, form, mapping)) {
return;
}
} catch (InvalidCancelException e) {
ActionForward forward = processException(request, response, e, form, mapping);
processForwardConfig(request, response, forward);
return;
} catch (IOException e) {
throw e;
} catch (ServletException e) {
throw e;
}
// Process a forward or include specified by this mapping
if (!processForward(request, response, mapping)) {
return;
}
if (!processInclude(request, response, mapping)) {
return;
}
// 先判断是否在Action缓存中存在这个Action实例,如果没有就新建一个Action实例,
// 把它放在Action缓存中。可以看出Action也是只有一个实例在运行的
Action action = processActionCreate(request, response, mapping);
if (action == null) {
return;
}
// Call the Action instance itself
ActionForward forward =
processActionPerform(request, response,
action, form, mapping);
// 把你的Action的excute方法返回的ActionFoward对象作为参数传给它,
// processActionForward对象包的请求转发信息来执行请求转发或重定向。
processForwardConfig(request, response, forward);
}
下面是我自己写的一个实际使用的类,对于一般的小型系统的权限控制个人感觉够用:
分享到:
相关推荐
通过这些拦截器,Struts2 实现了如输入验证、数据转换、权限检查等一系列功能,大大简化了开发流程。 在实现原理上,Struts2 采用了一个基于过滤器(Filter)的请求处理机制。当用户发起一个HTTP请求时,请求首先会...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Struts1的基础上进行了很多改进和增强,提供了更强大的功能和更好的性能。本教程将深入探讨Struts2的核心概念、架构以及实际...
### 反射与注解在Struts2中的应用——实现精细权限控制 #### 一、引言 在软件开发过程中,权限控制是一项重要的安全措施,它确保系统的不同部分只能被授权用户访问。对于大型管理系统(MIS)而言,基于方法级别的...
《基于Struts的图书管理系统——JSP信息办公实例解析》 在信息技术日益发达的今天,JSP(JavaServer Pages)作为Web开发中的重要技术之一,被广泛应用于各种信息系统的设计与开发,尤其是信息办公领域。本实例——...
"Struts2 技术内幕——深入解析Struts2架构设计"这本书深入探讨了Struts2的核心机制和设计理念,帮助开发者更好地理解和应用这个框架。 Struts2的核心组件包括Action、Interceptor、Result和Configuration。Action...
4. **Interceptor(拦截器)**:拦截器是Struts的一个强大特性,它们在Action执行前和执行后被调用,可以用来实现如日志记录、权限验证、事务管理等功能。 5. **结果类型(Result)**:Action执行后,会返回一个...
【描述】"JSP源码——[信息办公]基于struts的图书管理系统_struts_ts.zip"简单明了地指出,这个项目主要是为了管理和处理图书信息而设计的,适合于办公环境。源码的提供意味着用户可以深入学习和理解系统的内部工作...
6. **动态Menu**:为了提高灵活性,还可以考虑实现动态生成Menu的功能,这可能涉及到权限控制,即根据用户角色和权限动态决定哪些菜单项可见。 在提供的文件列表中,"速动画教程第十四集.exe"和"速动画教程第十四集...
拦截器是基于Java的动态代理机制实现的,它可以看作是一个过滤器,它在Action调用前后执行一些额外的任务,如日志记录、权限检查、数据验证等。在Struts2中,拦截器工作在Action和结果(Result)之间,形成一个拦截...
Struts将这些技术有机地结合在一起,通过配置文件`struts-config.xml`实现对整个应用流程的控制。 #### 2. Struts表单和ActionForm 在Struts中,每个表单都对应一个ActionForm对象,这是一组特定于表单的字段和...
AOP则可以用于实现全局事务管理、日志记录以及我们的关注点——权限控制。Spring Security(前身为Acegi Security)是Spring生态系统中的一个强大安全模块,可以轻松地集成到项目中,提供用户认证和授权服务。 接...
综上所述,“基于Struts和Hibernate的环境保护网管理系统”利用了Java Web技术栈的优势,实现了环保领域中账户管理的核心功能。这种系统不仅提升了管理效率,也为环境保护工作的数字化转型提供了有力支持。
拦截器是Struts2框架中的一个重要组成部分,它们在Action调用前后执行,可以用于实现各种功能,如日志、事务管理以及我们的重点——权限拦截。 权限拦截是Web应用安全机制的重要一环,它确保只有具备特定权限的用户...
【基于Struts+Spring的论坛系统】是一个典型的Java Web应用程序示例,它展示了如何将两个流行的开源框架——Struts和Spring——有效地结合在一起,以构建一个功能完善的在线讨论平台。Struts提供了MVC(模型-视图-...
【基于Hibernate和Struts2的项目源码】是Java Web开发中的一个典型示例,它结合了两个重要的框架——Hibernate作为持久层框架,Struts2作为控制层框架,以实现高效、灵活的数据管理和用户交互。这个项目源码提供了一...
“完整OA系统--基于Struts2,hibernate,spring3”是一个典型的Java Web企业应用实例,利用SSH框架的优势,实现了高效的业务处理和灵活的系统扩展。开发者可以通过深入学习和实践这个项目,提升在企业级应用开发中的...
### J2EE电子商务系统开发从入门到精通——基于Struts和Hibernate技术实现 #### J2EE概论 **1.1 简单双层架构到复杂多层架构** - **1.1.1 双层(C/S)软件架构设计** - 双层架构(客户端/服务器架构,Client/...
《权限管理系统——数据库部分》是基于Java编程语言开发的一套全面的权限管理解决方案。系统采用SSH(Spring、Struts、Hibernate)三大框架技术,旨在提供高效、安全的用户权限控制功能。此压缩包包含了数据库相关的...
为此,《中国管理信息化》2017年第20期发表了一篇由唐昌华、陈坚、李洪亮撰写的论文——“基于Struts和Hibernate的图书管理系统设计与实现”。该论文主要探讨了如何利用Struts和Hibernate这两种技术来构建一个高效、...
在Struts 2中,拦截器是基于Java的动态代理实现的,它们按照特定的顺序执行,形成了一个拦截器链。 ### 拦截器的工作原理 1. **拦截器栈**:Struts 2中的拦截器不是单独工作的,而是组织成一个栈。每个拦截器都遵循...