码农小汪-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>

注意:

  1. 用引用的 xml 文件也必须是完成的 struts2 的配置。实际上在引用时是单独解析
    xml 文件,而不是将被引用的文件插入到 struts.xml 文件中。
  2. struts-default.xml 这个文件被包含在 struts2-core.jar 中,文件名已经可以看出这个文件的作用是
    struts.xml 的默认配置,它将自动被加载后导入到 struts.xml 中去。

action 配置:

  1. 在默认情况下, 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属性一样的多了些好玩的东西,看起来更特别
统配的链接
没啥子难得懂得东西,慢慢学啦,走跑步去了,大三狗还要去阳光长跑,不容易啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值