假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...

Struts2教程3:struts.xml常用配置解析

上一篇 / 下一篇  2008-04-16 16:34:10 / 个人分类:struts2

查看( 240 ) / 评论( 3 )
本文为原创,如需转载,请注明作者和出处,谢谢!ITPUB个人空间*G3Ra8G$sjF

4I{^ j T0在本文中将详细讲述struts.xml文件的常用配置及注意事项。
|~%y1z%w;~7e0ITPUB个人空间Y!vWT:AD
1.    使用<include>标签重用配置文件
Z4}(TXv qGz;V0ITPUB个人空间(ocO\#C9fj8R
在Struts2中提供了一个默认的struts.xml文件,但如果package、action、interceptors等配置比较多时,都放到一个struts.xml文件不太容易维护。因此,就需要将struts.xml文件分成多个配置文件,然后在struts.xml文件中使用<include>标签引用这些配置文件。这样做的优点如下:
4g%MVU6@:H`'r0(1)    结构更清晰,更容易维护配置信息。
Q{K&[9~hZ*r0(2)    配置文件可以复用。如果在多个Web程序中都使用类似或相同的配置文件,那么可以使用<include>标签来引用这些配置文件,这样可以减少工作量。
H$q-xHO1Y3xC)J aC0ITPUB个人空间!ch!N"nzI^1t0z:m
假设有一个配置文件,文件名为newstruts.xml,代码如下:
aFe'cZDD4|0ITPUB个人空间So$_F&IE%A9h2h
<?xml version="1.0" encoding="UTF-8" ?>ITPUB个人空间xgq?wk5a
<!DOCTYPE struts PUBLICITPUB个人空间 CK8oE Rw0u\
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"ITPUB个人空间dJ7~n$j3O*F
    "http://struts.apache.org/dtds/struts-2.0.dtd">ITPUB个人空间$iqL^ i3s)g!o+bm
<struts>ITPUB个人空间"{y1D&~Y }
    <package name="demo" extends="struts-default" >ITPUB个人空间6Nz7e;\6u%t.pQ
        <action name="submit"  class="action.MoreSubmitAction">ITPUB个人空间,Ec8Ys5wQ_"a-|
            <result name="save" >
!jxZMT G-k0                /result.jspITPUB个人空间'X"[ Q.C ^
            </result>ITPUB个人空间PF]u6c4yO
            <result name="print">ITPUB个人空间^W;G9fh r q
                /result.jsp
L+w-N$W x0            </result>ITPUB个人空间&I\$QNN+R,d0g Q6oSp
        </action>            
D^&s9D9Do'P}+h^cT0    </package>    ITPUB个人空间s~5v%V7b!R
</struts>ITPUB个人空间t'kF+[X

.z(M.B9uM M0    则struts.xml引用newstruts.xml文件的代码如下:ITPUB个人空间t Ga,fT)D'IT
ITPUB个人空间o,b3|3tD#HU'S S~
<?xml version="1.0" encoding="UTF-8" ?>ITPUB个人空间%W g?#| q2?;Y q
<!DOCTYPE struts PUBLIC
+s'bq!Tob0    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4J0~hB!C2^Z#rF0    "http://struts.apache.org/dtds/struts-2.0.dtd">
1qkqK7hR8c0<struts>ITPUB个人空间ggL.^@h
    <include file="newstruts.xml"/>ITPUB个人空间lL.B.{HJE1~?0p
    <package name="test" extends="struts-default">
J zE b\W"b)K0    ... ...ITPUB个人空间h\3~C m8?*v
    </package>    ITPUB个人空间1s(Q~E?;@
</struts>
I I;Spz J*A P0
4R8Z%R*eMb%}0大家要注意一下,用<include>引用的xml文件也必须是完成的struts2的配置。实际上<include>在引用时是单独解析的xml文件,而不是将被引用的文件插入到struts.xml文件中。ITPUB个人空间6G:E4k0bWSG

:F-@8Gh$fN02.    action的别名ITPUB个人空间$S2L,K[4O"]T$X"r |

1\Bms.H-d!W0在默认情况下,Struts2会调用动作类的execute方法。但有些时候,我们需要在一个动作类中处理不同的动作。也就是用户请求不同的动作时,执行动作类中的不同的方法。为了达到这个目的,可以在<action>标签中通过method方法指定要指行的动作类的方法名,并且需要为不同的动作起不同的名子(也称为别名)。如下面代码所示:
(bDxU/{0ITPUB个人空间7ce2N*G(u ^
<?xml version="1.0" encoding="UTF-8" ?>ITPUB个人空间j|{0D/o
<!DOCTYPE struts PUBLIC
C\5H%c%e/_F1V0   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
9mPR*E A [J0   "http://struts.apache.org/dtds/struts-2.0.dtd">ITPUB个人空间x;TK?gd
<struts>
L8D(g8M;BQU0<package name="demo" extends="struts-default" >
&}Z/F)I h6E9R6h9m]m0    <action name="test"  class="action.MyAction">
?#t;SfO2b0H8m J0       ... ...
6I yx#e aa%u'tW4x0    </action>            ITPUB个人空间C$l,k"w D4@Qm
    <action name="my"  class="action. MyAction" method="my">ITPUB个人空间2o^X'Q-R
        ... ...
.t]6v)Dh0    </action>            ITPUB个人空间R g5e2IN
</package>    
|2LBZ_ pa"i0</struts>ITPUB个人空间Y*YH4h(GQ K9d0hI
ITPUB个人空间JZS)SVc
上面代码的两个动作的class属性都指向同一个类,name为这个类起了两个动作别名:test和my。在动作my中,使用了method属性指定要要运行的方法名为my。ITPUB个人空间5V9mW0s#qp
    在MyAction类中必须要有my方法,代码如下:
])V7[*au/@0
3nx#] E2X `5h0package action;ITPUB个人空间2y\;D4qa{qFC

}#g*g'x,R/krK#u0import com.opensymphony.xwork2.ActionSupport;
V;E_^$I2l0ITPUB个人空间\l4u"]1l2id2ob
public class MyAction extends ActionSupportITPUB个人空间gRp`px
{ITPUB个人空间CuzkG
    ... ...ITPUB个人空间9p+zB n"F\h){1K
    public String execute() throws ExceptionITPUB个人空间Q!i u6M$to!_ [
    {ITPUB个人空间|fJ,?%F
        // 处理test动作的代码ITPUB个人空间agq-ez,}jc'CQ
    }ITPUB个人空间6E+FO"a[f3Kt [d%h
    public String my() throws Exception
(Mf,j%FZq0    {ITPUB个人空间 v4I jp|
          // 处理my动作的代码ITPUB个人空间,_;n,oc)z*`
    }ITPUB个人空间e9bUfsyz
    ... ...ITPUB个人空间 E)mX#JR6Tun9v
}
3x^D2|k;p5^0
Xx^e pM"_0除了在struts.xml中配置别名,还可以通过请求参数来描述指定动作(并不需要在struts.xml中配置)。请求参数的格式如下:ITPUB个人空间R k4Du/om%A{0[B]x
http://localhost:8080/contextPath/actionName!method.actionITPUB个人空间-ahb4W8V1M

2V2TX(I2KS`?0关于通过请求指定动作的详细内容,请参阅笔者写的《Struts2教程2:处理一个form多个submit》。ITPUB个人空间3`0NAC1^hZ

!Ti,z v L(|03.    为action指定参数ITPUB个人空间W#Cn\ w
ITPUB个人空间'}CE8y]y5u
在struts2中还可以为action指定一个或多个参数。大家还记着struts1.x是如何设置的action参数不? 在struts1.x中可以使用<action>标签的parameter属性为其指定一个action参数,如果要指定多个,就只能通过逗号(,)或其他的分隔符将不同的参数隔开。而在struts2中可以通过<param>标签指定任意多个参数。代码如下:
B]r~7b%v}G%n:D9A0ITPUB个人空间 nAt2O w
<action name="submit"  class="action.MyAction">
v w"~+h3}0<param name="param1">value1</param>
e1c%\ aff*rN0<param name="param2">value2</param>ITPUB个人空间j#yw(U FmP[ z4q/p
    <result name="save" >ITPUB个人空间7}~L5j?4BUN~
        /result.jspITPUB个人空间:o'M/kaB
    </result>
+p!dB{0oG0    ... ...
k(jh%Ap*e%~-P0</action>        
b0}8T:x!_})d0ITPUB个人空间{i r)x"o M
    当然,在action中读这些参数也非常简单,只需要象获取请求参数一样在action类中定义相应的setter方法即可(一般不用定义getter方法)。如下面的代码将读取param1和param2参数的值:ITPUB个人空间J*ds1j9sM
ITPUB个人空间0`6@a6m K
package action;ITPUB个人空间,Hhx}TG
ITPUB个人空间$pce0h7S,\
import com.opensymphony.xwork2.ActionSupport;ITPUB个人空间3LRx5J c$t
ITPUB个人空间@ M'Q+K0^;f?
public class MyAction extends ActionSupport
b4ql\b:K0^2GD0{
Mi:c5\Y5e[ N%~]0private String param1;ITPUB个人空间T"C:i5s#e:yZ$nD
private String param2;
'jq(x r5Ga0
%y/If-iT7iN6K0public String execute() throws Exception
-]xG"O5iTg0    {ITPUB个人空间-C1q{4FY0x"b
        System.out.println(param1 + param2);ITPUB个人空间.\+fV$~*J"d8^
    }ITPUB个人空间s;PZ;DZc%k,__)^ m
ITPUB个人空间L#s/O(`)XE"S8s5o

Zjw }vt}0public void setParam1(String param1)
{xi!}!R1A!z0{
1OAw;|As}/M0    this.param1 = param1;ITPUB个人空间l.a,i}*bs
}ITPUB个人空间f2t9{:o&W@
public void setParam2(String param2)ITPUB个人空间 e_fl;rm"d6|
{ITPUB个人空间;yWt0ce$W
    this.param2 = param2;
s#y*[Qo$N0}ITPUB个人空间c/O,Ld(qS/dd
    ... ...
:|;W7Pz~%gn0}
#aZ RZ$E0ITPUB个人空间Wd!s;gRY
    当struts2在调用execute之前,param1和param2的值就已经是相应参数的值了,因此,在execute方法中可以直接使用param1和param2。ITPUB个人空间?a-MX'^(B!|*{[
ITPUB个人空间Cyyj~jOL
4.    选择result类型
a0|I.E5]0FC { Ex0ITPUB个人空间8xzPCs0w
在默认时,<result>标签的type属性值是“dispatcher”(实际上就是转发,forward)。开发人员可以根据自己的需要指定不同的类型,如redirect、stream等。如下面代码所示:ITPUB个人空间|7x+YX_
ITPUB个人空间9y.a8S6`s:Ir,i~
<result name="save"  type="redirect">ITPUB个人空间^:S'k g} zrC
    /result.jsp
#r^~(n d]1S*M y0</result>ITPUB个人空间%jI-q&B*G/r2xW
ITPUB个人空间1fv-sD k!~
这此result-type可以在struts2-core-2.0.11.1.jar包或struts2源代码中的struts-default.xml文件中找到,在这个文件中找到<result-types>标签,所有的result-type都在里面定义了。
!^|/} piJ$K3b0
NY$U#_(GIK!r05.    全局result
6GbLL9CoWz)F0ITPUB个人空间&B(S]o4IA%W
有很多时候一个<result>初很多<action>使用,这时可以使用<global-results>标签来定义全局的<result>,代码如下:ITPUB个人空间:i4ho-UU|2T

"KgK(~ n9{0<struts>ITPUB个人空间6s,U:fP4y,]%|1XE;T
    <package name="demo" extends="struts-default">ITPUB个人空间#Yg2q2Uoq i VA
        <global-results>ITPUB个人空间'w;Ap uUd Z
            <result name="print">/result.jsp</result>
6S6Omz/x6Jp$Z0        </global-results>ITPUB个人空间-P/rW;lq0b2y p+{.R
        <action name="submit" class="action.MoreSubmitAction">ITPUB个人空间 ^6~!k[d"J0u
        ... ...
;~&O3hFH/Y){ ]k0        </action>
o?x;[ yTq6i0        <action name="my" class="action.MoreSubmitAction" method="my">
Q'h1["yI0        ... ...
:sf-V&q}`0        </action>
^mT ^#h8f'@3E0    </package>
l}l~eI.[3lM7A0</struts>ITPUB个人空间\#ZStT ]*i

+^OM,\&WY0    如果<action>中没有相应的<result>,Struts2就会使用全局的<result>。
4Cssww)G6YYd0ITPUB个人空间.J&kGSN5xZ

TAG:

Sky-Tiger的个人空间 Sky-Tiger 发布于2008-04-16 22:05:05
GOOD!
lu_pp发布于2008-04-16 23:19:37
提点意见,绿色看的很晃眼
向来自遥远星系的勇士致敬 银河使者 发布于2008-04-17 13:04:44
这个从我另一个blog里copy的,不知怎么就变成green了

我来说两句

(可选)

日历

« 2008-07-25  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 8167
  • 日志数: 101
  • 建立时间: 2008-02-08
  • 更新时间: 2008-07-21

RSS订阅

Open Toolbar