zoukankan      html  css  js  c++  java
  • struts2的基本配置

    使用到的基础的页面:test.jsp

     
      <body>
        入门程序:<br/>
        <a href="${pageContext.request.contextPath}/prima/userAction.do">userAction</a><br/>
        <a href="${pageContext.request.contextPath }/helloworld/helloWorldAction.do">helloWorld</a><br/>
        
        测试Action名称的搜索顺序:<br/>
        <a href="${pageContext.request.contextPath}/helloworld/helloworld/aaa/helloWorldAction.do">helloWorld</a><br/>
        <a href="${pageContext.request.contextPath}/helloworld/helloworld/helloWorldAction.do">helloWorld</a><br/>
        <a href="${pageContext.request.contextPath}/helloworld/helloWorldAction.do">helloWorld</a><br/>
        
        没有为action指定class:<br/>
        <a href="${pageContext.request.contextPath }/prima/actionNoClass.do">actionNoClass</a><br/>
        
        测试struts2没有输出命名空间helloWorld:<br/>
        <a href="${pageContext.request.contextPath }/helloworld/userAction.do">helloWorld</a><br/>
        
      </body>

     

    1、访问helloWorld应用的路径的设置

    在struts2中,访问struts2的action的url由两部分组成:

    包的命名空间+action的名称   namespace+action

    例如:

    访问前面的HelloWorldAction的URL地址是:/prima/helloWorldAction.action

    (注意:完整路径为:http://localhost:端口/内容路径/prima/helloWorldAction.action),另外我们也可以加上.action后缀访问此Action

    2、Action名称的搜索顺序

    1、获得请求路径的URL,例如url是:

    http://server/struts2/path1/path2/path3/test.action

    2、首先寻找namespace为/path1/path2/path3的package,如果存在这个package,则在这个package中寻找名字为test的action,不存在则转步骤3

    3、寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为test的action,不存在转步骤4

    4、寻找namespace为/path1的package,如果存在这个package,就去这个package中寻找名字为test的action。如果仍然不存在,则在默认的命名空间下查找该action,默认的命名空间为空字符串”/”,如果还是没有,页面报错。

    3、一些默认属性

    1、Namespace默认是“/”

    2、设置指定namespace下的默认action:

    <!-- 
                如果在该命名空间下找不到对应的action名的时候,配置默认执行的action
                name:指定action的名称
                 -->
            <default-action-ref name="helloWorldAction"/>

    使用实例:网站上地址错误都会跳转到一个页面上告诉你页面丢失而不是404报错了。

    3、如果书写的action没有class属性怎么办?

    <!--  
                没有为action指定class,
                    在struts2框架底层的struts-default.xml文件中,配置了默认执行的类
                        com.opensymphony.xwork2.ActionSupport
                            public String execute() throws Exception {
                                return SUCCESS;
                            }
                    实际上,默认执行的是底层提供的ActionSupport类的execute()方法
                    result结果类型,默认是根据struts2框架底层提供的ActionSupport类的execute()返回值,进行跳转
            -->
            <action name="actionNoClass">
                <result name="success">/success.jsp</result>
            </action>

    4、ActionSupport

    Com.opensymphony.xwork2.ActionSupport类时默认的Action类,在编写Action类时,通常会多这个类进行扩展

     

    5、常量的设置

     以action的后缀名为例子:

    在底层的default.properties中是这样配置的:

    struts.action.extension=action,,

    表示默认的struts中的action的后缀名为action或者空

    我们设置action的后缀名(两种方式):

    1:在struts.xml中增加常量:

    <!--  
            constant:配置常量
                name:指定的是struts2框架底层提供的default.properties资源文件中配置的“常量”
                value:指定的是配置常量的值
                在struts.xml中配置的常量的值会覆盖底层提供的default.priperties资源文件中配置的常量的值
                
            配置struts2框架中的action的后缀名,如果有多个,使用“,”隔开
            如果资源文件在struts.properties和struts.xml中都配置了,那么struts.properties中的生效
            因为常量可以在多个配置文件中定义,所以我们需要了解下struts2加载常量的搜索顺序:
                1 struts-default.xml
                2 struts-plugin.xml
                3 struts.xml
                4 struts.properties
                5 web.xml
        -->
          
        <!-- action后缀名 -->
        <constant name="struts.action.extension" value="do,love"/>

     2、在struts.properties中设置常量:

    struts.action.extension=go

    两种方式以哪一种为准呢?这时候我们需要了解在struts中常量定义的顺序。

    应该使用哪种方式好呢?

    我们的建议是在struts.xml中定义。

    一些其他的常用常量:

        <!--  
            constant:配置常量
                name:指定的是struts2框架底层提供的default.properties资源文件中配置的“常量”
                value:指定的是配置常量的值
                在struts.xml中配置的常量的值会覆盖底层提供的default.priperties资源文件中配置的常量的值
                
            配置struts2框架中的action的后缀名,如果有多个,使用“,”隔开
            如果资源文件在struts.properties和struts.xml中都配置了,那么struts.properties中的生效
            因为常量可以在多个配置文件中定义,所以我们需要了解下struts2加载常量的搜索顺序:
                1 struts-default.xml
                2 struts-plugin.xml
                3 struts.xml
                4 struts.properties
                5 web.xml
        -->
          
        <!-- action后缀名 -->
        <constant name="struts.action.extension" value="do,love"/>
        
        
        <!-- 配置国际化资源文件修改时,是否重新加载。默认是false,为不加载 -->
        <!--  
        <constant name="struts.il8n.reload" value="true"/>
        -->
        <!-- 配置struts2框架的配置文件修改时,是否重新加载。默认是false为不加载 -->
        <!--  
        <constant name="struts.configuration.xml.reload" value="true"/>
        -->
         <!-- 
             配置struts2框架的模式
                 默认为false,是生产模式
                 true是开发模式,需要更多的调试信息
                 ### when set to true, resource bundles will be reloaded on _every_ request.
                ### this is good during development, but should never be used in production
                ### struts.i18n.reload=false
          -->
        <constant name="struts.devMode" value="true" />
        
        <!-- 动态方法调用 -->
        <constant name="struts.enable.DynamicMethodInvocation" value="true" />

    6、引入其他配置文件

    我们前面操作可以发现,struts.xml中代码感觉有点多了,而且如果多人协作都更改同一个配置文件不利于开发,其实struts.xml中可以引入其他配置文件的。

       <!-- 引入自定义配置文件 -->
       <include file="cn/itcast/helloworld/struts_helloworld.xml"/>
       <include file="cn/itcast/prima/struts_prima.xml"/>

    以后的项目结构:

     

    一些代码的补充,有兴趣可以拼凑出我的练习代码。

    package cn.itcast.helloworld;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /*
     
     public class HelloWorldAction implements Action {
    
        public String execute() throws Exception {
            System.out.println("this is HelloWorldAction execute method!");
            return "success";
        }
    
    }
     
     */
    
    public class HelloWorldAction extends ActionSupport{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        
        public String execute() throws Exception {
            System.out.println("this is HelloWorldAction execute method 2!");
            return "success";
        }
        
    }
    HelloWorldAction.java
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
    
          <package name="two" namespace="/helloworld" extends="struts-default">
            
                <!--  
                action:
                name:对应页面请求链接的后面半部分
                class:对应要执行的类的完整路径
            -->
            <!-- 
                如果在该命名空间下找不到对应的action名的时候,配置默认执行的action
                name:指定action的名称
                 -->
            <default-action-ref name="helloWorldAction"/>
        
            <action name="helloWorldAction" class="cn.itcast.helloworld.HelloWorldAction">
                <result name="success">/success.jsp</result>
            </action>
            
        </package>
        
    </struts>
    struts_helloworld.xml
    package cn.itcast.prima;
    
    import com.opensymphony.xwork2.Action;
    
    public class UserAction implements Action {
    
        public String execute() throws Exception {
            System.out.println("this is userAction execute method!");
            return "success";
        }
    
    }
    UserAction.java
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
    
         <package name="one" namespace="/prima" extends="struts-default">
        
            
            <action name="userAction" class="cn.itcast.prima.UserAction">
                
                <!-- 
                result:结果类型
                    name:对应的是执行的类的方法的返回值
                     后半部分文本内容:转向的页面
                -->
                
                <result name="success">/success.jsp</result>
            </action>
            
            <!--  
                没有为action指定class,
                    在struts2框架底层的struts-default.xml文件中,配置了默认执行的类
                        com.opensymphony.xwork2.ActionSupport
                            public String execute() throws Exception {
                                return SUCCESS;
                            }
                    实际上,默认执行的是底层提供的ActionSupport类的execute()方法
                    result结果类型,默认是根据struts2框架底层提供的ActionSupport类的execute()返回值,进行跳转
            -->
            <action name="actionNoClass">
                <result name="success">/success.jsp</result>
            </action>
    
        </package>
        
    </struts>
    struts_prima.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
        
        <!-- 书写配置文件找dtd,打开webApp,找到struts2.core下的2.3.dtd,直接复制这部分即可 -->
    
    <struts>
        <!--  
            constant:配置常量
                name:指定的是struts2框架底层提供的default.properties资源文件中配置的“常量”
                value:指定的是配置常量的值
                在struts.xml中配置的常量的值会覆盖底层提供的default.priperties资源文件中配置的常量的值
                
            配置struts2框架中的action的后缀名,如果有多个,使用“,”隔开
            如果资源文件在struts.properties和struts.xml中都配置了,那么struts.properties中的生效
            因为常量可以在多个配置文件中定义,所以我们需要了解下struts2加载常量的搜索顺序:
                1 struts-default.xml
                2 struts-plugin.xml
                3 struts.xml
                4 struts.properties
                5 web.xml
        -->
          
        <!-- action后缀名 -->
        <constant name="struts.action.extension" value="do,love"/>
        
        
        <!-- 配置国际化资源文件修改时,是否重新加载。默认是false,为不加载 -->
        <!--  
        <constant name="struts.il8n.reload" value="true"/>
        -->
        <!-- 配置struts2框架的配置文件修改时,是否重新加载。默认是false为不加载 -->
        <!--  
        <constant name="struts.configuration.xml.reload" value="true"/>
        -->
         <!-- 
             配置struts2框架的模式
                 默认为false,是生产模式
                 true是开发模式,需要更多的调试信息
                 ### when set to true, resource bundles will be reloaded on _every_ request.
                ### this is good during development, but should never be used in production
                ### struts.i18n.reload=false
          -->
        <constant name="struts.devMode" value="true" />
        
        <!-- 动态方法调用 -->
        <constant name="struts.enable.DynamicMethodInvocation" value="true" />
        
        <!-- 
            package:包
            name:包名,唯一的,必选项
            namespace:命名空间,唯一的,相当于房间号。可选项,省略情况下是“/”
            extends:继承
                extends=“struts-default”:struts2框架底层提供的核心包struts2-core-2.3.3.jar下的struts-default.xml文件
                为什么要继承这个struts-default.xml文件
                    因为struts框架底层提供的struts-default.xml声明了所有的拦截器和拦截器栈。
                    我们知道struts2框架运行时执行struts-default.xml中的拦截器栈完成必要功能。
                    如果不继承struts-default.xml文件,就没有办法使用struts2提供的所有拦截器。
            
         -->
        
        
       
    
       <!-- 引入自定义配置文件 -->
       <include file="cn/itcast/helloworld/struts_helloworld.xml"/>
       <include file="cn/itcast/prima/struts_prima.xml"/>
    
    </struts>
    struts.xml

    其他资料:

    default.properties:

    #
    # $Id$
    #
    # Licensed to the Apache Software Foundation (ASF) under one
    # or more contributor license agreements.  See the NOTICE file
    # distributed with this work for additional information
    # regarding copyright ownership.  The ASF licenses this file
    # to you under the Apache License, Version 2.0 (the
    # "License"); you may not use this file except in compliance
    # with the License.  You may obtain a copy of the License at
    #
    #  http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing,
    # software distributed under the License is distributed on an
    # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    # KIND, either express or implied.  See the License for the
    # specific language governing permissions and limitations
    # under the License.
    #
    ### START SNIPPET: complete_file
    
    ### Struts default properties
    ###(can be overridden by a struts.properties file in the root of the classpath)
    ###
    
    ### This can be used to set your default locale and encoding scheme
    # struts.locale=en_US
    struts.i18n.encoding=UTF-8
    
    ### if specified, the default object factory can be overridden here
    ### Note: short-hand notation is supported in some cases, such as "spring"
    ###       Alternatively, you can provide a com.opensymphony.xwork2.ObjectFactory subclass name here
    # struts.objectFactory = spring
    
    ### specifies the autoWiring logic when using the SpringObjectFactory.
    ### valid values are: name, type, auto, and constructor (name is the default)
    struts.objectFactory.spring.autoWire = name
    
    ### indicates to the struts-spring integration if Class instances should be cached
    ### this should, until a future Spring release makes it possible, be left as true
    ### unless you know exactly what you are doing!
    ### valid values are: true, false (true is the default)
    struts.objectFactory.spring.useClassCache = true
    
    ### ensures the autowire strategy is always respected.
    ### valid values are: true, false (false is the default)
    struts.objectFactory.spring.autoWire.alwaysRespect = false
    
    ### By default SpringObjectFactory doesn't support AOP
    ### This flag was added just temporally to check if nothing is broken
    ### See https://issues.apache.org/jira/browse/WW-4110
    struts.objectFactory.spring.enableAopSupport = false
    
    ### if specified, the default object type determiner can be overridden here
    ### Note: short-hand notation is supported in some cases, such as "tiger" or "notiger"
    ###       Alternatively, you can provide a com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation name here
    ### Note: By default, com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer is used which handles type detection
    ###       using generics. com.opensymphony.xwork2.util.GenericsObjectTypeDeterminer was deprecated since XWork 2, it's
    ###       functions are integrated in DefaultObjectTypeDeterminer now.
    ###       To disable tiger support use the "notiger" property value here.
    #struts.objectTypeDeterminer = tiger
    #struts.objectTypeDeterminer = notiger
    
    ### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
    # struts.multipart.parser=cos
    # struts.multipart.parser=pell
    # struts.multipart.parser=jakarta-stream
    struts.multipart.parser=jakarta
    # uses javax.servlet.context.tempdir by default
    struts.multipart.saveDir=
    struts.multipart.maxSize=2097152
    
    ### Load custom property files (does not override struts.properties!)
    # struts.custom.properties=application,org/apache/struts2/extension/custom
    
    ### How request URLs are mapped to and from actions
    #struts.mapper.class=org.apache.struts2.dispatcher.mapper.DefaultActionMapper
    
    ### Used by the DefaultActionMapper
    ### You may provide a comma separated list, e.g. struts.action.extension=action,jnlp,do
    ### The blank extension allows you to match directory listings as well as pure action names
    ### without interfering with static resources, which can be specified as an empty string
    ### prior to a comma e.g. struts.action.extension=, or struts.action.extension=x,y,z,,
    struts.action.extension=action,,
    
    ### Used by FilterDispatcher
    ### If true then Struts serves static content from inside its jar.
    ### If false then the static content must be available at <context_path>/struts
    struts.serve.static=true
    
    ### Used by FilterDispatcher
    ### This is good for development where one wants changes to the static content be
    ### fetch on each request.
    ### NOTE: This will only have effect if struts.serve.static=true
    ### If true -> Struts will write out header for static contents such that they will
    ###             be cached by web browsers (using Date, Cache-Content, Pragma, Expires)
    ###             headers).
    ### If false -> Struts will write out header for static contents such that they are
    ###            NOT to be cached by web browser (using Cache-Content, Pragma, Expires
    ###            headers)
    struts.serve.static.browserCache=true
    
    ### Set this to false if you wish to disable implicit dynamic method invocation
    ### via the URL request. This includes URLs like foo!bar.action, as well as params
    ### like method:bar (but not action:foo).
    ### An alternative to implicit dynamic method invocation is to use wildcard
    ### mappings, such as <action name="*/*" method="{2}" class="actions.{1}">
    struts.enable.DynamicMethodInvocation = false
    
    ### Set this to true if you wish to allow slashes in your action names.  If false,
    ### Actions names cannot have slashes, and will be accessible via any directory
    ### prefix.  This is the traditional behavior expected of WebWork applications.
    ### Setting to true is useful when you want to use wildcards and store values
    ### in the URL, to be extracted by wildcard patterns, such as
    ### <action name="*/*" method="{2}" class="actions.{1}"> to match "/foo/edit" or
    ### "/foo/save".
    struts.enable.SlashesInActionNames = false
    
    ### Disables support for action: prefix
    struts.mapper.action.prefix.enabled = false
    
    ### Blocks access to actions in other namespace than current with action: prefix
    struts.mapper.action.prefix.crossNamespaces = false
    
    ### use alternative syntax that requires %{} in most places
    ### to evaluate expressions for String attributes for tags
    struts.tag.altSyntax=true
    
    ### when set to true, Struts will act much more friendly for developers. This
    ### includes:
    ### - struts.i18n.reload = true
    ### - struts.configuration.xml.reload = true
    ### - raising various debug or ignorable problems to errors
    ###   For example: normally a request to foo.action?someUnknownField=true should
    ###                be ignored (given that any value can come from the web and it
    ###                should not be trusted). However, during development, it may be
    ###                useful to know when these errors are happening and be told of
    ###                them right away.
    struts.devMode = false
    
    ### when set to true, resource bundles will be reloaded on _every_ request.
    ### this is good during development, but should never be used in production
    ### struts.i18n.reload=false
    
    ### Standard UI theme
    ### Change this to reflect which path should be used for JSP control tag templates by default
    struts.ui.theme=xhtml
    struts.ui.templateDir=template
    ### Change this to use a different token to indicate template theme expansion
    struts.ui.theme.expansion.token=~~~
    #sets the default template type. Either ftl, vm, or jsp
    struts.ui.templateSuffix=ftl
    
    ### Configuration reloading
    ### This will cause the configuration to reload struts.xml when it is changed
    ### struts.configuration.xml.reload=false
    
    ### Location of velocity.properties file.  defaults to velocity.properties
    struts.velocity.configfile = velocity.properties
    
    ### Comma separated list of VelocityContext classnames to chain to the StrutsVelocityContext
    struts.velocity.contexts =
    
    ### Location of the velocity toolbox
    struts.velocity.toolboxlocation=
    
    ### used to build URLs, such as the UrlTag
    struts.url.http.port = 80
    struts.url.https.port = 443
    ### possible values are: none, get or all
    struts.url.includeParams = none
    
    ### Load custom default resource bundles
    # struts.custom.i18n.resources=testmessages,testmessages2
    
    ### workaround for some app servers that don't handle HttpServletRequest.getParameterMap()
    ### often used for WebLogic, Orion, and OC4J
    struts.dispatcher.parametersWorkaround = false
    
    ### configure the Freemarker Manager class to be used
    ### Allows user to plug-in customised Freemarker Manager if necessary
    ### MUST extends off org.apache.struts2.views.freemarker.FreemarkerManager
    #struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager
    
    ### Enables caching of FreeMarker templates
    ### Has the same effect as copying the templates under WEB_APP/templates
    ### struts.freemarker.templatesCache=false
    
    ### Enables caching of models on the BeanWrapper
    struts.freemarker.beanwrapperCache=false
    
    ### See the StrutsBeanWrapper javadocs for more information
    struts.freemarker.wrapper.altMap=true
    
    ### maxStrongSize for MruCacheStorage for freemarker, when set to 0 SoftCacheStorage which performs better in heavy loaded application
    ### check WW-3766 for more details
    struts.freemarker.mru.max.strong.size=0
    
    ### configure the XSLTResult class to use stylesheet caching.
    ### Set to true for developers and false for production.
    struts.xslt.nocache=false
    
    ### Whether to always select the namespace to be everything before the last slash or not
    struts.mapper.alwaysSelectFullNamespace=false
    
    ### Whether to allow static method access in OGNL expressions or not
    struts.ognl.allowStaticMethodAccess=false
    
    ### Whether to throw a RuntimeException when a property is not found
    ### in an expression, or when the expression evaluation fails
    struts.el.throwExceptionOnFailure=false
    
    ### Logs as Warnings properties that are not found (very verbose)
    struts.ognl.logMissingProperties=false
    
    ### Caches parsed OGNL expressions, but can lead to memory leaks
    ### if the application generates a lot of different expressions
    struts.ognl.enableExpressionCache=true
    
    ### Indicates if Dispatcher should handle unexpected exceptions by calling sendError()
    ### or simply rethrow it as a ServletException to allow future processing by other frameworks like Spring Security
    struts.handle.exception=true
    ### END SNIPPET: complete_file
    View Code
  • 相关阅读:
    内部类
    java的静态方法多态和匿名对象
    java的重载 和重写
    java多态成员的特点
    java 接口的概念
    linux时间修改-hwclock和date
    mysql配置主从复制和常见问题
    mysql日志种类、二进制日志模式、mysqlbinlog解析二进制日志
    mysql主从复制介绍
    mysql备份与还原-mysqldump备份、mysql与source还原
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5886773.html
Copyright © 2011-2022 走看看