本文主要是介绍码农小汪-struts2学习4-struts.xml 常用配置解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
都是简单的基础,不懂又不行!还是来简单的说一下子
- struts.xml 文件主要负责管理应用中的 Action 映射,以及该容主要包括: Action、 Interceptor、 Packages 和 Namespace 等
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="demo" extends="struts-default"><action name="submit" class="......Action"><result name="save">/result.jsp</result><result name="print">/result.jsp</result></action>
</package></struts>
上面差不多就是最基本的格式了吧,我觉得还是配置文件看起来比较好,比注解更好。
- 小技巧:使用
这种有什么值得学习的呢?如果我们都放在一个structs.xml文件中,一个大的项目下,大家都需要修改配置文件,比较的凌乱,还是自己管理自己的比较好吧,非常的棒棒,最后反正都要加载的,没事
<struts>
<include file="newstruts.xml"/>
<package name="test" extends="struts-default">
......
</package>
</struts>
注意:
- 用引用的 xml 文件也必须是完成的 struts2 的配置。实际上在引用时是单独解析
xml 文件,而不是将被引用的文件插入到 struts.xml 文件中。 - struts-default.xml 这个文件被包含在 struts2-core.jar 中,文件名已经可以看出这个文件的作用是
struts.xml 的默认配置,它将自动被加载后导入到 struts.xml 中去。
action 配置:
- 在默认情况下, Struts2 会调用动作类的 execute 方法。但有些时候,需要在一个动作类中处理不同
的动作。也就是用户请求不同的动作时,执行动作类中的不同的方法。为了达到这个目的,可以在
标签中通过 method 方法指定要执行的动作类的方法名,并且需要为不同的动作起不同的名字
struts>
<package name="demo" extends="struts-default" ><action name="test" class="action.MyAction">
......</action><action name="my" class="action. MyAction" method="my">
......</action>
</package>
</struts>
上面代码的两个动作的 class 属性都指向同一个类, name 为这个类起了两个动作别名: test 和 my。在动作 my 中,使用了 method 属性指定要要运行的方法名为 my。在 MyAction 类中必须要有 my 方法
package action;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport{
......
public String execute() throws Exception {
// 处理 test 动作的代码
}
public String my() throws Exception {
// 处理 my 动作的代码
}
......
}
除了在我们的这个变化之外呢,我们的请求的url也要变化啦
actionName!method.action
在 action 标签中我们还可以传递参数给我们的实现的类中,有点类似spring的方法注入差不多,我们在Action的实现类中就可以通过设置属性的get/set方法获取这个值得,然后在执行具体的方法的时候就会有值了。有点类似我们表单中传入的参数,直接入住到了我们的Action实现类中,这样讲起来估计比较的绕口。例子一出来你估计就会懂了
<action name="submit" class="action.MyAction"><param name="param1">value1</param><param name="param2">value2</param><result name="save" > /result.jsp</result>
......
</action>
package action;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport
{private String param1;private String param2;public String execute() throws Exception {System.out.println(param1 + param2);}public void setParam1(String param1) {this.param1 = param1;}public void setParam2(String param2) {this.param2 = param2;}......
}
看起来你懂了吧,就是个设置个参数的值而已嘛,当 struts2 在调用 execute 之前, param1 和 param2 的值就已经是相应参数的值了,因此,在 execute方法中可以直接使用 param1 和 param2。
Result的配置
在默认时, 标签的 type 属性值是“ dispatcher”(实际上是转发, forward)。开发人员可以根据自己的需要指定不同的类型,如 redirect、 stream 等。如下面代码所示:
<result name="save" type="redirect"> /result.jsp</result>
如果第一个 result 的属性省略了name没得, struts2 默认会把当作“ success”。
这此 result-type 可以在 struts2-core-2.0.11.1.jar 包或 struts2 源代码中的 struts-defaul这个文件中找到标签,所有的 result-type 都在里面定义了。代码如下:之前我也贴过这个代码的,非常的多,就和过滤器差不多,把文件通过不同的type,进行不同的处理工作,达到我们的目的就好了,这个样子比较的饿方变我们去实现这样的事情的
如下:继续贴,看到懂我
<result-types><result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/><result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/><result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/><result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/><result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/><result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/><result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/><result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/><result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/><result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /><result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" /></result-types>
难道就没有感受到?我们处理完了result,之后通过ActionInvocation继续进行拦截器的处理的意义,就在这里的吧,嘿嘿!哈哈如果我们把SSH作为android客服端的服务器,经常处理Json数据是很正常的吧,也是通过这里进行设置的,百度很多都有教程的,有兴趣的朋友可以进去看哈这个效果到底是怎么回事呢?
有很多时候一个被很多使用,这时可以使用 < global-results>标签来定义全局的< result >所有的地方都是可以调用的
代码如下方所示。
<global-results><result name="print">/result.jsp</result>
</global-results
只要你有返回值,是这里面有定义的东西,就可以直接使用的。
前提是。如果< action >中没有相应的< result>, Struts2 就会使用全局的< result>。就和我们的子类和父类的关系差不多。
拦截器配置
Struts2 的拦截器和 Servlet 过滤器类似。在执行 Action 的 execute 方法之前,Struts2 会首先执行在struts.xml 中引用的拦截器,在执行完所有引用的拦截器的 intercept 方法后,会执行 Action 的 execute 方法
我们使用的时候如果不自己去定义拦截器的话,在 Action 里面必须最后一定要引用 struts2 自带的拦截器缺省堆栈 defaultStack。
<interceptor-ref name="checkbox"> 使用系统定义好的<param name="uncheckedValue">0</param></interceptor-ref>
<interceptor-ref name="defaultStack">
也可以设置,全局拦截器
<package name="struts-shop" extends="struts-default"><interceptors><interceptor-stack name="myStack"><interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/></interceptor-stack></interceptors>
<default-interceptor-ref name="myStack"/>(这句是设置所有 Action 自动调用的拦截器堆栈)
</package>
<interceptor-stack name="defaultStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="servletConfig"/><interceptor-ref name="i18n"/><interceptor-ref name="prepare"/><interceptor-ref name="chain"/><interceptor-ref name="scopedModelDriven"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="multiselect"/><interceptor-ref name="staticParams"/><interceptor-ref name="actionMappingParams"/><interceptor-ref name="params"><param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param></interceptor-ref><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="workflow"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="debugging"/><interceptor-ref name="deprecation"/></interceptor-stack>
我们其他的地方要使用这个拦截器,直接继承这个包就行了,非常的方便的改写。默认的堆栈拦截器
<package name="LogonAdmin" extends="struts-shop"> (这里扩展 struts.xml 里面定义的配置就,默认的调用我们的拦截器
可以了)
<action name="logon" class="logonAction">
......
</package>
引用名既可以是拦截器名也可以是栈名。
由于 struts.xml 文件是自上而下解析的,所以被继承的 package 要放在继承 package 的前边。Namespace将 action 分成逻辑上的不同模块,每一个模块有自己独立的前缀。使用 namespace 可以有效的避免 action
重名的冲突,例如每一个 package 都可以有自己独立的 Menu 和 Help action,但是事项方式各有不同。Struts2 标签带有 namespace 选项,可以根据 namespace 的不同向服务器提交不同的 package 的 action 的
请求。“ /”表示根 namespace,所有直接在应用程序上下文环境下的请求( Context)都在这个 package 中。查找。“”表示默认 namespace,当所有的 namespace 中都找不到的时候就在这个 namespace 中寻找。
有些时候我们想指定一个 Action 的多个方法,我们可以做如下两步:
A 建立一些 execute 签名相同的方法,例如:
Public String forward() throws Exception
B 在 Action 配置的时候使用 method 属性。这个我之前也是提到过的吧。
<action name="delete" class="example.CrudAction" method="delete">
这样就行了,访问的时候加个!号就行了。HelloWorld!delete.action
还有一个type属性,我们该怎么处理呢?看我的系统配置文件,其实就是过滤器,把返回的东西处理哈哈,这个就是为什么,返回了还有拦截器的意思。
<result-types><result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/><result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/><result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/><result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/><result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/><result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/><result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/><result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/><result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/><result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /><result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" /></result-types>
今天写了好多哦,都是些基础的东西,慢慢的学习不急不急。。。。。
最后还有个通配符,其实就是和上面的method属性一样的多了些好玩的东西,看起来更特别
统配的链接
没啥子难得懂得东西,慢慢学啦,走跑步去了,大三狗还要去阳光长跑,不容易啊!
这篇关于码农小汪-struts2学习4-struts.xml 常用配置解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!