Struts2零配置之Configuration by Convention(一)

        随着struts2的不断升级,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置。所谓的零配置并不是任何配置都不需要,而是采用约定大于配置的方式。

在web开发过程中,根据convention-plugin的默认约定,我们不再需要在Struts.xml中配置任何信息。

首先,让我们先来看一下基于convention-plugin实现的Struts"零配置"的HelloWorld。


struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="default" namespace="/" extends="struts-default" />
</struts>

我的HelloWorld


package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {

    private static final long serialVersionUID = -6662538623355755690L;

    private String message;

    public String getMessage() {
        return message;
    }

    public String execute() {
        if (System.currentTimeMillis() % 2 == 0) {
            message = "It's 0";
            return "zero";
        }

        message = "It's 1";
        return SUCCESS;
    }
}

对于一个简单的HelloWorld来讲,struts.xml里面的配置简直精简到了极致。不需要再写一堆一堆的<action>配置了。而我们需要做的只是加入一个struts2-convention-plugin-x.x.x.x.jar

之所以在HelloWorld中不需要任何配置,是因为struts2-convention-plugin进行了以下一系列的约定。

  • Action location by package naming conventions
    com.example. action.Main Action
    com.example. actions.products.Display (implements com.opensymphony.xwork2.Action)
    com.example. struts.company.details.ShowCompanyDetails Action
    com.example. struts2.company.details.ShowCompanyDetailsAction

          Convention plugin默认将包路径包含action,actions,struts,struts2的所有包都作为Action类的路径来搜索。你可以通过设置struts.convention.package.locators属性来修改这个配置。 Convention plugin默认的配置如下:

<constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>

Convention plugin在上述的包及其子包中查找后缀为Action、或者实现了com.opensymphony.xwork2.Action的类。你可以通过设置

struts.convention.action.suffix属性来修改这个配置。Convention plugin默认的配置如下:

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

  • Result (JSP, FreeMarker, etc) location by naming conventions

          当在浏览器中输入http://localhost:8080/hello-world访问时,页面会跳转到WEB-INF/content/hello-world.jsp。
          默认情况下, Convention plugin假设所有的results存放在WEB-INF/content/下。可以通过设置struts.convention.result.path进行修改。Convention plugin默认的配置如下:

<constant name="struts.convention.result.path" value="/WEB-INF/content/"/>

          Convention plugin即使在找不到对应的action的情况下,也可以通过Action的URL(这里是/hello-world)找到对应的结果(/hello-world.jsp)。

  • Class name to URL naming convention
          com.example.actions.MainAction -> /main
          com.example.actions.products.Display -> /products/display

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

          以com.example.struts.company.details.ShowCompanyDetailsAction对应的Action URL为例,Convention plugin会将com.example.struts.company.details.ShowCompanyDetailsAction 的struts后的子包转换成命名空间“/company/details/”,然后ShowCompanyDetailsAction中的“Action”后缀去掉,并将驼峰式的命名大写变小写,并在之间加上“-”(当然“-”也是Convention plugin默认的)最终形成/company/details/show-company-details。这就是类名和Action URL之间的“约定”。


  • Package name to namespace convention
          com.example.actions.MainAction -> /
          com.example.actions.products.Display -> /products

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

          Convention plugin默认将actions、actionstruts、struts2作为root Package,那么com.example.actions.MainAction的命名空间即为“/”,而com.example.actions.products.Display的命名空间为“/products”。


              正是有了这些“约定”才使得我们的HelloWorld能够实现零配置。

          实际的开发过程中如果只这些约定,也许不能完全满足实际项目的需要幸运的是Convention Plugin的配置是相当灵活的。

日后,在继续学习基于注解的灵活配置。

你可能感兴趣的:(struts2,result,results)