action配置的格式
<package name="包名字" extends="继承的包" namespace="空间名" >
<action name="访问的名称" class="处理请求的类">
<result name="处理类返回的结果名称">该结果名称所对应的JSP页面</result>
</action>
</package>
常用的两种action配置示例
<?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>
<package name="getIp" extends="json-default" namespace="/getIp">
<!-- 查询链接 -->
<action name="getIpDetailAction" class="action.GetIpDetailAction">
<result type="json"></result>
</action>
<action name="getIp" class="action.GetIpAction">
<result name="success">/getIp.jsp</result>
</action>
</package>
</struts>
这两种配置的访问方法分别为
getIpDetailAction
localhost:8080/项目名/命名空间/action名称
在浏览器中输入 localhost:8080/项目名/getIp/getIpDetailAction
就会进入到
action.GetIpDetailAction中进行处理
然后返回一个json
getIp
localhost:8080/项目名/命名空间/action名称
在浏览器中输入 localhost:8080/项目名/getIp/getIp
就会进入到
action.GetIpAction中进行处理
处理成功后跳转到
getIp.jsp页面
Action配置中的各项默认值
如果没有为action指定class,默认是ActionSupport类
<action name="Login">
相当于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport">
如果没有为action指定method,默认执行action中的execute()方法
<action name="Login">
相当于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport" method="execute">
如果没有指定result的name属性,默认值为success.
<result>
相当于
<result name="success">
ps: ActionSupport这个类到底是个什么类呢?
是一个具有execute方法的类,并且execute方法返回”success”字符串. ActionSupport还实现了很多其他的结果,提供了许多定制的功能
一些配置用法示例
示例一
<package name="aa" extends="struts-default" >
<action name="myaa" class="com.test.MyAction">
<result name="success">/test/msg.jsp</result>
</action>
</package>
访问时:
<a href="myaa.action" >访问myaaAction</a>
ps: 这里的.action也是默认值 可在后面讲到的开关中设置
示例二
method属性,该属性可以把一个类的多个方法映射为多个Action,如:
类文件
public class MethodAction extends ActionSupport
{
public String add()
{
return SUCCESS;
}
public String delete()
{
return SUCCESS;
}
public String modify()
{
return SUCCESS;
}
public String query()
{
return SUCCESS;
}
}
struts.xml配置文件:
<action name="访问的方法名" class="处理的类" method="处理的方法名">
<result name="结果页名">结果页面</result>
</action>
<action name="add" class="com.struts2.chen.MethodAction" method="add">
<result name="success">/method/addRes.jsp</result>
</action>
<action name="delete" class="com.struts2.chen.MethodAction" method="delete">
<result name="success">/method/deleteRes.jsp</result>
</action>
<action name="modify" class="com.struts2.chen.MethodAction" method="modify">
<result name="success">/method/modifyRes.jsp</result>
</action>
<action name="query" class="com.struts2.chen.MethodAction" method="query">
<result name="success">/method/queryRes.jsp</result>
</action>
页面:
<a href="add.action">增加</a><br />
<a href="delete.action">删除</a><br />
<a href="modify.action">修改</a><br />
<a href="query.action">查询</a><br />
示例三
动态调用方法DMI 如果是动态调用,那么就不必要象上面那样填写那么多的配置,可以直接在页面上指定调用的方法。类文件
public class MethodAction extends ActionSupport
{
public String add()
{
return SUCCESS;
}
public String delete()
{
return SUCCESS;
}
public String modify()
{
return SUCCESS;
}
public String query()
{
return SUCCESS;
}
}
struts.xml配置为:
<action name="methodaction" class="com.struts2.chen.MethodAction">
<result name="success">/method/Res.jsp</result>
</action>
页面:
<a href="<%=path %>/methodaction!add.action">增加DMI</a><br />
<a href="<%=path %>/methodaction!delete.action">删除DMI</a><br />
<a href="<%=path %>/methodaction!modify.action">修改DMI</a><br />
<a href="<%=path %>/methodaction!query.action">查询DMI</a><br />
常用开关的介绍
以下开关并非都要设置,酌情使用
<constant name="struts.i18n.encoding" value="UTF-8"/>
指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法
<constant name="struts.action.extension" value="do"/>
该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
ps:
在请求时,路径后的后缀action可要可不要,即下面的两种请求都是可以的
http://localhost:8080/Struts2/chapter1/HelloWorld
http://localhost:8080/Struts2/chapter1/HelloWorld.action
http://localhost:8080/Struts2/chapter1/HelloWorld.do
<constant name="struts.serve.static.browserCache " value="false"/>
设置浏览器是否缓存静态内容,默认值为true,开发阶段最好false
<constant name="struts.configuration.xml.reload" value="true"/>
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好true
<constant name="struts.devMode" value="true"/>
开发模式下设为true,这样可以打印出更详细的错误信息
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
动态方法调用,可以解决多个请求对应一个Servlet的问题,后面详细讲解,默认为true,关闭则设为false.
struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。
struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。
struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。
struts.tag.altSyntax 该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。
struts.devMode该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。
struts.i18n.reload该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。
ps:开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。
struts.ui.theme该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。
struts.ui.templateDir该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。
struts.ui.templateSuffix该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。
struts.configuration.xml.reload该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。
struts.velocity.configfile该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。
struts.velocity.contexts该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。
struts.velocity.toolboxlocation该属性指定Velocity框架的toolbox的位置。
struts.url.http.port该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。
struts.url.https.port该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。
struts.url.includeParams该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。
struts.custom.i18n.resources该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。
struts.dispatcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。
struts.freemarker.manager.classname 该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。
struts.freemarker.wrapper.altMap该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。
struts.xslt.nocache 该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。
struts.configuration.files 该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了
错误提示页面
当访问不存在的action 的时候,会报错,那么就应该到struts.xml中加上一个默认错误ACTION。如:
<default-action-ref name="error" />
<action name="error">
<result>/error.jsp</result>
</action>
错误的,不存在的页面,那么就在web.xml中加如下配置:
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
一份完整的struts示例
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
<include file="struts-default.xml"></include>
<package name="com.kay.struts2" extends="struts-default" namespace="/test">
<interceptors>
<interceptor name="timer" class="com.kay.timer"></interceptor>
<interceptor name="logger" class="com.kay.logger"></interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="logger"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<global-results>
<result name="input">/error.jsp</result>
</global-results>
<action name="hello" class="com.kay.struts2.Action.LoginAction">
<interceptor-ref name="timer"></interceptor-ref>
<result name="success" type="dispatcher">/talk.jsp</result>
<param name="url">http://www.sina.com</param>
</action>
</package>
</struts>
分段解析struts
<include file="struts-default.xml"></include>
include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用
如图
我在2中 使用<include file="struts/*.xml"></include> 就可以把1的struts包含在内
<interceptor-stack name="mystack">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="logger"></interceptor-ref>
</interceptor-stack>
定义拦截器栈
<interceptor name="timer" class="com.kay.timer"></interceptor>
<interceptor name="logger" class="com.kay.logger"></interceptor>
定义拦截器 name:拦截器名称 class:拦截器类路径
<default-interceptor-ref name="mystack"></default-interceptor-ref>
定义默认的拦截器 每个Action都会自动引用,如果Action中引用了其它的拦截器 默认的拦截器将无效
<global-results>
<result name="input">/error.jsp</result>
</global-results>
全局results配置
<param name="url">http://www.sina.com</param>
参数设置 name:对应Action中的get/set方法
<result name="success" type="dispatcher">/talk.jsp</result>
节点配置 name : result名称 和Action中返回的值相同 type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher
<interceptor-ref name="timer"></interceptor-ref>
引用拦截器 name:拦截器名称或拦截器栈名称
<action name="hello" class="com.kay.struts2.Action.LoginAction">
</action>
Action配置 一个Action可以被多次映射(只要action配置中的name不同)
name:action名称
class: 对应的类的路径
method: 调用Action中的方法名
<package name="com.kay.struts2" extends="struts-default" namespace="/test">
</package>
package提供了将多个Action组织为一个模块的方式
package的名字必须是唯一的 package可以扩展 当一个package扩展自
另一个package时该package会在本身配置的基础上加入扩展的package
的配置 父package必须在子package前配置
name:package名称
extends:继承的父package名称
abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action
我常用的struts配置
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>
<!-- struts constants-->
<constant name="struts.multipart.maxSize" value="2000000000" />
<constant name="struts.multipart.saveDir" value="/tmp" />
<constant name="struts.custom.i18n.resources" value="i18n/message,i18n/actions" />
<package name="zoe-default" extends="json-default">
<interceptors>
<!-- Default Stack -->
<interceptor-stack name="zoeStack">
<interceptor-ref name="defaultStack">
<param name="exception.logEnabled">true</param>
<param name="exception.logLevel">warn</param>
</interceptor-ref>
</interceptor-stack>
<!-- Authority CheckInterceptor -->
</interceptors>
</package>
<!-- struts packages -->
<include file="struts/*.xml"></include>
<!-- spring plug-in(refer from spring plug-in package) -->
<!--
<package name="spring-default">
<interceptors>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
</interceptors>
</package>
-->
<!-- json plug-in(refer from json plug-in package) -->
<!--
<package name="json-default" extends="struts-default">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
</interceptors>
</package>
-->
</struts>
struts文件夹下的 action-package.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>
<package name="getIp" extends="json-default" namespace="/getIp">
<!-- 查询链接 -->
<action name="getIpDetailAction" class="action.GetIpDetailAction">
<result type="json"></result>
</action>
<action name="getIp" class="action.GetIpAction">
<result name="success">/getIp.jsp</result>
</action>
</package>
</struts>