﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-phyeas-文章分类-Seam项目实战</title><link>http://www.blogjava.net/phyeas/category/36467.html</link><description>我是程序员？我是程序员！</description><language>zh-cn</language><lastBuildDate>Thu, 25 Dec 2008 10:19:33 GMT</lastBuildDate><pubDate>Thu, 25 Dec 2008 10:19:33 GMT</pubDate><ttl>60</ttl><item><title>Seam新手实战(4)：外键</title><link>http://www.blogjava.net/phyeas/articles/248165.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Wed, 24 Dec 2008 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/248165.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/248165.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/248165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/248165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/248165.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;"><br />
</span></div>
<br />
一个图书管理系统中的两个对象：Book(书籍),BookType(书籍类型)。Book和BookType之间是多对一关系。<br />
<br />
说到主从表的关联关系，自然而然地想起的一种实现方式就是选择框，比如在Book的编辑界面是使用一个类型的下拉选择框，选择一个类型，然后保存。于是就有下例代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:selectOneMenu&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="type"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="#{bookHome.instance.bookType.typeId}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:selectItems&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="#{bookTypeList.typeSelectItems}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:selectOneMenu</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"> <br />
</span></div>
这段代码的作者（我）原本的想法是让这个下拉框与bookHome.instance里的<span style="color: #0000ff;">bookType.</span>typeId帮定。比如当前的book类型id是1，修改后将book类型的id改为2，更新到数据库。但是很不幸。这段代码并不能执行预期的行为，或者说它还附加了其他行为。即Seam已经觉察到了在这个book中的类型的一个属性（主键值）已经改变了。于是，试图更新这个类型。但是JPA的规范中是不允许更改主键的，这就引起了一个错误。不信可以试下哦，呵呵。（以上描述我已经尽可能说清楚我的想法，但可能还是不怎么清楚，希望大家看不懂的说说哪里看不懂，我好改正）。我想说的是，不要直接帮定到外键，而是现帮定到一个临时变量，比如在bookHome中多写一个变量：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BookHome&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;EntityHome</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Book</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">{<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Long&nbsp;typeId;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">..getter&nbsp;setter</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">}</span></div>
然后将下拉框邦定到这个变量上，比如：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:selectOneMenu&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="type"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="#{bookHome.typeId}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:selectItems&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="#{bookTypeList.typeSelectItems}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:selectOneMenu</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"> <br />
</span></div>
。然后在重载的persist或者update方法中写上：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">BookType&nbsp;newType&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getEntityManager().find(BookType.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;typeId);<br />
instance.setType(newType);<br />
return super.persist();<br />
</span></div>
就完成了。我叫它&#8220;转移邦定&#8221;，呵呵<br />
<br />
Seam的解决方案：<br />
其实Seam有另一种解决方案。比如如果你是自动生成代码的方式，在BookEdit.xhtml中就会看到这样的代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="association"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="bookTypeParent"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:outputText&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="There&nbsp;is&nbsp;no&nbsp;bookType&nbsp;associated&nbsp;with&nbsp;this&nbsp;book."</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rendered</span><span style="color: #0000ff;">="#{bookHome.instance.bookType&nbsp;==&nbsp;null}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">rich:dataTable&nbsp;</span><span style="color: #ff0000;">var</span><span style="color: #0000ff;">="bookType"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="#{bookHome.instance.bookType}"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rendered</span><span style="color: #0000ff;">="#{bookHome.instance.bookType&nbsp;!=&nbsp;null}"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowClasses</span><span style="color: #0000ff;">="rvgRowOne,rvgRowTwo"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff;">="bookTypeTable"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:facet&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="header"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">typeId</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:facet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#{bookType.typeId}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:facet&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="header"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">bookType&nbsp;typeId</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:facet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#{bookType.bookType.typeId}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:facet&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="header"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">typeName</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:facet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#{bookType.typeName}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:facet&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="header"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">action</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:facet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:link&nbsp;</span><span style="color: #ff0000;">view</span><span style="color: #0000ff;">="/BookType.xhtml"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff;">="viewbookType"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="View"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propagation</span><span style="color: #0000ff;">="none"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookTypeTypeId"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="#{bookType.typeId}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:link</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">rich:dataTable</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="actionButtons"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:button&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="Select&nbsp;bookType"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span style="color: #0000ff;">="/BookTypeList.xhtml"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="from"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="BookEdit"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:button</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></div>
点击&#8220;Select bookType&#8221;页面就自动跳转到BookTypeList页面，列出所有的类型，每个类型后面都有一个select连接，点击这个连接就可选中这个类型。然后回到BookEdit.xhtml。很Seam很强大吧，呵呵。其实为何这样能完成一个选择都是在BookEdit.page.xml里配置的。配置大概如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">begin-conversation&nbsp;</span><span style="color: #ff0000;">join</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">action&nbsp;</span><span style="color: #ff0000;">execute</span><span style="color: #0000ff;">="#{bookHome.wire}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookFrom"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookBookId"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="#{bookHome.bookBookId}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookTypeFrom"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookTypeTypeId"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="#{bookTypeHome.bookTypeTypeId}"</span><span style="color: #0000ff;">/&gt;</span></div>
<span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">begin-conversation&nbsp;</span><span style="color: #ff0000;">join</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp; ：开始一个</span><span style="color: #800000;">conversation（我暂称之为&#8220;页面流&#8221;）</span>，如果已存在，就加入。而不重新创建。<br />
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">action&nbsp;</span><span style="color: #ff0000;">execute</span><span style="color: #0000ff;">="#{bookHome.wire}"</span><span style="color: #0000ff;">/&gt;&nbsp; ：</span><span style="color: #000000;">一最重要的这个。如果没有执行这个方法这段跳转就没有任何效果了。，先来看下这个方法是怎么写的吧：<br />
<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;wire()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getInstance();</span><span style="color: #008000;">//</span><span style="color: #008000;">获取instance，放在这里是为了加在instance</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookType&nbsp;bookType&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bookTypeHome.getDefinedInstance();</span><span style="color: #008000;">//</span><span style="color: #008000;">获取类型。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bookType&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{</span><span style="color: #008000;">//</span><span style="color: #008000;">如果选择的类型不为null</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getInstance().setBookType(bookType);</span><span style="color: #008000;">//</span><span style="color: #008000;">设置书籍类型</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span></div>
那bookTypeHome从哪来的呢？天上掉下的？呵呵，当然不是。就在BookHome的上部分：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@In(create&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;BookTypeHome&nbsp;bookTypeHome;</span></div>
<br />
前面我说过了。这个@In就是拿来做双向注入的。<span style="color: #000000;">bookTypeHome是要注入的组件名称。</span><br />
其他的都是参数了，没啥好解释的。<br />
但为什么在BookTypeList页面点select，怎么就会自动跳转到BookEdit.xhtml呢？奥秘就在这段代码里（BookTypeList.xhtml）：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:link&nbsp;</span><span style="color: #ff0000;">view</span><span style="color: #0000ff;">="/#{empty&nbsp;from&nbsp;?&nbsp;'BookType'&nbsp;:&nbsp;from}.xhtml"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="Select"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff;">="bookType"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookTypeTypeId"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="#{bookType.typeId}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:link</span><span style="color: #0000ff;">&gt;</span></div>
从BookEdit里传来一个from。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:button&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="Select&nbsp;bookType"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span style="color: #0000ff;">="/BookTypeList.xhtml"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="from"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="BookEdit"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:button</span><span style="color: #0000ff;">&gt;</span></div>
就告诉了BookTypeList，是从BookEdit里来的，点Select的时候就不要去其他地方了。直接回去。<br />
<br />
好了，今天到这，困了，上面讲的不明白的欢迎email或qq联系我。。<br />
<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/248165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-24 23:02 <a href="http://www.blogjava.net/phyeas/articles/248165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(3)：entities</title><link>http://www.blogjava.net/phyeas/articles/247416.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Fri, 19 Dec 2008 15:51:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/247416.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/247416.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/247416.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/247416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/247416.html</trackback:ping><description><![CDATA[对于一个应用来说，实体对象即是这个应用的数据基础，一开始设计都是从数据模型设计开始的。那我们就从这个Seam的entities开始吧。<br />
<br />
在Seam中你有两种方式创建你的实体对象，一是从数据库生成，二是自己创建，再由seam帮你将对应的数据表建起来。从应用的角度来说，两种方式没有啥区别，但从开发的角度讲，推荐使用生成的方式。因为这样可以剩下很多敲代码的时间。呵呵。好戏放后面，让我们先看自己创建entity的过程。<br />
<br />
前提是你的工程已经创建完毕（如何创建过程请看本系列《1》）。<br />
<br />
一般实体类都放在src/model下。便于辨别那些是业务对象，哪些是数据对象（关于Seam的分层网上很多地方有说，这里就不说了）。在src/model文件夹上右键－》new-&gt;Seam Entity。就可以看到如下界面：<br />
<div align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/a.png" width="622" height="273" /></div>
<br />
这里就只需要填写名称即可。解释一下它们的意思：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seam Project:即属于那个工程<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seam entity class name:即这个类的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Package name:属于那个包的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master page name:这个会自动生成的家伙是说你的列表页面和业务动作处理（action）的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Page name：这个也会自动生成，是指明细页面的名称和业务动作处理的名称（两个是相同名称的）<br />
<br />
随便起个名字，点Finish，可能需要等待一段时间，这是因为Seam自动创建了一个xhtml页面，正在试图打开。打开这个东西需要一点时间<br />
创建成功后。在你所选的包下就会多一个类。里面只有三个属性：id,version,name。以我创建的User类为例：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
@Entity<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;User&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">seam-gen&nbsp;attributes&nbsp;(you&nbsp;should&nbsp;probably&nbsp;edit&nbsp;these)</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">add&nbsp;additional&nbsp;entity&nbsp;attributes<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">seam-gen&nbsp;attribute&nbsp;getters/setters&nbsp;with&nbsp;annotations&nbsp;(you&nbsp;probably&nbsp;should&nbsp;edit)</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id&nbsp;@GeneratedValue<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Version<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getVersion()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setVersion(Integer&nbsp;version)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.version&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Length(max</span><span style="color: #000000;">=</span><span style="color: #000000;">20</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
这个类实现自Serializable是因为这个类需要被序列化，当遇到特殊情况时可以起写作用。先解释下这些注解吧。<br />
<span style="color: #000000;">@Entity：标注这是一个实体对象 </span>这是JPA的标记。表明即是类名，当然，你也可以让这两个东西不是对应关系，在<span style="color: #000000;">@Entity下加个＠Table注解即可。比如<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Table(name = "BookType", catalog = "test")</span><br />
<span style="color: #000000;">@Id 主键标识，为了确保对象的唯一性，建议每个entity都加一个主键，否则你就等着出错吧。呵呵<br />
@GeneratedValue&nbsp; 表示主键值为自动生成值<br />
</span><span style="color: #000000;">@Version&nbsp; 这个是jpa的乐观锁机制。有兴趣了解乐观锁及悲观锁的可以看hibernate的资料，篇幅太长，这里就不介绍了。<br />
@Length(max=20)&nbsp; 限制长度为最大20，这个在作验证时有用。<br />
恩。这个实体类就这么简单。呵呵，你还需要其他字段就再加上去吧。。<br />
其实到这个，整个CRUD的页面和处理方法都写好了。这时只要将项目部署到服务器，然后访问列表页面即可。忘了说了，我这里生成的页面是userList.xhtml和user.xhtml。工程名为SeamTest。所以我要访问http://localhost:8080/SeamTest/userList.seam，一个增删改查就出来了哦。还有比这更快的吗。呵呵，现在要在页面上添加东西就照葫芦画瓢。Ctrl+C and Ctrl+v就出来了。如果页面不符合规则，再调也可以，这里简单说下seam的帮定机制，还是已我的user为例：</span><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:inputText&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;required</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="#{userHome.instance.name}"</span><span style="color: #0000ff;">/&gt;</span></div>
<span style="color: #000000;">seam 的帮定机制是根据value进行的。也就是说，无论你的id写的是什么。这个文本框的东西最终都要赋值到name上。这就是seam的邦定机制。这样邦定会有一个问题。等以后介绍，现在先接着看<br />
<br />
生成entities。用数据库表生成entities就更简单了。在src/model文件夹上右键，然后选择new-&gt;Seam Generate entities。会弹出这样的窗口：<br />
<div align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/b.png" width="722" height="317" /></div>
不用修改什么选项，直接finish就可以了。这样entity就会生成了，就连页面什么的都生成了。增删改查也写好了。呵呵，你就做下微调就可以了。这里需要注意的是，你刚刚通过Seam创建的表也被当作普通表生成到你的应用程序里。这样如果你使用的是linux平台，就会多一个UserList.xhtml（刚才那个是userList.xhtml）。如果是windows平台不知道会怎么样哦(windows文件名不分大小写)。<br />
<br />
可能的错误：有几个网友跟我说他们生成entities时发生了错误。错误大意是找不到模板或session包。这个是由于使用的版本太新造成的。JBoss Tools3.0仅支持Seam2.0，不要使用2.1哦。过写时候我把那个错误信息贴上来，供大家参考。<br />
<br />
大概就这些了。有什么问题欢迎讨论。<br />
<br />
</span>
<img src ="http://www.blogjava.net/phyeas/aggbug/247416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-19 23:51 <a href="http://www.blogjava.net/phyeas/articles/247416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(2)：自动生成的代码2-xhtml文件</title><link>http://www.blogjava.net/phyeas/articles/246311.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Mon, 15 Dec 2008 01:15:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/246311.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/246311.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/246311.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/246311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/246311.html</trackback:ping><description><![CDATA[在Eclipse生成的代码中页面是使用facelets、richFaces等编写的，所以页面使用的文件格式是xhtml。而非jsp。当然了，你也可以是用jsp编写。这些生成的xhtml全部都在WebContent下
<p>&nbsp;&nbsp; 首先看home.xhtml。</p>
<div class="highlighter">
<ol class="highlighter-xml">
    <li><span class="tag">&lt;</span><span class="tag-name">ui:composition</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:s</span><span>=</span><span class="attribute-value">"http://jboss.com/products/seam/taglib"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:ui</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/facelets"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:f</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/core"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:h</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/html"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:rich</span><span>=</span><span class="attribute-value">"http://richfaces.org/rich"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">template</span><span>=</span><span class="attribute-value">"layout/template.xhtml"</span><span class="tag">&gt;</span>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">ui:composition</span><span class="tag">&gt;</span></li>
</ol>
</div>
<p>ui:composition元素：UI组件，使用这个元素做根元素表示这个页面并不是一个完整的页面，而是需要一个template页面作为摸版的内容页面。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="attribute">xmlns：根元素命名空间。就是那些不带前缀标签比如&lt;div&gt;</span></p>
<p><span class="attribute">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">&nbsp;</font><span class="attribute"><font color="#ff0000">xmlns:s：Seam元素的命名空间。</font></span></span></p>
<p><span class="attribute"><span class="attribute">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute"><font color="#ff0000">template：摸版页面</font></span></span></span></p>
<p><span class="attribute"><span class="attribute"><span class="attribute"><font color="#000000">摸版页面：</p>
<div class="highlighter">
<ol class="highlighter-xml">
    <li><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:ui</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/facelets"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:h</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/html"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:f</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/core"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:s</span><span>=</span><span class="attribute-value">"http://jboss.com/products/seam/taglib"</span><span class="tag">&gt;</span>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">"Content-Type"</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">"text/html;&nbsp;charset=UTF-8"</span><span>&nbsp;</span><span class="tag">/&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>SeamTest</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">"stylesheet/theme.css"</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">"stylesheet"</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/css"</span><span>&nbsp;</span><span class="tag">/&gt;</span>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:include</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">"menu.xhtml"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"projectName"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"SeamTest"</span><span class="tag">/&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">ui:include</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"body"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:insert</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"body"</span><span class="tag">/&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"footer"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Powered&nbsp;by&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">"http://jboss.com/products/seam"</span><span class="tag">&gt;</span><span>Seam</span><span class="tag">&lt;/</span><span class="tag-name">a</span><span class="tag">&gt;</span><span>.</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Generated&nbsp;by&nbsp;seam-gen.</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span></li>
</ol>
</div>
<p><span>ui:include：与&lt;jsp:include&gt;差不多。但这里没有引入jsp命名空间。所以使用&lt;ui:include&gt;。</span></p>
<p><span>&lt;ui:insert/&gt;：这个是一个template页面。这个标签表示插入一个名为body的内容块。在内容页面--home.xhtml--与此对应的是：&lt;ui:define name="body"&gt;&lt;/ui:define&gt;。在Seam-gen生成的页面中几乎所有的页面都将template指向template.xhtml。还有另一种使用摸板的方式。比如layout/edit.xhtml。</p>
<div class="highlighter">
<ol class="highlighter-xml">
    <li><span class="tag">&lt;</span><span class="tag-name">ui:composition</span><span>&nbsp;&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:ui</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/facelets"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:h</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/html"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:f</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/core"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:s</span><span>=</span><span class="attribute-value">"http://jboss.com/products/seam/taglib"</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"prop"</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:label</span><span>&nbsp;</span><span class="attribute">styleClass</span><span>=</span><span class="attribute-value">"name&nbsp;#{invalid?'errors':''}"</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:insert</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"label"</span><span class="tag">/&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:span</span><span>&nbsp;</span><span class="attribute">styleClass</span><span>=</span><span class="attribute-value">"required"</span><span>&nbsp;</span><span class="attribute">rendered</span><span>=</span><span class="attribute-value">"#{required}"</span><span class="tag">&gt;</span><span>*</span><span class="tag">&lt;/</span><span class="tag-name">s:span</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">s:label</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"value&nbsp;#{invalid?'errors':''}"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:validateAll</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:insert</span><span class="tag">/&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">s:validateAll</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"error"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">h:graphicImage</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"/img/error.gif"</span><span>&nbsp;</span><span class="attribute">rendered</span><span>=</span><span class="attribute-value">"#{invalid}"</span><span>&nbsp;</span><span class="attribute">styleClass</span><span>=</span><span class="attribute-value">"errors"</span><span class="tag">/&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:message</span><span>&nbsp;</span><span class="attribute">styleClass</span><span>=</span><span class="attribute-value">"errors"</span><span class="tag">/&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span class="tag">&lt;/</span><span class="tag-name">ui:composition</span><span class="tag">&gt;</span>
    <li class="alt"></li>
</ol>
</div>
<p>&nbsp;</p>
<p>这里依然是使用&lt;ui:insert /&gt;作为内容页面的插入块。这里有两块&lt;ui:insert /&gt;第一块是有name属性的，第二块则是没有name属性的。如果没有name属性，表示在插入块中没有放在&lt;ui:defind/》里的东西都放在没有name的插入块中。。。比如</p>
<div class="highlighter">
<ol class="highlighter-xml">
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:decorate</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"nameDecoration"</span><span>&nbsp;</span><span class="attribute">template</span><span>=</span><span class="attribute-value">"layout/edit.xhtml"</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:define</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"label"</span><span class="tag">&gt;</span><span>Name</span><span class="tag">&lt;/</span><span class="tag-name">ui:define</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">h:inputText</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"name"</span><span>&nbsp;</span><span class="attribute">required</span><span>=</span><span class="attribute-value">"true"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"#{bookHome.instance.name}"</span><span class="tag">/&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">s:decorate</span><span class="tag">&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>这里&lt;ui:defind name="label"&gt;这就是定义那个有名字的插入块。而接下来的&lt;h:inputText ...&nbsp;/&gt;则是放在了下面没有名字的&lt;ui:insert /&gt;中。上面的代码也展示了使用摸板的另一种方式。使用&lt;s:decorate/&gt;使用摸板块，摸板页面的根需要是一个&lt;ui:composition&gt;元素。s:decorate是一个seam元素。必须在seam的管理的页面中使用。</p>
<p>其他：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; jsf中的form是不需要action的。比如&lt;h:form id="login"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 标签的rendered属性表示在什么情况下显示。html标签没有rendered属性，比如div标签没有rendered。</p>
<p>其他的jsf标签我们可以通过学习jsf学习。因为jsf标签，richFaces标签，faceslet标签太多了。这里就不一一介绍了。。。。大家有什么好的资料也麻烦告诉我哦。</span></font></span></span></span></p>
 <img src ="http://www.blogjava.net/phyeas/aggbug/246311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-15 09:15 <a href="http://www.blogjava.net/phyeas/articles/246311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(2)：自动生成的代码</title><link>http://www.blogjava.net/phyeas/articles/244853.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Tue, 09 Dec 2008 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/244853.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/244853.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/244853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/244853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/244853.html</trackback:ping><description><![CDATA[<p>&nbsp; 创建工程后会生成一大堆代码。基本上都是配置文件。而在做 Seam 开发的过程中是不需要整天修改配置文件的。最多写写pages.xml或者faces-config.xml。Seam生成的文件夹如下面的结构：<br />
<img height="290" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/1.jpg" width="180" border="0" /></p>
其中。build文件夹存放的是Ant编译后的东西。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resources文件夹里就一个文件。XXXX-ds.xml。是用于存放数据源(DataSource)配置文件的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src下有两个文件夹：action和modal。即存放页面动作与领域模型。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在modal中有个META-INF文件夹，JPA的配置文件persistence.xml就存放在这个文件夹里。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Modal文件夹里还有几个值得注意的文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比如messages_en.properties和security.drl。messages_en.properties是存放系统消息的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果想让Seam的系统消息显示中文就需要翻译这个文件。而security.drl则是定义安全规则的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在action文件夹中。有一个包：org\domain\SeamTest\session。其中Authenticator.java会自动生成。用于做登陆验证的。在这里简单介绍下，先看代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">@Name(</span><span style="color: #000000">"</span><span style="color: #000000">authenticator</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Authenticator<br />
<img id="Codehighlighter1_50_408_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_408_Open_Text.style.display='none'; Codehighlighter1_50_408_Closed_Image.style.display='inline'; Codehighlighter1_50_408_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_50_408_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_50_408_Closed_Text.style.display='none'; Codehighlighter1_50_408_Open_Image.style.display='inline'; Codehighlighter1_50_408_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_50_408_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_50_408_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@Logger&nbsp;Log&nbsp;log;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@In&nbsp;Identity&nbsp;identity;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;authenticate()<br />
<img id="Codehighlighter1_147_406_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_406_Open_Text.style.display='none'; Codehighlighter1_147_406_Closed_Image.style.display='inline'; Codehighlighter1_147_406_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_147_406_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_147_406_Closed_Text.style.display='none'; Codehighlighter1_147_406_Open_Image.style.display='inline'; Codehighlighter1_147_406_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_147_406_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_147_406_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">authenticating&nbsp;#0</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;identity.getUsername());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">write&nbsp;your&nbsp;authentication&nbsp;logic&nbsp;here,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">return&nbsp;true&nbsp;if&nbsp;the&nbsp;authentication&nbsp;was<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">successful,&nbsp;false&nbsp;otherwise</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;identity.addRole(</span><span style="color: #000000">"</span><span style="color: #000000">admin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Name 是用于定义Seam组件。这样定义的Seam组件可用于双向注入和其他页面操作。如果你没有这个注释。则表示这个并不是Seam组件，所以也起了一个标识Seam组件的目的。在这里Seam组件被命名为"authenticator"，在页面上要调用这个组件的authenticate方法需要这样写：#{authenticator.authenticate}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Logger用于注入日志组件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@In&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于双向注入。在注入时Seam会寻找当前容器中与该变量名相符的组件。当然了。也可以注入变量名不同的组件。需要指定组件名称，例如：@In("ident")。这样的意思就是在容器中寻找名为"ident"的组件将其注入到该类中。（Seam的作用域比较复杂，本篇暂不介绍）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来便是authenticate方法，这个方法中其实最重要的是后面两句。log.info(....)的意思即保存日志信息，最后那句意思即通过验证。如果验证的用户名密码不符合则return false;来表示拒绝登陆。比较复杂的是identity.addRole。这个方法是为当前用户添加一个角色。单如果该方法最终返回false。那么这些添加的角色将不保存。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么。如何让Seam知道当用户登陆时调用这个方法验证呢？在/WebContent/WEB-INF/components.xml中有这样一段配置：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">security:identity&nbsp;</span><span style="color: #ff0000">authenticate-method</span><span style="color: #0000ff">="#{authenticator.authenticate}"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;security-rules</span><span style="color: #0000ff">="#{securityRules}"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remember-me</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span></div>
其中authenticate-method即验证的方法。是以组件形式调用。还有一个security-rules属性则是安全规则。在哪里配置的？就在上面。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">drools:rule-base&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="securityRules"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">drools:rule-files</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/security.drl</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">drools:rule-files</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">drools:rule-base</span><span style="color: #0000ff">&gt;</span></div>
<br />
这就是刚刚说的那个文件。<br />
既然说到components.xml，那我们就来看下这个文件里还有些什么东西。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">core:init&nbsp;</span><span style="color: #ff0000">debug</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;jndi-pattern</span><span style="color: #0000ff">="@jndiPattern@"</span><span style="color: #0000ff">/&gt;</span></div>
这段代码是定义jndi查找规则的。@jndiPattern@的定义是在/src/modal/components.properties里的这样一段配置：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Fri&nbsp;Dec&nbsp;</span><span style="color: #000000">05</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">:</span><span style="color: #000000">37</span><span style="color: #000000">:</span><span style="color: #000000">03</span><span style="color: #000000">&nbsp;CST&nbsp;</span><span style="color: #000000">2008</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />jndiPattern</span><span style="color: #000000">=</span><span style="color: #000000">\#{ejbName}/local<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />embeddedEjb</span><span style="color: #000000">=</span><span style="color: #000000">false<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
这段配置的意思是开启jndi查找规则是ejb组件名称/local。即使用本地EJB组件。而非远程EJB组件<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">core:manager&nbsp;</span><span style="color: #ff0000">concurrent-request-timeout</span><span style="color: #0000ff">="500"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation-timeout</span><span style="color: #0000ff">="120000"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation-id-parameter</span><span style="color: #0000ff">="cid"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent-conversation-id-parameter</span><span style="color: #0000ff">="pid"</span><span style="color: #0000ff">/&gt;</span></div>
conversation-timeout&nbsp; conversation(页面流)过期时间。我将conversation称为页面流可能不太合适。可以根据你的理解去称呼它。它是一段页面流转的过程定义。Seam中定义了一conversation作用域<br />
conversation-id-parameter用于定义conversation的reuqest parameter name。即因为用户现在在哪个页面流中需要浏览器回传一个参数才知道。<br />
parent-conversation-id-parameter。conversation允许定义子页面流。这个属性定义浏览器回传父conversation的参数名<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">persistence:managed-persistence-context&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="entityManager"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto-create</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entity-manager-factory</span><span style="color: #0000ff">="#{SeamTestEntityManagerFactory}"</span><span style="color: #0000ff">/&gt;</span></div>
这个就是jpa的entityManager组件的定义了。在Seam组件中使用@In("entityManager")将会自动注入这个组件
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">event&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="org.jboss.seam.security.notLoggedIn"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">execute</span><span style="color: #0000ff">="#{redirect.captureCurrentView}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">event</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">event&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="org.jboss.seam.security.loginSuccessful"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">execute</span><span style="color: #0000ff">="#{redirect.returnToCapturedView}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">event</span><span style="color: #0000ff">&gt;</span></div>
这个是对于登陆用的。当客户访问一个页面需要登陆。但用户又没有登陆。这时会转到一个登陆页面。登陆完毕后又转会用户要进入的页面。如果有这样的需求就要加上这两句配置。不过Seam已经自动生成了<br />
其他：默认生成的 face-config.xml里没有支持中文。可以加入<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">application</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">view-handler</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.sun.facelets.FaceletViewHandler</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">view-handler</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">locale-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">default-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">en</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">default-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">bg</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">de</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">en</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">fr</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">tr</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">locale-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">application</span><span style="color: #0000ff">&gt;</span></div>
代码:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">zh_CN</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span></div>
 <img src ="http://www.blogjava.net/phyeas/aggbug/244853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-09 12:03 <a href="http://www.blogjava.net/phyeas/articles/244853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(1)：环境搭建</title><link>http://www.blogjava.net/phyeas/articles/244502.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Fri, 05 Dec 2008 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/244502.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/244502.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/244502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/244502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/244502.html</trackback:ping><description><![CDATA[<p dir="ltr" style="margin-right: 0px" align="left">&nbsp; 首先说下我使用的环境：JDK1.6,JBOSS4.2,JBOSS TOOLS 3.0,Eclipse with wtp3.4,JBOSS SEAM2.0 <br />
Eclipse下载地址：<a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-win32.zip">http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-win32.zip</a><br />
JBOSS Tools下载地址：<a href="http://www.jboss.org/tools/download/index.html">http://www.jboss.org/tools/download/index.html</a><br />
其他JBOSS的东西都可以在这找到：<a href="http://www.jboss.org/download/">http://www.jboss.org/download/</a><br />
下载完毕后配置环境：<br />
&nbsp;&nbsp; JDK：这个网上大把。不说了<br />
&nbsp;&nbsp; Eclipse：这个就不用说了，直接解压就可以用。<br />
&nbsp; JBossTools：如果你的环境和我的一样，那就在dropins下新建一个文件夹。然后将解压后的features和 plugins文件夹拷贝到里面，这样JBoss Tools就安装好了&nbsp;。安装完后启动Eclipse。将视图转到Seam视图下。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="66" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/perspective.jpg" width="139" border="0" /><br />
&nbsp;&nbsp; 配置Seam：下载JBoss Seam后随便解压到一个位置。然后在Eclipse中选择菜单：Windows-&gt;Preferences。在左边的树中选择JBoss Tools-&gt;Web-&gt;Seam。在右边会出现一个表格和一个add按钮。点Add跳出一个窗口。点Browser选择你刚刚解压出来的Seam的路径。点finish就配置好了。<br />
&nbsp; 配置JBoos Server：配置JBOSS服务器。还是选择Windows-&gt;Preferences。在左边的树中选择Server-&gt;runtime Environments。add-&gt;选择Jboss AS解压路径。finish。还有。。。。在工具栏中有个这个图标<img height="29" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/servers.jpg" width="45" border="0" />。点旁边的下拉框。选择New Server。选择路径，下一步时会让你填用户名密码，初始用户名和密码都是admin。<br />
OK，配置好了<br />
<br />
试下先。<br />
将视图转到Seam视图下。不会的就先看前面。然后再 File -&gt; New -&gt; Seam Project<br />
<img height="423" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/newproject.jpg" width="541" border="0" /><br />
需要选的地方是Configureation。默认是1.2的。选择2.0</p>
<p>然后Next -&gt; Next&nbsp; -&gt; Next -&gt; Next到配置数据库连接的位置<br />
&nbsp;选择 new 一个<img height="22" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/newdatabase.jpg" width="43" border="0" />。进入配置界面。我现在用的是sqlserver。以下以sqlserver为例：<br />
<img height="261" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/editsqlserver.jpg" width="484" border="0" /><br />
选择要配置的数据库类型后填写Name；然后Next<br />
配置驱动，New一个<img height="31" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/newdriver.jpg" width="27" border="0" />&nbsp;<br />
<img height="160" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/newdriver2.jpg" width="468" border="0" /><br />
配置Jar List后就FINISH了。</p>
<p>然后后面的步骤就简单了。直接可以finish。这样会新建两个工程。一个是主工程。一个是测试用的。<br />
JBoss Tools已经帮你部署到了你选择的Jboos服务器里。<br />
现在直接运行JBoss就OK了。如果你配置了Jboos Server。在工具栏中有个这样的东西<img height="26" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/jbosstoolbar.jpg" width="107" border="0" />第一个是运行Jboss服务器，第二个是用Debug模式运行，第三个是停止。直接点绿色的箭头。启动时可能会报一个错误：java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'information_schema.system_sequences' 无效。这是因为Seam启动时需要这个东西。单数据库里却没有。。不要以为information_schema是库名，而system_sequences是表名哦。因为就算你在数据库里建了这样一个库和表也是没用的。解决办法是修改src/module/META-INF/下的persistence.xml。将里面的hibernate.hbm2ddl.auto设置为create-update。让seam自己去创建对象。但又不自动删除。不能用create-drop。因为如果用create-drop在服务器关闭时Seam会自动将它删除。下次重新创建。而这也会秧及你的数据表。。。只要用create-update启动一次即可。也可以只create，后面每次就可以用update了。其实可以不换成只update。用create-update也挺好。因为如果数据库中存在该数据表。Seam就不会再重新create<br />
如果数据库中的表与将要创建的表结构一致。Seam就不会更新表结构<br />
重新启动服务器。</p>
启动完毕后访问<a href="http://localhost:8080/SeamTest/home.seam">http://localhost:8080/SeamTest/home.seam</a><br />
如果出现如下页面就说明所有配置都已完成。让我们开始Seam吧。<br />
<img height="381" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/home.jpg" width="583" border="0" />
 <img src ="http://www.blogjava.net/phyeas/aggbug/244502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-05 11:21 <a href="http://www.blogjava.net/phyeas/articles/244502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>