`
jusescn
  • 浏览: 125810 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Convention Plugin

    博客分类:
  • ssh
阅读更多

Convention Plugin

struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。

  • 包命名习惯来指定Action位置
  • 命名习惯制定结果(支持JSP,FreeMarker等)路径
  • 类名到URL的约定转换
  • 包名到命名空间(namespace)的约定转换
  • 遵循SEO规范的链接地址(即:使用my-action 来替代 MyAction
  • 基于注解的Action
  • 基于注解的拦截机(Interceptor
  • 基于注解的命名空间(Nameespace
  • 基于注解的XWork
  • 默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products com.example.actions.products.Index进行处理)

无需配置Convention即可使用ConventionConvention的某些约束习惯可以通过配置属性来控制,您也可以在类中覆写其中的方法来达到扩展目地。

安装

使用Convention插件,你需要将其JAR文件放到你应用的WEB-INF/lib目录中,你也可以在你Macen项目的POM文件中添加下面包依赖

<dependency>

 <groupId>org.apache.struts</groupId>

 <artifactId>struts2-convention-plugin</artifactId>

 <version>2.1.6</version>

</dependency>

转换基于Codebehind项目到Convention

跳转到此页面,查看需要修改的变化和小提示

如果你想在你系统中结合Convention插件使用REST。需要在你项目的struts.xml中添加如下配置

<constant >"struts.convention.action.suffix" value="Controller"/>

<constant >"struts.convention.action.mapAllMatches" value="true"/>

<constant >"struts.convention.default.parent.package" value="rest-default"/>

Hello world

到目前为止,你已经在你项目中添加了Convention插件支持,首先我们从一个非常简单的例子开始入手。本例中,我们将演示根据访问URL来访问固定的Action,默认情况下,Convention会默认所有的结果页面都存储在WEB-INF/content下,你也可以在strutsproperties文件中设定struts.convention.result.path的值到一个新的路径。路径最后“/”是不必要的,Convention会自动进行处理。以下是本例的JSP文件

WEB-INF/content/hello-world.jsp

<html>

<body>

Hello world!

</body>

</html>

启动Tomcat或其他你所使用的JEE容器,在浏览器访问http://localhost:8080/hello-world 你可看到以下信息:

WEB-INF/content/hello-world.jsp

Hello world!

这表明,Convention已经能正常运行,并找到了结果。即使在没有action存在情况下,convention也会根据URL规则来找到结果页面。

Code behind hello world

我们继续扩展本例并添加代码实现类。为了实现本功能,首先需要Convention能正确找到我们的Action 类,默认情况下,Convention会找到com.opensymphony.xwork2.Action 的实现类,或制定包中以Action结尾的类 action

Convention使用以下方法来搜索类路径,首先,Convention会从根package中寻找包名含有strutsstruts2action or actions的任意packages。下一部,Convention从前一步找到的package以及其子package中寻找 com.opensymphony.xwork2.Action 的实现以及以Action结尾的类,下面为Convention寻找的类

Classes

com.example.actions.MainAction

com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)

com.example.struts.company.details.ShowCompanyDetailsAction

每一个被Convention找到action都会对应一个明确的URL地址,URLpackage的名字以及Action类名为基础。

首先Convention从根package以及类所在的package名来确定对应的URL中的路径(namespace),以下就是根据package确定的URL namespace

Namespaces

com.example.actions.MainAction -> /

com.example.actions.products.Display -> /products

com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details

接下来Convention需要确定URL的具体资源部分。第一步取消类名中的Action,并以”-”来分割类名的其他部分,且将每个分部的首字母转为小写。如下所示

Full URLs

com.example.actions.MainAction -> /main

com.example.actions.products.Display -> /products/display

com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details/show-company-details

你也可以通过配置struts.convention.exclude.packages 来告诉Convention忽略某些包,也可以设置struts.convention.package.locators用来更改Convention默认的根packages,最后你还可以设置 struts.convention.action.packages. 来让Convention只搜索特定package下的Action

以下就是action类的实现代码:

com.example.actions.HelloWorld

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {

 privateString message;

 publicString getMessage() {

    return message;

 }

 publicString execute() {

    message = "Hello World!";

    return SUCCESS;

 }

}

编译以上代码,并将其class放到 WEB-INF/classes中,Convention将会将 /hello-world 映射到这个Action. 部署上面的类以后,我们在JSP文件中添加打印message的语句,具体代码如下:

WEB-INF/content/hello-world.jsp

<html>

<body>

The message is ${message}

</body>

</html>

启动应用服务器,在浏览器访问 http://localhost:8080/hello-world地址,我们看到如下结果界面:

Result

The message is Hello World!

Results and result codes

Struts启动后,Convention将预设好应用中的所有的action,默认情况下,配置将包含在你应用中能找到的所有JSP文件。

同时您也可在Action代码中设置与习惯不同的结果页面。通常Action方法返回一个字符串,通过返回的字符串找到结果页面,而使用Convention允许你在action代码中指定和返回字符串不同的结果页面。

编译下面的例子。我们希望在action中返回zero 而不是success,第一步,我们更新action类,返回zero

com.example.actions.HelloWorld

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {

 privateString message;

 publicString getMessage() {

    return message;

 }

 publicString execute() {

    if (System.currentTimeMillis() % 2 == 0) {

      message = "It's 0";

      return"zero";

    }

    message = "It's 1";

    return SUCCESS;

 }

}

接下来,我们添加一个新的JSP页面 WEB-INF/content/hello-world-zero.jsp 。需要注意的是,文件名的第一部分和action名是对应的,后面的部分和action返回的字符串对应。这就是convention确定具体使用那个页面来渲染结果。下面是修改后的JSP代码:

WEB-INF/content/hello-world.jsp

<html>

<body>

The error message is ${message}

</body>

</html>

现在,你可以编辑你的程序,重启应用,刷新页面,根据当前时间不通,会看到不通的渲染结果页面

结果页面的类型会自动匹配文件,支持的渲染页面的格式为:jsp.ftl,vm,html,htm.下面是actiong和结果模版的映射关系:

URL

Result

File that could match

Result Type

/hello

success

/WEB-INF/content/hello.jsp

Dispatcher

/hello

success

/WEB-INF/content/hello-success.htm

Dispatcher

/hello

success

/WEB-INF/content/hello.ftl

FreeMarker

/hello-world

input

/WEB-INF/content/hello-world-input.vm

Velocity

/test1/test2/hello

error

/WEB-INF/content/test/test2/hello-error.html

Dispatcher

Action

如果在一个action结果中调用另外一个action ,他们俩将被链接到一起,如果在第一个action代码中未定义result,如下代码:

com.example.actions.HelloWorld

package com.example.actions;

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {

    @Action("foo")

    publicString foo() {

        return"bar";

    }

    @Action("foo-bar")

    publicString bar() {

        return SUCCESS;

    }

}

 “foo” action执行时候,由于找不到结果,convention尝试在同一个包下寻找action名为”foo-bar”action。如果找到这样的actionconvention将会调用并返回相关联的result

XWork packages

为了避免冲突,可将action放在一个自定义XWORKpackage下。package命名由action所在的Java,action对应的URLnamespace部分以及actionparent XWork package三个部分组成。parent XWork package 值在属性 struts.convention.default.parent.package 中指定(默认为conventionDefault),package的属性值须继承于 strutsDefault

因此,Convention插件中XWORK packages 采用如下命名规则:

XWork package naming

<java-package>#<namespace>#<parent-package>

Using our example from above, the XWork package for our action would be:

上例中,action对应的 XWORK package如下:

XWork package naming

com.example.actions#/#conventionDefault

Annotation 参考

Convention使用某些注解语句来覆写插件默认的actionurl的映射和自动搜索渲染到的页面。此外,你还可以修改action配置文件中定义的父XWORK的包信息

Action annotation

Convention 插件可以使用Action注解语句来修改action返回的URL地址。本注解同时也允许包含在Actions语句中,用来使一个action对应于多个URL。在action 方法中使用本注解语句,可以参考以下代码

com.example.actions.HelloWorld

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

import org.apache.struts2.convention.annotation.Action;

public class HelloWorld extends ActionSupport {

 @Action("/different/url")

 publicString execute() {

    return SUCCESS;

 }

}

现在我们action类中将使用 /different/url 来替代默认的 /hello-world,如果未指定@Result(参考下节),result的路径将会使用actionnamespace,上面的例子中将会返回一下路径 "/WEB-INF/content/different/url.jsp"

Action类中的单个方法可以使用Actions注解来映射多个地址。

com.example.actions.HelloWorld

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

import org.apache.struts2.convention.annotation.Action;

import org.apache.struts2.convention.annotation.Actions;

public class HelloWorld extends ActionSupport {

 @Actions({

    @Action("/different/url"),

    @Action("/another/url")

 })

 publicString execute() {

    return SUCCESS;

 }

}

另外的 Action Actions的使用方法是,在单个action类中定义多个action方法,每个方法对应一个不同的地址。下面是多个action方法的范例:

com.example.actions.HelloWorld

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

import org.apache.struts2.convention.annotation.Action;

import org.apache.struts2.convention.annotation.Actions;

public class HelloWorld extends ActionSupport {

 @Action("/different/url")

 publicString execute() {

    return SUCCESS;

 }

 @Action("url")

 publicString doSomething() {

    return SUCCESS;

 }

}

前面的例子中,第二个URL地址是不推荐的,上面url将使用java 包名作为namespace,而不会直接使用Action注解的地址。

Interceptor interceptor stacks 同样可以使用interceptorRefs 注解来指定。下

分享到:
评论

相关推荐

    Struts2 Convention Plugin中文文档 Annotion

    Struts2 Convention Plugin 是从 Struts2.1 版本开始引入的一个插件,它的主要目标是实现 Struts2 框架的零配置。通过约定优于配置的原则,开发者可以更加专注于业务逻辑,减少大量的 XML 配置工作。以下是 ...

    struts2 convention plugin(插件) 测试项目

    Struts2 Convention Plugin是Apache Struts框架的一个重要组成部分,它为开发者提供了一种更为便捷的配置方式,使得在Struts2应用中实现MVC模式变得更加简单。这个测试项目旨在帮助我们理解和掌握如何在实际开发中...

    struts2采用convention-plugin实现零配置

    然而,随着版本的更新,Struts2引入了一个名为Convention Plugin的新特性,旨在简化配置过程,实现所谓的“零配置”开发。 **什么是Struts2 Convention Plugin?** Convention Plugin是Struts2的一个插件,它基于...

    Struts2_Convention_Plugin中文文档

    Struts2 Convention Plugin是Apache Struts框架的一个重要插件,主要目标是简化MVC(Model-View-Controller)架构中的配置工作。这个插件引入了一种约定优于配置(Convention over Configuration)的理念,允许...

    struts2-convention-plugin

    ### Struts2 Convention Plugin详解 #### 一、引言 从Struts2的2.1版本开始,Convention Plugin被引入,旨在替代原有的Codebehind Plugin,实现Struts2框架下的零配置理念。这一转变简化了应用程序的开发流程,...

    Struts2.1零配置——convention-plugin

    Struts2.1引入了Convention Plugin,以实现框架的零配置目标,替代之前的Codebehind Plugin。这个插件通过约定优于配置的原则简化了Struts2的应用开发,减少了XML配置文件的需求。以下是对Convention Plugin主要特性...

    struts2.1.6利用convention-plugin和json-plugin实现json零配置

    在这个版本中,Struts引入了两个重要的插件:Convention Plugin和JSON Plugin,使得JSON支持和配置简化成为可能。接下来,我们将深入探讨这两个插件的功能和如何在实际项目中应用它们。 **Convention Plugin**: ...

    struts convention plugin to scan jar files for actions

    Struts Convention 插件是 Apache Struts 框架的一部分,它主要负责自动发现和配置控制器(actions)以及相关的资源,极大地简化了基于 Struts 的Web应用开发。这个插件的核心功能是在应用运行时扫描指定的类路径,...

    struts _convention _plugin application

    Struts2 Convention Plugin 应用详解 Struts2 是一个非常流行的开源 Java 框架,用于构建基于 Model-View-Controller(MVC)架构的Web应用程序。它提供了丰富的功能和灵活性,使得开发者能够更高效地开发Web应用。...

    convention-plugin.doc

    Struts2 Convention Plugin 是从 Struts2.1 版本开始引入的一个重要组件,它的主要目标是实现 Struts2 框架的零配置。这个插件通过一系列约定,简化了应用程序的配置过程,允许开发者更加专注于业务逻辑,而不是框架...

    convention-plugin 插件使用说明

    &lt;artifactId&gt;struts2-convention-plugin &lt;version&gt;2.1.6 ``` #### 转换Codebehind项目至Convention模式 若希望在现有项目中融入Convention插件,特别是在结合RESTful设计时,可在项目的struts.xml中加入特定...

    struts2-convention-plugin-2.3.24.1

    struts2-convention-plugin-2.3.24.1

    struts2-convention-plugin-2.3.15.1.jar

    struts2-convention-plugin-2.3.15.1.jar

    struts2-convention-plugin-2.1.6.jar

    struts2-convention-plugin-2.1.6.jar

    struts2-convention-plugin-2.3.1.jar

    struts2-convention-plugin-2.3.1.jar,使用注解的方式代替xml配置action,必须要引用这个包。

    struts2-convention-plugin-2.1.8.jar

    struts2-convention-plugin-2.1.8.jar

    struts2-convention-plugin-2.3.15.2

    Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置,使用Convention插件,你需要此JAR文件

    struts2-convention-plugin-2.3.32

    struts2-convention-plugin-2.3.32

Global site tag (gtag.js) - Google Analytics