在手动配置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!

最新文章

  1. iOS开发UI篇—CAlayer(自定义layer)
  2. android四大组件(简单总结)
  3. 在Windows10 64位 Anaconda4 Python3.5下安装XGBoost
  4. STMFD 和LDMFD指令
  5. 如何编写Vault插件扩展Vault Explorer的功能
  6. iOS Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UITableView.m:7962
  7. OC-数组排序-NSSortDescriptor使用
  8. Solved: Qt Library LNK 2001 staticMetaObject error
  9. Android开源框架:AndroidAnnotations
  10. python 文件操作,seek, tell, name...
  11. xhtml头文件设置
  12. Ubuntu上CUDA和CUDNN的安装
  13. XJOI1424解压字符串
  14. SSM框架开发web项目系列(七) SpringMVC请求接收
  15. UVA - 11468 (AC自动机+动态规划)
  16. unity UI如何开启(显示)或者关闭(隐藏)Panel界面最好?
  17. AS 400 常用命令
  18. Java编程思想 学习笔记4
  19. 【刷题】LOJ 6015 「网络流 24 题」星际转移
  20. 用jQuery实现ajax总结以及跨域问题

热门文章

  1. React---钩子函数
  2. InetlliJ IDEA的快捷键及各种配置
  3. UVA 437 &quot;The Tower of Babylon&quot; (DAG上的动态规划)
  4. C# 自动翻页 PPT 测试脚本
  5. vue-learning:27 - component - 组件三大API之二:event
  6. 前端js页面跳转
  7. Linux 内核注册一个 USB 驱动
  8. ASP.NET WebForm Ajax请求Handler的经验
  9. python单例设计模式
  10. JIRA从8.1.0升级到8.3.0