欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

struts2框架

程序员文章站 2022-05-04 14:02:05
详细教程 参考struts教程https://www.w3cschool.cn/struts_2/struts_configuration.html Struts2 基于MVC设计模式的web应用程序框架,它不仅仅是Struts1 的升级版本,更是一个全新的Struts架构。最初,是以WebWork ......

详细教程 参考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属性默认值 做转发操作
struts2框架
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!doctype struts public 
 3     "-//apache software foundation//dtd struts configuration 2.5//en" 
 4     "http://struts.apache.org/dtds/struts-2.5.dtd">
 5     
 6 <struts>
 7     <package name="struts2" extends="struts-default" namespace="/">
 8         <action name="login" class="action.loginaction">
 9             <result name="success">/loginsuccess.jsp</result>
10             <result name="fail">/loginfail.jsp</result>
11         </action>
12     </package>
13 </struts>
struts.xml

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

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

struts2框架
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" 
 5     xsi:schemalocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7   <display-name></display-name>    
 8   
 9   <filter>
10       <filter-name>struts2</filter-name>
11       <filter-class>org.apache.struts2.dispatcher.filter.strutsprepareandexecutefilter</filter-class>
12   </filter>
13   <filter-mapping>
14         <filter-name>struts2</filter-name>
15         <url-pattern>/*</url-pattern>
16   </filter-mapping>
17   
18   <welcome-file-list>
19     <welcome-file>login.jsp</welcome-file>
20   </welcome-file-list>
21 </web-app>
web.xml

5.action.java类

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

struts2框架
 1 package action;
 2 
 3 
 4 public class loginaction{
 5     private string account;
 6     private string password;
 7     public string getaccount() {
 8         return account;
 9     }
10     public void setaccount(string account) {
11         this.account = account;
12     }
13     public string getpassword() {
14         return password;
15     }
16     public void setpassword(string password) {
17         this.password = password;
18     }
19     
20     public string execute()throws exception{
21         if(account.equals(password)){
22             return "success";
23         }
24         return "fail";
25     }
26 }
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