struts2框架

时间:2023-03-08 17:36:38

详细教程 参考struts教程https://www.w3cschool.cn/struts_2/struts_configuration.html

Struts2 基于MVC设计模式的web应用程序框架,它不仅仅是Struts1 的升级版本,更是一个全新的Struts架构。最初,是以WebWork框架和Struts框架为基础,通过提供增强和改进的Struts框架,进而实现简化web技术人员开发工作的目标。不久之后,Webwork框架和Struts社区联合创造了现在流行的Struts2框架。

Struts2与Struts1.X已经不能再放到一起比较,虽然都是对MVC架构模式的实现,本质却完全不同。Struts2的前身是WebWork,其实现方式和功能都要优于Struts1.X,但是,Struts先入为主,很多应用程序都基于Struts,其生命力和普及度使得WebWork落于下风。随着新思想和新架构的不断涌入,特别是WEB2.0被大量提及,Struts1.x显然无法跟上日新月异的变化,在很多应用上显得力不从心,最终催生了Struts2.0。可以说Struts2.0是为变而变。

-----------------------------------------------------------------------------------------------------------------

Struts2的新特征

如果读者熟悉Struts1.X,会发现Struts2比Struts1.X有了巨大的变化:

Action 类:

• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

• Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

线程模式:

• Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

• Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet 依赖: 

• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。

• Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

可测性:

• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。

• Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

捕获输入:

• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。

• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。

表达式语言:

• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).

绑定值到页面(view):

• Struts 1使用标准JSP机制把对象绑定到页面中来访问。

• Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

类型转换:

• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。

• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

校验: 

• Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

Action执行的控制:

• Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

• Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

注:以上资料从网上搜集,来源:Struts开发组,翻译:tianxinet(胖猴)。

-----------------------------------------------------------------------------------------------------------------------------------------------------

搭建struts2开发环境

  Servlet API 2.4

  JSP API 2.0

  Java 5

  需要提醒的是,在Struts中会用到Annotation,所以请将JDK版本升级到1.5以上.

1. struts2下载,struts-2.1.0-all.zip 包含struts2项目所用的jar包

struts2框架

2.新建web工程,导入包(13个),创建action.java、配置文件struts.xml、web.xml。

  struts2框架

3.核心配置文件struts.xml :

  • package标签,为action或截拦器分组,在package里面才能配置action。
  1. name属性  
    - name属性值根功能本身没有关系的,
    - 在一个配置文件中可以写多个package标签,name属性值不能相同的
  2. extends属性 extends="struts-default"
     - 属性值固定的,struts-default
     - 写了这个属性之后,在package里面配置的类具有action功能
  3. namespaces属性
     -namespace属性值和action标签里面的name属性值构成访问路径
  • action标签
  1. name属性
    - namespace属性值和action标签里面的name属性值构成访问路径
    - 在package标签里面写多个action标签,但是action的name属性值不能相同的
  2. class属性
    - action全路径
  3. method属性
    - 比如在action里面默认执行的方法execute方法,但是在action里面写其他的方法
    - 让action里面多个方法执行,使用method进行配置
  • result标签,根据action的方法返回值,配置到不同的路径里面
  1. name属性
     和方法返回值一样
  2. type属性
    配置如何到路径中(转发或者重定向)
     type属性默认值 做转发操作
 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <struts>
<package name="struts2" extends="struts-default" namespace="/">
<action name="login" class="action.LoginAction">
<result name="success">/loginSuccess.jsp</result>
<result name="fail">/loginFail.jsp</result>
</action>
</package>
</struts>

struts.xml

4.web.xml, 作用整个项目的全局,设置filter过滤器,捕获器,以及映射标签

  将Struts2所带的过滤器org.apache.struts2.dispatcher.FilterDispatcher配置到工程的web.xml文件中,默认情况下,该过滤器拦截请求字符串中以.action结尾的请求,并将该请求委托给指定的Action进行处理。最直观的表现就是调用Action的execute()方法。注:在Sturts1.X中,该行为由Servlet完成。

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name> <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>

web.xml

5.action.java类

  execute():该方法一般会被重写,当客户端向Action发送请求时,会调用此方法。

 package action;

 public class LoginAction{
private String account;
private String password;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} public String execute()throws Exception{
if(account.equals(password)){
return "success";
}
return "fail";
}
}

action.java

Strut2的体系结构如图所示:

struts2框架

从图可以看出,一个请求在Struts2框架中的处理大概分为以下几个步骤:

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。

注:以上步骤参考至网上。在此表示感谢!

https://www.cnblogs.com/duanxz/p/3158488.html