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"/>
以后的项目结构:
一些代码的补充,有兴趣可以拼凑出我的练习代码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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"; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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"; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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>
其他资料:
default.properties:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# # $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