本文还有配套的精品资源,点击获取
简介:Struts 2.0是一个广泛使用的Java Web框架,基于MVC设计模式,简化了Web应用开辟流程。它包含多个关键组件,如Action类、配置文件、拦截器、OGNL表达式语言等,支持国际化、非常处理和Ajax集成。开辟者可以通过继承ActionSupport类实现业务逻辑,并使用配置文件定义Action映射和拦截器链。Struts 2.0还支持注解配置,提高了开辟效率和代码质量,适用于需要构建可扩展、易维护的Java应用步伐的场景。本课程将深入讲解Struts 2.0核心包的使用,资助学生掌握框架的核心概念和实战本领。
1. Struts 2.0 概述与MVC设计模式
1.1 Struts 2.0的劈头与价值
Struts 2.0 是一个用于构建Web应用步伐的开源框架,它是闻名的Struts框架的后续版本,继承了MVC(模型-视图-控制器)设计模式的精神。通过清楚的分层架构,它简化了复杂的用户界面和业务逻辑之间的交互。Struts 2.0的出现,为Java开辟者提供了一个更为机动和强大的选择,使得Web开辟更为高效和可维护。
1.2 MVC设计模式的精华
MVC设计模式将应用步伐分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。模型代表了应用步伐的数据结构,视图负责显示数据,控制器则处理输入并更新模型和视图。这种模式的优点在于,它能够将数据逻辑与展示逻辑分离,使得代码更加清楚且易于维护。Struts 2.0框架天然支持MVC设计模式,它通过Action类来充当控制器的角色,视图则依赖于JSP或其他模板技术,而模型则通常由普通的JavaBean大概POJO(Plain Old Java Object)来实现。
1.3 Struts 2.0与传统MVC的比力
与传统的MVC框架相比,Struts 2.0提供了一些独特的优势。起首,它支持拦截器(Interceptor)机制,这为开辟者提供了强大的功能,好比日记记录、权限检查、数据验证等,可以在哀求处理的差别阶段进行拦截和处理。其次,Struts 2.0引入了OGNL(Object-Graph Navigation Language),答应开辟者以简朴的方式访问对象图,并且这种语言比传统的EL表达式更加机动和强大。最后,Struts 2.0也支持与Spring框架的集成,使得开辟者能够在同一个项目中使用两种框架的优势,为开辟提供了极大的机动性。
2. Action类与业务逻辑实现
2.1 Action类的基本概念与结构
2.1.1 Action类的职责与特点
Action类在Struts 2框架中扮演着控制器的角色,它负责接收用户的哀求并调用相应的业务逻辑方法,最后将结果返回给客户端。与传统的MVC框架中的控制器有所差别,Struts 2的Action类更方向于服务层的职责,因为它并不直接操作视图层,而是通过返回的结果集来关照视图层怎样渲染页面。
Action类的特点在于它将用户的哀求处理逻辑封装起来,这使得代码更加模块化、易于管理和维护。它通常包括以下职责:
- 处理哀求 :接收并处理来自客户端的HTTP哀求。
- 调用业务逻辑 :根据业务需求调用服务层组件。
- 传递数据 :在业务逻辑和视图层之间传递数据。
- 返回结果 :基于业务处理的结果返回一个Action结果。
Action类通常不需要继承特定的类,但它们需要实现 Action 接口或继承 ActionSupport 类,后者提供了许多默认的实现和便利方法,例如国际化消息处理、类型转换和验证功能。
2.1.2 Action类与业务逻辑的绑定方式
Struts 2.0通过拦截器和值栈技术来实现Action类与业务逻辑的绑定。值栈提供了一个数据共享的空间,用于在Action类和其他组件之间传递数据。而拦截器则负责处理哀求的生命周期和调用相应的Action方法。
绑定方式主要依赖于以下几个核心概念:
- OGNL(Object-Graph Navigation Language) :Struts 2使用OGNL来实现数据的传递和访问,它是一个强大的表达式语言,用于存取对象的属性以及调用方法。
- 值栈(Value Stack) :全部Action的属性都会被存储在值栈中,使得Struts 2可以轻松地将数据传递给视图层,并且从视图层接收数据。
- 拦截器(Interceptor) :拦截器负责在Action实行前后进行各种预处理和后处理工作,例如数据验证、日记记录等。
一个典型的Action类绑定过程是这样的:
- 用户提交表单,哀求到达Struts 2的过滤器。
- 过滤器将哀求委托给拦截器链处理。
- 拦截器链中的拦截器会处理哀求(如数据验证、转换等)并将处理结果放入值栈。
- 拦截器链实行完毕,最终调用Action类的 execute 方法(或其他命名方法)。
- execute 方法实行业务逻辑,并决定返回结果。
2.2 Action类的生命周期与状态管理
2.2.1 Action生命周期中的关键点
Action类的生命周期从一个HTTP哀求的开始到竣事,主要分为以下几个关键点:
- 实例化 :当有新的哀求到来时,Struts 2框架负责创建Action类的一个实例。
- 设置属性 :使用值栈和OGNL,框架填充Action实例的属性。
- 实行业务逻辑 :通过调用Action类的 execute 方法来实行业务逻辑。
- 结果返回 :根据业务逻辑的处理结果,返回一个字符串,代表下一个视图的名称或一个特别的逻辑处理结果。
整个生命周期中,Action类的实例在每次哀求时都会被创建,并在哀求竣事时被销毁。这保证了Action类的状态不会在哀求间发生干扰。
2.2.2 状态管理的实现与注意点
尽管Action类的实例在每次哀求后都会被销毁,但在某些情况下,开辟者大概需要保持状态信息,例如用户会话信息或哀求范围的数据。这可以通过多种方式实现:
- 哀求范围属性 :通过ActionContext或值栈,可以轻松地管理哀求范围的数据。
- 会话范围属性 :将属性存储在用户的HTTP会话中,可以实现会话范围内的数据管理。
- 应用范围属性 :将属性存储在应用上下文中,可以在整个应用范围内共享数据。
在实近况态管理时,应注意以下几点:
- 性能题目 :存储大量的数据大概会导致性能题目,特别是在会话和应用范围内。
- 线程安全 :假如Action类使用了共享资源,必须确保线程安全,否则大概会出现数据冲突或不同等的题目。
- 资源释放 :确保在不再需要时释放全部资源,制止内存走漏。
2.3 Action类与数据交互
2.3.1 数据封装与传递的方法
数据封装和传递是Action类的基本任务之一。Struts 2通过OGNL实现了一个机动且强大的数据交互机制,OGNL可以轻松访问和操作Action的属性。
基本数据封装与传递的方法包括:
- 通过表单标签传递 :Struts 2的表单标签可以与Action属性进行绑定,自动填充数据。
- 通过OGNL表达式传递 :OGNL支持复杂的数据访问和操作,可以方便地读写对象的属性。
2.3.2 数据验证与错误处理本领
在Web应用开辟中,数据验证是保证数据质量的重要环节。Struts 2提供了一套内建的验证框架,使得数据验证变得简朴而强大。
数据验证的实现方法包括:
- 注解验证 :在Action类的属性上使用 @Validation 注解来指定验证规则。
- XML验证 :通过在 struts.xml 中定义验证规则或使用 validate.xml 文件来实现验证。
- 动态验证 :在Action的方法中动态地进行验证,根据业务逻辑的变化调解验证逻辑。
错误处理本领:
- 错误消息国际化 :使用Struts 2的国际化支持,为差别的用户提供错误消息。
- 错误字段高亮显示 :通过返回特定的结果集,在JSP页面上高亮显示有错误的字段。
- 友好错误提示 :确保错误提示对用户友好,便于明白和解决。
- public class UserAction extends ActionSupport {
- private String username;
- private String password;
- private List<String> errors;
- // Getter and setters
- public String execute() {
- // ...业务逻辑...
- if (/* some validation check */) {
- addFieldError("username", getText("error.username.exists"));
- return INPUT;
- }
- return SUCCESS;
- }
- }
复制代码 在上述代码中, addFieldError 方法用于添加字段级别的错误,这将使得在JSP页面上可以根据字段错误进行特别的显示处理。
3. Struts 2.0 配置文件及全局与局部配置
3.1 Struts 2.0配置文件概述
3.1.1 配置文件的核心元素分析
Struts 2.0配置文件是整个框架配置的核心,它定义了Struts应用步伐的运行方式,包括怎样处理哀求、映射URL到Action类以及配置拦截器等。配置文件通常以XML格式编写,位于项目的 src/main/resources 目次下的 struts.xml 文件中。
配置文件的核心元素包括 <struts> 根元素、 <constant> 元素、 <package> 元素、 <action> 元素、 <interceptor> 元素和 <result> 元素等。
- <struts> 是根元素,它包含其他全部配置元素,如 <constant> , <package> , <interceptors> , <action> , 等。
- <constant> 元素用于设置Struts2框架中使用的常量值,如日记级别、哀求处理超时时间等。
- <package> 元素是 <action> 和 <interceptor> 的容器,它定义了一组Action的逻辑分组。
- <action> 元素将一个哀求映射到一个具体的Action类。
- <interceptor> 元素定义了一个拦截器,可以在哀求处理之前或之后实行特定任务。
- <result> 元素定义了一个Action实行后跳转到的结果页面或视图。
3.1.2 配置文件的继承与覆盖机制
Struts 2.0配置文件支持继承和覆盖机制,答应开辟者将通用配置抽取到一个父 <package> 中,子 <package> 可以继承父 <package> 的配置,并通过 extends 属性指定其父 <package> 。
例如,你可以创建一个基础包 base-package 用于存放通用设置,然后其他包可以通过 extends="base-package" 继承这些设置。
- <package name="base-package" extends="struts-default">
- <!-- 通用拦截器和常量配置 -->
- <interceptors>
- <interceptor-ref name="defaultStack"/>
- </interceptors>
- <constants>
- <constant name="struts汤.ICS.operators" value="|"/>
- </constants>
- </package>
- <package name="my-module" extends="base-package">
- <!-- 具体模块配置 -->
- <action name="example" class="com.example.ExampleAction">
- <result name="success">/success.jsp</result>
- <result name="error">/error.jsp</result>
- </action>
- </package>
复制代码 在上述配置中, my-module 包继承了 base-package 包的配置,同时添加了特定的Action映射。
3.2 全局与局部配置的策略与实践
3.2.1 全局配置的范围与作用
全局配置是指影响整个Struts应用步伐的配置,它通常定义在 <package> 元素之外或在根 <struts> 元素中。全局配置适用于整个应用,除非在子包中被局部覆盖。
全局配置的一个常见用途是定义拦截器堆栈(interceptor stack),拦截器堆栈是一组拦截器的集合,它们可以被多个Action共享。定义全局拦截器堆栈可以简化Action的配置。
- <struts>
- <constant name="struts汤.ICS.operators" value="|"/>
- <package name="global-package" extends="struts-default">
- <interceptors>
- <interceptor-stack name="customStack">
- <interceptor-ref name="exception"/>
- <interceptor-ref name="alias"/>
- <interceptor-ref name="servlet-config"/>
- <!-- 自定义拦截器 -->
- <interceptor-ref name="customInterceptor"/>
- </interceptor-stack>
- </interceptors>
- <!-- 全局常量配置 -->
- </package>
- </struts>
复制代码 3.2.2 局部配置的优先级与机动应用
局部配置是指仅对特定包或Action有用的配置。局部配置可以覆盖全局配置,提供机动的定制能力。局部配置的优先级高于全局配置,确保了配置的机动性和细粒度控制。
例如,你可以为特定包配置差别的拦截器或结果页面。
- <package name="my-module" extends="struts-default">
- <interceptors>
- <interceptor-ref name="customStack"/>
- </interceptors>
- <action name="exampleAction" class="com.example.ExampleAction">
- <result name="success">/exampleSuccess.jsp</result>
- </action>
- </package>
复制代码 在上述配置中, my-module 包使用了自定义的拦截器堆栈 customStack ,并定义了特定的结果页面 exampleSuccess.jsp 。这些配置只在 my-module 包内有用,不会影响到其他包。
在进行配置时,应当注意以下几点:
- 使用继承机制可以淘汰重复配置,保持配置的DRY(Don't Repeat Yourself)原则。
- 在定义拦截器时,务必了解各个拦截器的作用,以制止不须要的性能开销。
- 在配置结果页面时,应当思量到差别结果页面的公道应用,以实现清楚的业务逻辑流程。
通过这种方式,Struts 2.0答应开辟者以机动的方式定制和优化应用步伐的行为,以满足特定需求。
4. 拦截器(Interceptor)的作用与应用
拦截器(Interceptor)是Struts 2.0框架中的一个重要特性,它为开辟者提供了一种机动的机制来干预和修改Action的生命周期。通过拦截器,开辟者可以在哀求处理之前或之后插入自定义的处理逻辑,这使得代码更加模块化,有利于维护和重用。本章节将深入探究拦截器的基础知识、自定义拦截器的创建过程以及在实际开辟中的应用场景。
4.1 拦截器基础
拦截器在Struts 2.0框架中扮演着至关重要的角色。它本质上是一个实现了 Interceptor 接口的对象,能够在一个哀求被处理之前或之后实行特定的逻辑。拦截器的工作原理和生命周期是明白其核心功能的基础。
4.1.1 拦截器的工作原理与生命周期
拦截器的工作原理与AOP(面向切面编程)的概念雷同,它可以在方法实行前后添加额外的行为。Struts 2.0框架将哀求传递给拦截器链,拦截器链按照定义的序次处理哀求,然后将哀求传递给目的Action进行处理。处理完之后,响应沿着同样的链返回。
拦截器的生命周期包括以下几个步骤:
- 初始化(init):拦截器创建后,框架会调用 init 方法进行初始化。开辟者可以在这个方法中进行资源的加载或初始化配置。
- 拦截(intercept):框架会在哀求到达Action之前调用拦截器的 intercept 方法。这个方法决定了拦截器是否继承将哀求传递给后续的拦截器或Action。
- 销毁(destroy):当拦截器不再使用时,框架会调用 destroy 方法进行整理工作。
4.1.2 尺度拦截器的分类与作用
Struts 2.0框架提供了一系列的尺度拦截器,它们被分为核心拦截器和用户拦截器。核心拦截器通常负责处理框架的基础设施任务,例如处理输入验证、文件上传、参数绑定等。用户拦截器则用于实行开辟者自定义的逻辑,如安全检查、日记记录、性能监控等。
核心拦截器的一个常见例子是 ValidationInterceptor ,它在Action方法实行前调用验证器进行输入验证。 ParamsInterceptor 则负责将哀求参数绑定到Action对象。
4.2 拦截器的自定义与使用场景
自定义拦截器答应开辟者根据特定的业务需求来扩展或修改框架的行为。创建自定义拦截器的过程涉及实现拦截器接口并定义拦截器逻辑。下面将详细介绍自定义拦截器的创建步骤以及在实际项目中的应用实例。
4.2.1 创建自定义拦截器的步骤
- 实现拦截器接口:起首,需要实现 com.opensymphony.xwork2.interceptor.Interceptor 接口。通常,为了简便,可以继承 com.opensymphony.xwork2.interceptor.AbstractInterceptor 基类,这样只需实现 intercept 方法。 java public class MyCustomInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 自定义逻辑 return invocation.invoke(); } }
- 配置拦截器:在Struts 2.0的配置文件( struts.xml )中注册并配置拦截器。这包括为拦截器指定一个名称,并定义其属性(假如需要的话)。 xml <interceptors> <interceptor name="myInterceptor" class="com.example.MyCustomInterceptor"/> </interceptors>
- 将拦截器添加到拦截器栈:定义拦截器栈,并将自定义拦截器添加到栈中。假如需要,还可以添加框架提供的尺度拦截器。 xml <interceptor-stack name="myStack"> <interceptor-ref name="myInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack>
- 在Action配置中应用拦截器栈:最后,将定义好的拦截器栈应用到具体的Action中。 xml <action name="exampleAction" class="com.example.ExampleAction"> <interceptor-ref name="myStack"/> <!-- 其他配置 --> </action>
4.2.2 自定义拦截器的应用策略与实例
自定义拦截器可以在Action实行前或实行后实行特定的业务逻辑,例如:
- 安全检查 :在用户发起哀求前,验证用户身份或权限。
- 性能监控 :记录哀求的处理时间和结果,用于性能分析。
- 日记记录 :将用户的操作记录在日记文件中,便于后期查察或题目追踪。
以下是一个简朴的安全检查拦截器实例:
- public class SecurityInterceptor extends AbstractInterceptor {
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
- // 获取用户信息,例如从session中
- UserInfo user = (UserInfo) ServletActionContext.getRequest().getSession().getAttribute("user");
- // 检查用户是否登录以及权限是否足够
- if (user == null || !user.hasAccess(invocation.getAction().getClass())) {
- // 如果用户未登录或权限不足,抛出异常或重定向到登录页面
- return "login";
- }
- // 如果用户认证通过,则继续请求处理流程
- return invocation.invoke();
- }
- }
复制代码 配置文件和Action配置保持不变,只需要在 struts.xml 中添加该拦截器的声明,并在栈中引用即可。
以上内容详细介绍了拦截器在Struts 2.0框架中的作用和应用,包括拦截器的工作原理、尺度拦截器的分类与作用,以及创建自定义拦截器的步骤和实例。通过实际操作,可以更好地明白拦截器的工作流程和在项目中的具体应用。
5. Struts 2.0核心包的实战应用本领
5.1 OGNL表达式语言的实际应用
OGNL(Object-Graph Navigation Language)是Struts 2.0中用于访问和操作对象图的表达式语言。它能够让我们以非常简便的方式获取和设置对象的属性,乃至实行更复杂的操作。
5.1.1 OGNL的基本语法与数据访问
OGNL的语法雷同于EL表达式,但功能更为强大。OGNL支持直接访问对象属性、调用方法、访问静态方法和属性、以及支持集合操作等。
- // 假设有一个User对象实例在值栈中
- User user = new User();
- user.setName("John");
- user.setAge(30);
- ActionContext.getContext().put("user", user);
复制代码 在JSP页面,你可以使用OGNL访问这些值:
- ${user.name} // 输出 "John"
- ${user.age + 1} // 输出 "31"
- ${user.name.length()} // 输出 "4"
复制代码 5.1.2 OGNL在Action与JSP中的高级应用
OGNL还可以用于类型转换、参数传递和实行简朴的数据处理:
- // 在Action中使用OGNL访问值栈中的值
- String userName = (String) ActionContext.getContext().get("user.name");
- // 在JSP页面执行更复杂的操作
- ${user.addresses[0].street}
- ${user.friends.?[age gt 25].size()}
复制代码 5.2 Result类型与流程控制的最佳实践
Struts 2.0答应开辟者根据实际需要选择和自定义Result类型,以控制Web应用的流程。
5.2.1 Result类型的选择与自定义
Struts 2.0提供了多种Result类型,如 dispatcher 、 redirect 、 redirectAction 、 chain 等。针对差别的需求,开辟者可以选择合适的Result类型。
- <result name="success" type="dispatcher">/success.jsp</result>
- <result name="redirect" type="redirect">***</result>
复制代码 5.2.2 流程控制的逻辑与本领
流程控制可以通过Action类中的逻辑判定实现,也可以使用Struts 2.0的拦截器栈进行控制。例如,在Action中实行条件判定并返回差别的结果:
- if (condition) {
- return SUCCESS;
- } else {
- return ERROR;
- }
复制代码 5.3 Tiles框架的结构模板整合本领
Tiles是Apache的一个模板引擎,可以用来实现JSP页面的结构管理。
5.3.1 Tiles框架的基本概念与优势
Tiles框架答应开辟者将页面分割成多个部分,每个部分可以单独设计和修改,提高页面的可维护性。
- <definition name="baseLayout" template="/WEB-INF/layouts/baseLayout.jsp">
- <put-attribute name="header" value="/WEB-INF/layouts/header.jsp"/>
- <put-attribute name="body" value="/WEB-INF/layouts/body.jsp"/>
- <put-attribute name="footer" value="/WEB-INF/layouts/footer.jsp"/>
- </definition>
复制代码 5.3.2 模板整合的实战案例分析
在实际应用中,可以通过定义多个Tiles模板来整合Struts 2.0应用:
- <action name="myAction" class="com.example.MyAction">
- <result type="tiles">baseLayout</result>
- </action>
复制代码 5.4 非常处理与国际化/本地化的实践策略
非常处理和国际化是构建Web应用时不可或缺的两个方面。
5.4.1 非常处理机制与日记记录
Struts 2.0中可以通过配置全局非常处理器来处理非常,并通过日记记录非常信息。
- <exception-mapping result="error" exception="java.lang.Exception"/>
复制代码 在Action中记录日记:
- try {
- // business logic
- } catch (Exception e) {
- LOG.error("Error in processing action", e);
- throw new Exception(e);
- }
复制代码 5.4.2 国际化/本地化的实现方法与工具
Struts 2.0支持国际化/本地化,开辟者可以通过配置资源文件来实现。
- <constant name="struts.custom.i18n.resources" value="messages" />
复制代码 在JSP页面引用国际化资源:
5.5 Ajax集成与json-plugin插件的实战应用
Ajax技术与Struts 2.0结合,可以为Web应用提供更加动态和交互式的用户体验。
5.5.1 Ajax在Struts 2.0中的集成方法
Ajax集成可以通过Struts 2.0的拦截器完成,例如使用 ajax/json 拦截器来处理Ajax哀求:
- <interceptor-ref name="json">
- <param name="enableSMD">true</param>
- </interceptor-ref>
复制代码 5.5.2 json-plugin插件的配置与使用本领
json-plugin插件可以简化JSON数据的处理,开辟者可以通过配置拦截器栈来使用它:
- <interceptor-ref name="defaultStack">
- <param name="jsononus">never</param>
- </interceptor-ref>
复制代码 5.6 注解配置的利弊与应用场景
注解配置为Struts 2.0提供了更加轻量级和便捷的配置方式。
5.6.1 注解配置的优势与使用限定
注解配置可以简化Action的配置,但过分使用大概会使代码难以阅读和维护。
- @Action(value="example", results={
- @Result(name="success", type="dispatcher", location="success.jsp")
- })
- public class ExampleAction {
- // Action implementation
- }
复制代码 5.6.2 实际项目中的注解配置案例分析
在实际项目中,注解配置可以用于快速原型开辟,但随着项目复杂度的增长,大概需要转向XML配置以保持清楚。
- public class UserAction extends ActionSupport {
- private String username;
- private String password;
- @Action(value = "login", results = {
- @Result(name = "success", type = "dispatcher", location = "/welcome.jsp")
- })
- public String execute() {
- // login logic
- return SUCCESS;
- }
- }
复制代码 以上是对Struts 2.0核心包的实战应用本领的详细介绍。开辟者在使用时应该根据项目的具体需求选择合适的技术方案,并在实践中不断优化和调解。
本文还有配套的精品资源,点击获取
简介:Struts 2.0是一个广泛使用的Java Web框架,基于MVC设计模式,简化了Web应用开辟流程。它包含多个关键组件,如Action类、配置文件、拦截器、OGNL表达式语言等,支持国际化、非常处理和Ajax集成。开辟者可以通过继承ActionSupport类实现业务逻辑,并使用配置文件定义Action映射和拦截器链。Struts 2.0还支持注解配置,提高了开辟效率和代码质量,适用于需要构建可扩展、易维护的Java应用步伐的场景。本课程将深入讲解Struts 2.0核心包的使用,资助学生掌握框架的核心概念和实战本领。
本文还有配套的精品资源,点击获取
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |