迁移到Struts 2.0

时间:2022-09-19 05:17:31

为了把现有的Struts 1应用迁移到Struts 2,开发者需要改动许多地方。幸好,Struts 1和Struts 2其实可以共存在同一个应用中,这就简化了这种迁移。

■译自《JavaWorld》

如果Struts 2元素添加到了Struts 1应用中,原先存在的Struts 1动作处理*.do请求,而新的Struts 2动作则处理*.action请求。最简单的迁移方法就是,把Struts 2 JAR文件添加到应用上,然后每次把代码迁移到一个页面上。许多变化只是需要移除不需要的Struts 1类和标签,加入Struts 2需要的类和标签。在可选情况下,这两个版本的框架可使用一些共同特性,譬如Tiles配置和验证规则。

下面你可以比较一下为Struts 1编写的代码片段与相应的Struts 2代码片段。

Struts配置文件的变化

Struts配置文件出现了许多变化。最明显的也许就是它的新名称,在Struts 2中,该文件如今名为struts.xml,而不是struts-config.xml。以下代码显示了Struts 1配置文件。

"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"

"jakarta.省略/struts/dtds/struts-config_1_3.dtd">

type="com.demo.form.FormDataForm">

name="formDataForm"

type="com.demo.action.FormDataAction"

scope="request"

validate="false">

Struts 2的相应配置文件比较简单: 元素比较少,元素的属性也比较少。Struts 2中没有FormBeans这个概念。属性如今可以在Action类中直接定义。

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"struts.省略/dtds/struts-2.0.dtd ">

/jspUserProfile.jsp

配置文件出现了许多变化。DTD必须符合Struts 2。配置文件中的根元素是,它必须包括struts-default.xml这个文件才能继承默认行为。因为不支持FormBeans,及相关标签被移除。标签取代了标签。标签属性出现了变化。元素被元素取代。进行所有这些变化,是为了让整个框架保持一致性,以便它与Spring和iBATIS等其他框架在一个水平上。进行这些变化的目的是为了利用版本2框架的许多新特性。譬如说,配置文件利用了智能默认值的优点,其中结果名默认值为“success”。

Action类的变化

Struts 2框架中不再出现ActionForm类。原本在ActionForm类中编写的任何内容如今成了Action类的一部分。Struts 2框架中的Action类比较简单。可以看一下以下代码。

package com.demo.action;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

public class FormDataAction extends Action {

public ActionForward execute(ActionMapping mapping,

ActionForm form,

HttpServletRequest request,

HttpServletResponse response)

throws Exception {

request.setAttribute("FORMDATA", form);

return (mapping.findForward("sucess")); }

}

Struts 2中的Action类一般由ActionSupport扩展而来,可选情况下,可实现Action接口。这里的优点是,任何POJO都可以用做Action。另外,Struts 2中的Action类不是单例类(singleton), Action类针对每个请求都要创建实例。因而,它不需要线程安全(thread safe),可能会有成员变量。下面的代码显示了Struts 2中的Action类,它对应于上述的Struts 1代码,它还集成了在Struts 1中需要封装到ActionForm类中的功能。

package com.demo.action;

import com.opensymphony.xwork2.ActionSupport;

public class FormData extends ActionSupport {

public String execute() throws Exception {

//拥有处理逻辑的代码

……

return (SUCCESS); }

private String strFirstName="";

private String strLastName="";

public void setFirstName(String strFirstName) {

this.strFirstName = strFirstName; }

public String getFirstName() {

return this.strFirstName; }

public void setLastName(String strLastName) {

this.strLastName = strLastName; }

public String getLastName() {

return this.strLastName; }

}

标签的变化

Struts 1中支持的bean标签已完全被标签取代。新标签在许多方面对Struts 1标签做了改进。Struts 2框架的标签一般分为两类: 通用标签和用户界面标签。通用标签用于处理显示页面的执行流程,还可用于数据抽取。通用标签又细分成控制标签和数据标签,前者用于流程控制函数,譬如if、else、append、iterate和merge等函数; 后者用于数据操纵、国际化、本地化、bean和bean属性等。通用标签一般直接输出标签内容。

用户界面标签旨在使用从数据标签获取的数据。这类标签一般用于显示HTML页面上的数据。用户界面标签又细分成表单标签和非表单标签: 前者用于指定表单元素; 后者用于指定动作中的错误、某个字段中的错误,或者高级的用户界面元素(如树或表)。用户界面标签使用模板和主题,其输出通常是混合的显示内容。以下代码表示了使用Struts 1 bean标签的简单示例。

This is a demo!

var _gaq = _gaq || [];_gaq.push(['_setAccount', 'UA-22575914-1']);_gaq.push(['_setDomainName', '.省略']);_gaq.push(['_trackPageview']);(function () {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'www') + '.省略/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.省略';var _siteid =691;var _istoken = 1;var _model = 'Model01'; WebPageSpeed =328; UrchinTrack();

同一个示例经过改动后,可使用Struts 2标签。

This is a demo!

var _gaq = _gaq || [];_gaq.push(['_setAccount', 'UA-22575914-1']);_gaq.push(['_setDomainName', '.省略']);_gaq.push(['_trackPageview']);(function () {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'www') + '.省略/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.省略';var _siteid =691;var _istoken = 1;var _model = 'Model01'; WebPageSpeed =328; UrchinTrack();

在该示例中,为了改动代码,@taglib命令的值被Struts标签所取代。这里的优点是,Struts标签会自动查找属性,因而不需要指定ActionForm。

上一篇:个人助手Agent的研究与应用 下一篇:Struts 2.0:引领下一代Web开发趋势