公司项目用了Struts零配置,看起来好像很有趣的样子,稍微看了下。
1.将struts-Convention-plugin-2.1.6.jar文件复制到WEB-INF/lib路径下
2.web.xml
<display-name>SSI</display-name>
<!-- Struts配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<init-param>
<param-name>config</param-name>
<param-value>classpath:/struts.xml</param-value>
</init-param>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
3.Struts.xml配置
<struts>
<!-- convertion插件配置 -->
<!-- ACTION后缀 -->
<constant name="struts.convention.action.suffix" value="Action"/>
<!-- 缺省的包是什么(定义拦截器用) -->
<constant name="struts.convention.default.parent.package" value="global"/>
<!-- 是否禁止通过包扫描Action。默认值是false -->
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<!-- 慎用!Convention插件使用该常量指定的包作为搜寻Action的根包。对于actions.fore.LoginAction类,
按约定原本应映射到/fore/login;如果将该常量设为fore,则该Action将会映射到/login -->
<constant name="struts.convention.package.locators" value="action"/>
<!-- 配置Convention插件自动重加载映射 -->
<constant name="struts.convention.classes.reload" value="true" />
<!-- 不扫描哪些包下面的java类作为action -->
<!-- <constant name="struts.Convention.exclude.packges" value="action"/> -->
<!-- 慎用!插件以该常量指定包作为根包来搜索Action类。
Convention插件除了扫描action,actions,struts,struts2四个包的类以外,还会扫描该常量指定的一个或多个包 -->
<!-- <constant name="struts.convention.action.packages" value="action"/> -->
<!-- 设置Convention插件定位视图资源的根路径。默认值为/WEB-INF/content -->
<!-- <struts.convention.result.path" value="path"/> -->
<!-- convertion插件配置 -->
<!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 该属性指定需要Struts 2处理的请求后缀,多个后缀之间以(,)隔开。 -->
<constant name="struts.action.extension" value="action"/>
<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- 开发模式下使用,详细错误提示+修改配置文件不用重启tomcat含有i18n.reload、configuration.xml.reload -->
<constant name="struts.devMode" value="true" />
<!-- 每次上传文件的总大小设置为不超过100MB-->
<constant name="struts.multipart.maxSize" value="104857600"/>
<!-- 动态方法调用 ,为true时,就可以在struts.xml配置“*”的通配符-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 全局 -->
<package name="global" extends="struts-default,json-default">
</package>
</struts>
4.编写action文件
package com.test.manager.action;
import java.util.HashMap;
import java.util.Map;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@Results({
@Result(name = "resultObj", type = "json", params = { "root",
"resultObj" }),
@Result(name = "resultArray", type = "json", params = { "root",
"resultArray" }) })
public class testAction extends ActionSupport {
private Map resultObj = null;
public String HelloWorld() {
resultObj = new HashMap();
resultObj.put("returnMessage", "hello world!");
return "resultObj";
}
public Map getResultObj() {
return resultObj;
}
public void setResultObj(Map resultObj) {
this.resultObj = resultObj;
}
}
启动tomcat,在地址栏输入http://localhost:8080/SSI/test!HelloWorld.action
5.引入的jar包
6.插件的一些说明(转)
对于Convention插件而言,它会自动搜索位于action,actions,struts,struts2包下的所有java类,Convention插件会把如下两种java类当成Action处理:
1) 所有实现了com.opensymphony.xwork2.Action的java类
2) 所有类名以Action结尾的java类
默认情况下。Convention总会到WEB应用的WEB-INF/content路径下定位物理资源,定位资源的约定是:actionRUL+resultCODE+suffix。当某个逻辑视图找不到对应的试图资源时,Convention会自动视图使用ActionURL+suffix作为物理视图资源。
如:actions.fore.LoginAction 返回success字符串时,Convention优先考虑使用WEB-INF/content/fore目录下的login-success.jsp作为视图资源。如果找不到该文件,login.jsp也可作为对应的试图资源。如果返回input字符串,Convention会将WEB-INF/content/fore里面查找login-input.jsp
映射完毕会将Action类名的驼峰写法(每个单词首字母大写、其他字母小写的写法)转成中画线写法(所有字母小写,单词与单词之间以中画线隔开)
为了看到struts2应用里的Action等各种资源的影射情况,struts2提供了Config Browser插件。使用方法,将struts2-config-browser-plugin-2.1.6.jar文件复制到struts2应用的WEB-INF/lib目录中。
打开首页地址:http://localhost:8080/应用名字/config-browser/actionNames.action这里可以看到Config Browser插件的首页。
注意:这里不管开发者是否使用struts.xml文件进行配置,一样可以看到struts的配置信息。
如果希望一个Action处理结束后不是进入一个试图页面,而是进行另一个Action形成的Action链。通过Convention插件则只需遵守如下三个约定即可。
1) 第一个Action返回的逻辑视图字符串没有对应的视图资源
2) 第二个Action与第一个Action处在同一个包下
3) 第二个Action影射的URL为:firstActionURL+resultCODE
如,第一个Action为OneAction,里面有个方法返回为“two”,那么就得保证,WEB-INF/content/下没有one.jsp或one-two.jsp 对于第二个action 它的名字应该是OneTwoAction,而对应的url应该是:“one-two.action”