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

使用Netbeans开发Seam应用(一)

上一篇 / 下一篇  2008-05-06 19:33:04

查看( 18 ) / 评论( 0 )
Seam是一个挺不错的框架,但是用netbeans来开发它,却有点难度,因为目前netbeans没有seam插件,不像Eclipse有jboss 提供的官方插件,但是插件是死的,人是活的,它要能跑起起来,一定有它的配置,下面我们就用netbeans做为IDE来开发一个seam的应用.ITPUB个人空间n:|CN aM9PY
ITPUB个人空间7w9@4J+e"M&{!X0x(gl
当然,我们还有另外一个方法,那就是利用seam自带的seam-gen工具,生成一个工程的框架,然后可以用netbeans打开,但是有一些不太好的地方,那就是所有的工程内容都混到一起去了,WEB的工程和EJB的工程都在同一个工程下面,并且由于是基于ant的,所以工程的目录看得可能不太习惯. 但它也有一个好处,那就是它会为你生成各种必须的配置文件,而不需要手工的编写,但是它的坏处就是,如果你后面想要添加EJB或者添加网页内容,就不太方便了,因为目录的组织是怪怪的,不是标准的Netbeans工程组织方式,所以我还是觉得自己建标准的netbeans工程,然后手工添加这些配置文件, 并且这些配置文件也不一定需要自己全部手工编写,完全可以复制过来,然后在一些细节的地方改动一下就可以了.并且配置好以后,要添加工程内容,就可以完全按照netbeans标准工程的方式来添加了.ITPUB个人空间mG+B2i$D

fZh$u i D0 由于自己也是前几天接触的seam,所以错误之处难免,还望大家指出.
0Qtw:W1k(|CU0 ITPUB个人空间+Q2cf2\&d7}?V [
首先我们说一说周边的东西,那就是要添加哪些配置文件,配置文件大概是什么内容,以及各个工程都需要哪些库,这些是基础,也是很重要的,否则布署工程的时候就会出现一大堆的错误.
_k2yOm4S0 在正式工作之前,先准备好要用到的工具,我这里的工具列表如下:ITPUB个人空间;@XZ7MlY W&P
1,Netbeans6.1,可以到http://www.netbeans.org下载,下载的时候,选择下载全部的版本,也就是最大的那个版本.ITPUB个人空间8ICj!{~T
2,Jboss-4.2.2.GA,可以到http://www.jboss.org下载.
/v|,g)x+w? G`0 3,Jboss-seam-2.0.1.GA,也可以到http://www.jboss.org下载ITPUB个人空间Pa7~r'T.t(p
以上具体地址我就不给了,可以自己到首页上去找,这个应该不难吧.
-}f1ZL:V w9L ^0 至于richfaces就不用准备了,seam里面都带了,什么spring,hibernate等等,它里面都有自带.ITPUB个人空间H,? D7M0_"[

2fg%UIt0 本文的流程如下,先是大概介绍每个工程的配置文件有哪些,以及它们需要哪些库文件,然后才真正写一个示例程序,所以前面的配置文件内容仅供参考,让我们知道,里面包括了哪些元素,因为实际的工程和它不一定是一样的.ITPUB个人空间1u @$w1v"U4T2I e
ITPUB个人空间#k^rA8Ogi4V4E H'?
准备工作做好以后,就可以开始了,打开我们熟悉的Netbeans,选择新建工程,然后选择新建Web工程,在建WEB工程的时候, 不要选择使用任何框架,因为现在还没有seam的netbeans插件,所以,一切的配置都得靠手写.建好了WEB工程以后,在WEB-INF文件夹下面添加如下文ages.xml,components.xml,faces-config.xml,而web.xml是我们本来就有的,但是我们要修改一下里面的内容,好让它可以配合seam框架运行.更改好的web.xml内容大致如下:
;b ^bYe8H0 如果你的WEB容器支持JAVAEE5,则下面的web-app version就可以等于2.5了,如果是支持J2EE1.4的,那么就要把它改成2.4的版本,建议是利用netbeans生成的web.xml基础上改,也就是只改内容,而不改xml的头部说明,也就是下面的web-app部份,一般不要去改,我们只改动里面的元素而已.ITPUB个人空间#v)V!w5d)hAz
<?xml version="1.0" encoding="UTF-8"?>ITPUB个人空间7T S'_4z Q@Sf
<web-app version="2.5"ITPUB个人空间s[.k,v7Z Saj
    xmlns="http://java.sun.com/xml/ns/javaee"ITPUB个人空间T!tE4[;D]Sa5?
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
ho;r [z~0     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
(Sf0eh6m4mDqmp0 ITPUB个人空间;[1_,WZ8U
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
4A0B't%@a1e?0    
+Lt(R"`W-lD G9i+}0     <display-name>Test</display-name>ITPUB个人空间(v!I cyeJB
    ITPUB个人空间1c#qZ S'I0C"^v }a
    <!-- Seam -->
esO,} W0      ITPUB个人空间:F7Qxy*o&DK5G_F
    <listener>
x~(h(s N&R1T/\0         <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
8c%B T6Kk4x#Y~0     </listener>ITPUB个人空间,R5P0hD)d%v
    ITPUB个人空间%W6fir+n
    <servlet>ITPUB个人空间G]9cn.\Zay.Q
        <servlet-name>Seam Resource Servlet</servlet-name>
+`$d*M ?D,g)A1X0         <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>ITPUB个人空间Ik$\[cO
    </servlet>ITPUB个人空间\/V6DvI#MU
    ITPUB个人空间T fYo^1GXN+jQ
    <servlet-mapping>ITPUB个人空间.d~!i{(op"F
        <servlet-name>Seam Resource Servlet</servlet-name>ITPUB个人空间.|9S5d;{d4LZ;d[ GJt
        <url-pattern>/seam/resource/*</url-pattern>ITPUB个人空间yG3S,|} pO
    </servlet-mapping>ITPUB个人空间cb.g V6V lF wS
    ITPUB个人空间#Lua6N*Q4o,q
    <filter>
*@ gV%d5S,\)e|$d.m0         <filter-name>Seam Filter</filter-name>
._X w:jE6T0         <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
e]o$uLA0     </filter>
1H:H ^\1I;L J\N N0 ITPUB个人空间 gl4S/n])l7p${L
    <filter-mapping>ITPUB个人空间 Zaf]j![|.X
        <filter-name>Seam Filter</filter-name>ITPUB个人空间({Yy*_Jk+y
        <url-pattern>/*</url-pattern>
sA'm'k/IJ3L Z0     </filter-mapping>ITPUB个人空间[9E ]!]R$s
   
*l MY8h mgy2{O0     <!-- 这里用了facelets的技术,我们的例子里面没有用到 -->
2Z x rq*h$J0     ITPUB个人空间c,KE0D0Lnv
    <context-param>ITPUB个人空间/[e.d#c9sUdr
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
/e`[.s d;Y9Q0e9N0         <param-value>.xhtml</param-value>
!u8J9@ O)_)V(x7T0     </context-param>
S@ e4bqs(P1e0 ITPUB个人空间T]N3\e.w
    <context-param>
.m4[Z(v'o[ qB0         <param-name>
)T U2V)?K-LX)N0             javax.faces.STATE_SAVING_METHODITPUB个人空间%P"s4m2O0o
        </param-name>
}${ Xy/{+Im0         <param-value>server</param-value>
4Yx9d0jw0     </context-param>
6n:X[3zo$mm:L1}$W0 ITPUB个人空间 J0r'u(w"A4O$~Q \
    <context-param>ITPUB个人空间o\7}~,z%m+y!i F
        <param-name>facelets.DEVELOPMENT</param-name>
+U9K#i3C uor0         <param-value>true</param-value>
9[0\Z ?"h0     </context-param>ITPUB个人空间$r5\7l#w#Rs{%z;Q1v
    ITPUB个人空间Z:F+Y7q)b.Q@'s3ns*B
    <servlet>
BI5F\p\$t0         <servlet-name>Faces Servlet</servlet-name>
-q HUnT d0         <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
8d8yxdkg1W$L$I.Es0         <load-on-startup>1</load-on-startup>
AW+t!Q)[U'`Gy.t:@A"[0     </servlet>
T5h@b(v3?Uc0    
VV)SA2s _0     <servlet-mapping>ITPUB个人空间"kg1vXra
        <servlet-name>Faces Servlet</servlet-name>
Q+TU3F$S P0         <url-pattern>*.seam</url-pattern>ITPUB个人空间)X|3I_Vh z
    </servlet-mapping>ITPUB个人空间"S"usy%g Oq'jE"X
ITPUB个人空间6sH(g"GqI!x'A?
    <session-config>
,j*MTF3m.]$X8E0         <session-timeout>10</session-timeout>
;SE lc4KY0     </session-config>   
d7L rPM0~p0     ITPUB个人空间 W*sg1h!?q?z
</web-app>
%ceK4[xI9Iw&Lf0
:s)_^i.G-Y;J!Ywy;X0 在添加其它三个文件的内容之前,先说一下那三个文件是干什么用的,首先components.xml,这个文件里面写的是seam组件的配置,它是必不可少的,一般来说,它可以放在很多地方,但是最好还是放在WEB-INF下面,下面来看看它里面的内容:ITPUB个人空间.al tJ8x{

uU S3w^0 <?xml version="1.0" encoding="UTF-8"?>ITPUB个人空间2j'mUQF9~Y&_4\M
<components xmlns="http://jboss.com/products/seam/components"ITPUB个人空间![ sGe%U/T
            xmlns:core="http://jboss.com/products/seam/core"
+x2z hX6M8ZZ0             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
_ oM1O~6q%Y)q0             xsi:schemaLocation=
-c:B GXat0               "http://jboss.com/products/seam/coreITPUB个人空间F!Dd:H2d*g S1h D
               http://jboss.com/products/seam/core-2.0.xsdITPUB个人空间'z:\)[$g/F
               http://jboss.com/products/seam/componentsITPUB个人空间+K;L1Zrz&n8s/i
               http://jboss.com/products/seam/components-2.0.xsd">
H#sh^.@U5S4C(^0     <core:init jndi-pattern="Seam6/#{ejbName}/local" debug="true"/>ITPUB个人空间BRd#Kt*g9c7P]
    <core:manager conversation-timeout="120000"/>
i9C;E!HeP0 </components>ITPUB个人空间1PTzx(^M,k
ITPUB个人空间+a u$JA&t}W0I u~
上面的配置几乎是最简单的配置,它给出了查找EJB的时候,JNDI的形式,以及对话(conversation)的超时时间.
L!? Z#H,]f"q0 然后我们再来看faces-config.xml,它是标准的JSF的说明文件,但是它在SEAM里面并没有完全起到在JSF里面的作用,在JSF里面, 它定义backingbean,并且定义导航规则,但是在SEAM里面,它总是很小,backingbean不需要在这里定义了,因为在SEAM里面,我们可以把EJB做为backingbean,并且用注释的方式来指定它的名字以及范围,另外一个,导航规则也不用在这里定义了,我们可以用另外一个专门的文件来定义,那就是pages.xml,所以在SEAM的应用里面,虽然用到了JSF的技术,但是JSF的主要配置文件faces-config.xml 却不用怎么配置了,当然,你也可以在这里面配置导航规则,只有当我们使用了facelets技术以后,才确定要在这个文件里面配置一些东西,否则,这个文件空在那里也没什么关系,facelets是SEAM框架里面推荐使用的技术,当然,我们也可以不用,也可以只用JSF,如果我们使用facelets的话,就需要要faces-config.xml里面添加如下的声明以支持facelets:
[2q;wcqJ0m#j4x7U0 <?xml version='1.0' encoding='UTF-8'?>
p4fA1d D6S W0 <faces-config version="1.2"ITPUB个人空间uN!Fmcy&u|0u
              xmlns="http://java.sun.com/xml/ns/javaee"ITPUB个人空间 w.Bdvh*\#m8f
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"ITPUB个人空间3T(m5Y8J Az H
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
8NXK(BM4{ML/q0
*vZ p4\d*{*O'|G0 http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">ITPUB个人空间*J!ns xP'W9S}O
   
:n4No U"g~ alr6{0     <application>
O4WS Hl#i0         <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>ITPUB个人空间'_ f1k.Q+kT'd
    </application>ITPUB个人空间Z1L[k8hKz nd
ITPUB个人空间*J&H$H_B/`}
</faces-config>
2Qrwd%O;b4o$u Q |2M0
G0j0euE }:t0 最后我们再来看pages.xml,它是定义页面之间的导航规则的,这个文件是可有可无的,SEAM启动的时候,会找这个文件,找到了就读里面的配置,找不到也没关系,就当什么也没有发生.ITPUB个人空间7hX#^Wt;v%O
它的大概内容如下:ITPUB个人空间1~p1JXu-Gp

-sC"SzY7mGU0 <?xml version="1.0" encoding="UTF-8"?>ITPUB个人空间^s(pVf%{{l1g y3x
<pages xmlns="http://jboss.com/products/seam/pages"ITPUB个人空间3cI#A\ H+v'QSx_
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
P/Jj"\PwHqv0        xsi:schemaLocation="http://jboss.com/products/seam/pages ITPUB个人空间6W6D3Es4{X~

6H/Kx&Hd)cT s&`$i%F5I0 http://jboss.com/products/seam/pages-2.0.xsd"
3u0h[$ZP2w%f0 ITPUB个人空间8\/U5dm;qMT{
       no-conversation-view-id="/main.xhtml"ITPUB个人空间)Q8ja8{"IpV,n
                 login-view-id="/home.xhtml">
`P xSu0
WcnV&RA+uugW0     <page view-id="/register.xhtml">ITPUB个人空间1z ~+tngn
   
O-U3_6gs\6b0         <action if="#{validation.failed}"ITPUB个人空间 MasC[
           execute="#{register.invalid}"/>ITPUB个人空间)c}X.W!E Y3Y
    ITPUB个人空间8m_@,g3AN'zA
        <navigation>ITPUB个人空间*oCu&}U)XK _)Z}
            <rule if="#{register.registered}">ITPUB个人空间Q"}8cf$a0C
                <redirect view-id="/home.xhtml"/>
\tXp5C3s0             </rule>
M5O0qq L.^0         </navigation>
:JoN6L}(]`0         
~)y}f`F;kB?zr.p0     </page>
w5{7MOR0 ITPUB个人空间:?MI6o!f7X~
    <page view-id="/home.xhtml">ITPUB个人空间lY ^ Wt%W0r
   
X-j"\ X6q g0         <navigation>ITPUB个人空间{%^m} d`"f
            <rule if="#{identity.loggedIn}">ITPUB个人空间~ k]:urF+f
                <redirect view-id="/main.xhtml"/>ITPUB个人空间&Cg,]:E4U[hF
            </rule>
&Cn0Q$b4j;VyN0         </navigation>
#jtI{&j7Y0         
~NX/~2bwF0     </page>ITPUB个人空间;D s3z5``u6l0}8V*w
   
^?}.m#PnO0     <page view-id="/password.xhtml"
xHg#ADE&bz1N D/Q~T0           login-required="true">
3n5|4s w'r$o |_'M,y0     ITPUB个人空间!U2^Kw7r&w
        <navigation>
8e+K8T/RG5_!T0             <rule if="#{changePassword.changed}">
Me'zwn.G6FD+U0                 <redirect view-id="/main.xhtml"/>
(B"`sT-sXr0             </rule>
9PfVT$k"M5z2R$uT0         </navigation>ITPUB个人空间8B K%l?*y*c!J2}9Y
        ITPUB个人空间*i;QE-u3ZkYp
    </page>ITPUB个人空间z-P\Qb\+n

?{8F4X Qfo0     <page view-id="/main.xhtml" ITPUB个人空间qA(m%~6seA
          login-required="true">
C:pE N I0    
(?,Hz M:Q/E0         <navigation from-action="#{hotelBooking.selectHotel(hot)}">
5w|m Oh2W3VyY `0{5p0             <redirect view-id="/hotel.xhtml"/>
5kw~X~0         </navigation>ITPUB个人空间dNOD!ou4G
        
6u![&re^3c.M5t0         <navigation from-action="#{bookingList.cancel}">
dY'yb#yJ0             <redirect/>
?Vl5_OQJ0         </navigation>
DM:y-PD0         
1|(S!F D%kUn!J)z0     </page>
+_3[/@8['q`$p)E0     ITPUB个人空间j\h]O+fA,^6y~Z
    <page view-id="/hotel.xhtml" ITPUB个人空间Z hTy zv
          conversation-required="true"
U;S'`Xx0           login-required="true">
'YJjQ+I![0          
#E I\*?T.I Lw/h0         <description>View hotel: #{hotel.name}</description>ITPUB个人空间-o)Qs:}9l`
        
5L3n9g;w Z3|ID3A0         <navigation from-action="#{hotelBooking.bookHotel}">
} |%|OG6h0             <redirect view-id="/book.xhtml"/>ITPUB个人空间}9z`C5y
        </navigation>ITPUB个人空间-{"w6L2i K+SS
        ITPUB个人空间Qv$d$`2H'b
    </page>ITPUB个人空间;@] _H0Ul w8V
ITPUB个人空间1N_!c+Gd
    <page view-id="/book.xhtml" ITPUB个人空间d*| \)^%h:K @
          conversation-required="true"
}:o ZEx$v t0           login-required="true">
(@UuYZdP\&z0          
Bf UU,g?0         <description>Book hotel: #{hotel.name}</description>ITPUB个人空间(G&F.u[n8I}dN
        ITPUB个人空间 y4`n OI4F0f
        <navigation from-action="#{hotelBooking.setBookingDetails}">
8y'II}xxj Y(p0             <rule if="#{hotelBooking.bookingValid}">ITPUB个人空间3F^5R~.yG)W
                <redirect view-id="/confirm.xhtml"/>
%}3sfy-B7q3{f0             </rule>ITPUB个人空间J"\'R P!b4NlB!Y,F
        </navigation>
+r\6z5|P.oyKH0         
h,BV K]*dru0     </page>
?v?)Gw B2a8ZHN0 ITPUB个人空间\mop5|}
    <page view-id="/confirm.xhtml"
8M0Rn`ZFX0           conversation-required="true" ITPUB个人空间SOsY u}w$X
          login-required="true">
"E q I6^ ^J,T.|0          
xA3~*?V(iwv[0         <description>Confirm booking: #{booking.description}</description>
T1[/`*Dk"Hy0         ITPUB个人空间,Om1Kt*E D
        <navigation from-action="#{hotelBooking.confirm}">
r;gF&d(A{ ]7[ez0             <redirect view-id="/main.xhtml"/>ITPUB个人空间N }7Bs ag;d{*f
        </navigation>
BU1P4d(Q)YO hXE0         
C:{*y)R}B/sas9u|0     </page>
!H"PgjMjx2o0    
8AiLg/p*q@0     <page view-id="*">
6l/o9h6m `;`_ tb7j0     ITPUB个人空间~2I?'~ `[-I5n
        <navigation from-action="#{identity.logout}">
1Yb+W%B n$s+c"UZ0             <redirect view-id="/home.xhtml"/>ITPUB个人空间-Z(Z0bb }%Vgv$Sz-I
        </navigation>ITPUB个人空间$f(e o)k2M:M J `3`
ITPUB个人空间&v ~;r*i'X[/L{1Aa
        <navigation from-action="#{hotelBooking.cancel}">ITPUB个人空间7Y})Nf1K
            <redirect view-id="/main.xhtml"/>ITPUB个人空间!C.kM5V!?8|6{5y1F}
        </navigation>
RyI] Gd0         
pT f#nhm6@rA0     </page>
Xx*S)m j*ji'\0    
J4LJ8X8z2\J ^(Z0     <exception class="org.jboss.seam.security.NotLoggedInException">
:OfO4c!q`tEb%Hp0         <redirect view-id="/home.xhtml">
EZ L_m{]0             <message severity="warn">You must be logged in to use this feature</message>ITPUB个人空间3t*uRsA$N9yvbE"s
        </redirect>ITPUB个人空间bD1_8S&e&d.M
    </exception>
Z!K]7S3}:uk0 ITPUB个人空间 j^ }{BfLMr+w$Ua
</pages>
!~}!c$N8{.hDO0
0Q Ob5N1w9zH t0 一般来讲,SEAM可以配合richfaces来使用,这样可以补充标准的JSF组件不足的情况,并且richfaces和seam都是一家产品,所以运用起来可能会方便一些,在做SEAM应用的时候,推荐用richfaces做JSF的组件库,当然,你也可以用别的组件库,如apache的 MyFaces.在配置文件建好模型以后,再为WEB工程添加项目所需要的库,一般来说,需要添加的库如下:ITPUB个人空间8Z OP?+f}
jboss-seam-debug.jar 调试的时候用ITPUB个人空间4n;Erm_ }!e tI
jboss-seam-ui.jar    调用seam的组件,比如<s:validate 等等ITPUB个人空间6WikS(}*q?} f
jsf-facelets.jar     JSF的facelets技术
J)Jub hD Q.A0 richfaces-impl.jar   richfaces的实现库
#lf l ^P[4~0 richfaces-ui.jar     richfaces的UI库ITPUB个人空间!A5{&A.R|K5a
当然,根据不同的应用,可能所要包含的库会有点不同,具体库的依赖性,可以查看SEAM的官方说明.WEB项目的部份大概就这些,下一章,我们再说一说EJB项目的部份.

TAG:

我来说两句

(可选)

日历

« 2008-05-17  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 3859
  • 日志数: 83
  • 建立时间: 2008-02-08
  • 更新时间: 2008-04-25

RSS订阅

Open Toolbar