随着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>
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中不需要任何配置,是因为struts2-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"/>
当在浏览器中输入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)。
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之间的“约定”。
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的配置是相当灵活的。
日后,在继续学习基于注解的灵活配置。