您的位置:首页 > 编程语言 > Java开发

码农小汪-struts2学习4-struts.xml 常用配置解析

2016-03-25 16:03 609 查看
都是简单的基础,不懂又不行!还是来简单的说一下子

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属性一样的多了些好玩的东西,看起来更特别

统配的链接

没啥子难得懂得东西,慢慢学啦,走跑步去了,大三狗还要去阳光长跑,不容易啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: