在手动配置action的基础上引入struts2-convention-plugin-2.x.x.jar以支持action的注解支持
修改的地方主要在struts.xml中
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <constant name="struts.devMode" value="true"/> <constant name="struts.action.extension" value="do,action"/> <constant name="struts.locale" value="zh_CN" /> <constant name="struts.convention.package.locators" value="web,action" /> <constant name="struts.convention.action.mapAllMatches" value="true"/> <constant name="struts.convention.default.parent.package" value="convention-default"/> <!-- <package name="struts" extends="struts-default"> <action name="hello" class="com.example.demo.action.HelloAction"> <result name="success">/hello.jsp</result> </action> </package> --> </struts>
此时需要在WEB-INF/context下创建结果映射,如需修改,要定义
<constant name="struts.convention.result.path" value="/WEB-INF/jsp"/>
启动过程中出现一个奇怪的异常

严重: Exception starting filter struts2 java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.startsWith(Ljava/lang/String;Ljava/lang/String;)Z at org.apache.struts2.convention.DefaultResultMapBuilder.createFromResources(DefaultResultMapBuilder.java:260) at org.apache.struts2.convention.DefaultResultMapBuilder.build(DefaultResultMapBuilder.java:189) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:864) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:636) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:335) at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:215) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:380) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:424) at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295) at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445) at org.apache.catalina.core.StandardService.start(StandardService.java:519) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:581) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 2013-11-1 13:32:22 org.apache.catalina.core.StandardContext start
引入的是commons-lang-2.1.jar,当改为commons-lang-2.5.jar后可以正常启动(2.4版本后都可以),比较奇怪,google一下发现大多发生在weblogic容器中容易发生jar包冲突,附解决方式
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
在使用weblogic时为防止与自己引入的jar冲突,可以设置为优先导入自己的jar,配置在weblogic.xml中,使weblogic优先加载应用WEB-INF/lib下面的jar包
有个问题
<constant name="struts.action.extension" value="do,action"/>
当不设置时默认为action,访问时可以用http://localhost/strutsdemo/hello或http://localhost/strutsdemo/hello.action,若设置后则必须指明后缀为.do或.action
当需要改变视图的默认路径时,要修改
<constant name="struts.convention.result.path" value="/WEB-INF/jsp"/>
默认路径为/WEB-INF/content
测试使用@Namespace、@Action等改变视图映射到不同路径
package com.example.demo.action; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import com.opensymphony.xwork2.ActionSupport; @Results({@Result(name="success", location="hello.jsp")}) @Namespace("/test") public class HelloAction extends ActionSupport{ private static final long serialVersionUID = -4395197537614656411L; private String message; public String execute() { message = "xiao hei!"; return SUCCESS; } @Action("m1") public String methord1(){ message = "xiao bai!"; return SUCCESS; } @Action("/m2") public String methord2(){ message = "xiao huang!"; return SUCCESS; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
此时,用http://localhost/strutsdemo/hello.action访问到的是namespace为‘/’,视图WEB-INF/jsp/下面的hello.jsp,证明方式为删除该路径下hello.jsp时会报错

Struts Problem Report Struts has detected an unhandled exception: Messages: There is no Action mapped for namespace / and action name hello. -------------------------------------------------------------------------------- Stacktraces There is no Action mapped for namespace / and action name hello. - [unknown location] com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:189) org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61) org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39) com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) java.lang.Thread.run(Thread.java:619) -------------------------------------------------------------------------------- You are seeing this page because development mode is enabled. Development mode, or devMode, enables extra debugging behaviors and reports to assist developers. To disable this mode, set: struts.devMode=false in your WEB-INF/classes/struts.properties file.
用http://localhost/strutsdemo/test/hello.action访问到的是namespace为'/test',视图WEB-INF/jsp/test/下的hello.jsp
用http://localhost/strutsdemo/test/m1!methord1.action,返回视图为WEB-INF/jsp/test/下的hello.jsp
Hello world, xiao bai!
用http://localhost/strutsdemo/m2!methord2.action与http://localhost/strutsdemo/test/m2!methord2.action结果一致,需要继续验证
Hello world, xiao huang!