随着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 conventionscom.example. action.Main Actioncom.example. actions.products.Display (implements com.opensymphony.xwork2.Action)com.example. struts.company.details.ShowCompanyDetails Actioncom.example. struts2.company.details.ShowCompanyDetailsAction
<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.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.products.Display -> /products
com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details
Convention plugin默认将actions、action、struts、struts2作为root Package,那么com.example.actions.MainAction的命名空间即为“/”,而com.example.actions.products.Display的命名空间为“/products”。
正是有了这些“约定”才使得我们的HelloWorld能够实现零配置。
实际的开发过程中如果只这些约定,也许不能完全满足实际项目的需要。幸运的是Convention Plugin的配置是相当灵活的。
日后,在继续学习基于注解的灵活配置。