自己动手搭环境—unit 1.1、Struts2环境搭建

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

引入的是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. 
View Code

用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!
原文地址:https://www.cnblogs.com/ikuman/p/3402370.html