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
原文地址:https://www.cnblogs.com/aigeileshei/p/5886773.html