• 自己动手搭环境—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!
  • 相关阅读:
    888. Uncommon Words from Two Sentences
    344. Reverse String
    151. Reverse Words in a String
    557. Reverse Words in a String III
    811. Subdomain Visit Count
    上海市公积金、养老保险、医疗保险转出事宜
    476. Number Complement
    方法重载的条件
    简单工厂模式
    单例模式
  • 原文地址:https://www.cnblogs.com/ikuman/p/3402370.html
Copyright © 2020-2023  润新知