﻿<?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-robbie-随笔分类-JBoss Seam/JSF</title><link>http://www.blogjava.net/robbie/category/36431.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 18 Dec 2008 17:08:53 GMT</lastBuildDate><pubDate>Thu, 18 Dec 2008 17:08:53 GMT</pubDate><ttl>60</ttl><item><title>JBossSeam学习系列之四--第二个例子</title><link>http://www.blogjava.net/robbie/archive/2008/12/18/247245.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Thu, 18 Dec 2008 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/18/247245.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/247245.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/18/247245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/247245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/247245.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 上次使用Seam自动生成了一个CRUD的例子，后来想还是自己白手起家做一个例子看看，于是开始动手。</p>
<p>&nbsp;&nbsp;&nbsp; 首先使用JBossTools工具生成项目，在生成项目的向导中，如果项目类型选择ear，则会生成四个项目，分别对应war、ear、ejb、test，觉得这样太过繁琐，还是选择war类型，又想要不使用tomcat作为运行服务器吧，因为JBoss也不太熟悉。没想到这一试倒试出问题来了，如果完全使用向导生成项目，选择tomcat作为运行服务器，则项目根本无法运行起来，总是提示缺少这个jar，那个jar。好，又换回JBoss，没问题了。仔细看了一下，原来在自动生成项目的WebContent/WEB-INF/lib目录中，只有大概十几个jar，连Hibernate的jar都没有，而在JBoss的Server/default/lib目录下则什么jar都有，怪不得不出错。</p>
<p><font color="#0080c0"><strong>第一个教训：还是先使用JBoss作为运行环境，等整个Seam都搞熟了，再配一个Tomcat的运行环境。</strong></font></p>
<p>&nbsp;&nbsp;&nbsp; 继续，将原来项目中的一个通用DAO和一个UserService拷贝过来，代码如下，启动服务器报错。分别为如下错误信息：</p>
<p><font color="#0080c0"><strong>第二个错误解决：Caused by: java.lang.IllegalArgumentException: @PersistenceContext may only be used on session bean or message driven bean components: genericDao</strong></font></p>
<p>&nbsp;&nbsp;&nbsp; 既然提示@PersistenceContext只能用在SessionBean中，因为原来的代码是使用的Spring框架，想了好长时间，在WebContent/WEB-INF/component.xml中看到这么一段，那么是不是通过@In来注入entityManager呢，修改<font color="#ff0000"><font color="#000000">@PersistenceContext为@In，编辑器自动提示没有发现名称为em的Component（这点好像不错），于是再修改为</font><font color="#0080c0"><strong>@In("entityManager")</strong></font></font><font color="#000000"> ，重启服务器，该问题解决。</font></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">persistence:managed</span><span style="color: #000000;">-</span><span style="color: #000000;">persistence</span><span style="color: #000000;">-</span><span style="color: #000000;">context name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">entityManager</span><span style="color: #000000;">"</span><span style="color: #000000;"> auto</span><span style="color: #000000;">-</span><span style="color: #000000;">create</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;"> entity</span><span style="color: #000000;">-</span><span style="color: #000000;">manager</span><span style="color: #000000;">-</span><span style="color: #000000;">factory</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">#{testEntityManagerFactory}</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"> <br />
</span></div>
<p><font color="#0080c0"><strong>第三个错误解决：Caused by org.jboss.seam.RequiredException with message: "@In attribute requires non-null value: userService.genericDao"</strong></font></p>
<p>&nbsp;&nbsp;&nbsp; 将UserService中的<font color="#ff0000"><strong>@In</strong></font>修改为<font color="#0080c0"><strong>@In(create = true, required = true)</strong><font color="#000000">解决此问题。</font></font></p>
<p>&nbsp;&nbsp;&nbsp; 解决上述几个问题后，自己的例子终于运行起来了 :-)</p>
<p>&nbsp;&nbsp;&nbsp; 下一篇关于Seam In Action中对JSF的介绍及Seam如何增强JSF。</p>
<p>-------------------------------------------------------------------------------------------------</p>
<p><font color="#0080c0"><font color="#000000">&nbsp;&nbsp;&nbsp; 项目生成的代码被分为两个目录，分别为Action和Model目录，检查JBoss中项目部署的目录，发觉Action目录下的代码编译生成的class文件被存放至WEB-INF/dev目录下，Model目录下的代码编译生成的class文件被存放至WEB-INF/classes目录下，google了一下，发现在Seam Reference中提到这是Seam的增量式重部署，支持对JavaBean组件的增量重部署，可以加快编辑/编译/测试的速度。</font></font></p>
<p>代码如下：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><span style="font-family: courier;"><span style="color: #000000;"><span style="font-family: arial;"><span style="font-family: arial;"><span style="font-family: times new roman;"><span style="color: #000000;"><span style="font-family: courier;"><span style="color: #000000;"><span style="font-family: times new roman;"><span style="font-family: arial;"><span style="color: #000000;"><span style="font-family: times new roman;"><span style="color: #000000;"><span style="font-family: georgia;"><span style="color: #000000;">public interface GenericDao {<br />
&nbsp;&nbsp;&nbsp; public Object get(Class clazz, Serializable id);<br />
&nbsp;&nbsp;&nbsp; public </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> save(Object object);<br />
&nbsp;&nbsp;&nbsp; public </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> update(Object object);<br />
&nbsp;&nbsp;&nbsp; public </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> remove(Class clazz, Serializable id);<br />
&nbsp;&nbsp;&nbsp; public </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> remove(Object obj);<br />
&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}</span></span></span></span></span></span></span></span><span style="color: #000000;"><br />
<br />
<span style="font-family: georgia;"><span style="color: #000000;"><span style="font-family: courier;"><span style="color: #000000;"><span style="font-family: arial;"><span style="font-family: arial;"><span style="font-family: times new roman;"><span style="color: #000000;"><span style="font-family: courier;"><span style="color: #000000;"><span style="font-family: georgia;"><span style="color: #000000;">@Name(</span><span style="color: #000000;">"</span><span style="color: #000000;">genericDao</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
public class GenericDaoImpl implements GenericDao {<br />
&nbsp;&nbsp;&nbsp; <strong><span style="color: red;">@PersistenceContext</span></strong>&nbsp; </span><span style="color: #000000;">----&gt;</span><span style="color: #000000;">&nbsp;&nbsp; @In(</span><span style="color: #000000;">"</span><span style="color: #000000;">entityManager</span><span style="color: #000000;">"</span><span style="color: #000000;">) <br />
&nbsp;&nbsp;&nbsp; private EntityManager em;<br />
<br />
&nbsp;&nbsp;&nbsp; public Object get(Class clazz, Serializable id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (id </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: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> em.find(clazz, id);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}</span></span></span><span style="color: #000000;"><br />
<br />
<span style="font-family: georgia;"><span style="color: #000000;">public interface UserService {<br />
&nbsp;&nbsp;&nbsp; public </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> findAllUsers();<br />
}<br />
<br />
@Name(</span><span style="color: #000000;">"</span><span style="color: #000000;">userService</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
public class UserServiceImpl implements UserService, SecurityUserService {<br />
<br />
&nbsp;&nbsp;&nbsp; <strong><span style="color: red;">@In</span></strong> </span><span style="color: #000000;">----&gt;</span><span style="color: #000000;"> @In(create </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">, required </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; protected GenericDao genericDao;<br />
&nbsp;&nbsp;&nbsp; private List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">User</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> resultList </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp; public List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">User</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> getResultList() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (resultList </span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.findAllUsers();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> resultList;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setResultList(List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">User</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> resultList) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.resultList </span><span style="color: #000000;">=</span><span style="color: #000000;"> resultList;<br />
&nbsp;&nbsp;&nbsp; }</span></span></span><span style="color: #000000;"><br />
<span style="font-family: georgia;"><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; public </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> findAllUsers() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String hql </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">from User order by userCode</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultList </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.genericDao.query(hql);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
// 实体类<br />
@Entity<br />
@Table(name = "USER")<br />
public class User implements IUser, Serializable {<br />
&nbsp;&nbsp;&nbsp; // 用户编码<br />
&nbsp;&nbsp;&nbsp; @Id<br />
&nbsp;&nbsp;&nbsp; private String userCode;<br />
<br />
&nbsp;&nbsp;&nbsp; // 用户姓名<br />
&nbsp;&nbsp;&nbsp; private String userName;<br />
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: #000000;"><br />
<br />
</span></div>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><span style="font-family: georgia;"><span style="color: #000000;">&lt;!</span><span style="color: #000000;">DOCTYPE composition PUBLIC </span><span style="color: #000000;">"</span><span style="color: #000000;">-//W3C//DTD XHTML 1.0 Transitional//EN</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ui:composition xmlns</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.w3.org/1999/xhtml</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; xmlns:s</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://jboss.com/products/seam/taglib</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; xmlns:ui</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://java.sun.com/jsf/facelets</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; xmlns:f</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://java.sun.com/jsf/core</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; xmlns:h</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://java.sun.com/jsf/html</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; xmlns:rich</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://richfaces.org/rich</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; template</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">layout/template.xhtml</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ui:define name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">rich:panel</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">f:facet name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">header</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">User Search Results</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">f:facet</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">rich:dataTable id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">userServiceTable</span><span style="color: #000000;">"</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; </span><span style="color: #0000ff;">var</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">#{userService.resultList}</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h:column</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">f:facet name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">header</span><span style="color: #000000;">"</span><span style="color: #000000;">&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; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h:outputText value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UserCode</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">f:facet</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h:outputText value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">#{user.userCode}</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">h:column</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h:column</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">f:facet name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">header</span><span style="color: #000000;">"</span><span style="color: #000000;">&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; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h:outputText value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UserName</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">f:facet</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h:outputText value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">#{user.userName}</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">h:column</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">rich:dataTable</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">rich:panel</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">ui:define</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">ui:composition</span><span style="color: #000000;">&gt;</span></span></span></div>
<p>通过这个实践，小结一下：</p>
<p>1、发觉Seam确实简化了JSF开发，但由于它涉及的新东西相对较多，与传统的SSH走的路线不太一致，还是觉得其学习曲线比较陡峭，需要对Seam熟练掌握后（包括开发环境的搭建等）才能真正提高开发效率。</p>
<p>2、Seam提供了IOC的功能，有时需要跳出Spring，从一个新的角度去审视Seam。</p>
<img src ="http://www.blogjava.net/robbie/aggbug/247245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-18 23:46 <a href="http://www.blogjava.net/robbie/archive/2008/12/18/247245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBossSeam学习系列之三--第一个例子</title><link>http://www.blogjava.net/robbie/archive/2008/12/09/245362.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Tue, 09 Dec 2008 14:40:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/09/245362.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/245362.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/09/245362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/245362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/245362.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看了Seam的例子，也看了Seam的简介，禁不住手痒，还是先做一个例子吧，遵照《seam_reference》第三章中的指导，使用JBossTool生成了自己的第一个例子，过程如下：</p> <p>1、生成Sem web项目</p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step1_2.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 0px 50px; border-left: 0px; border-bottom: 0px" height="320" alt="step1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step1_thumb_1.jpg" width="460" border="0"></a> </p> <p>2、输入项目的相关信息，如下图：</p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step2.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 0px 50px; border-left: 0px; border-bottom: 0px" height="548" alt="step2" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step2_thumb.jpg" width="500" border="0"></a> </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意，如果是第一次使用Eclipse，需要配置Target Runtime和Target Server。</p> <p>3、然后一路next，到最后一步时，如果是第一次使用，也要注意配置Seam Runtime和Connection Profile，如下图。最后点击finish按钮，即可创建Seam项目。</p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step3.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 0px 50px; border-left: 0px; border-bottom: 0px" height="548" alt="step3" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step3_thumb.jpg" width="500" border="0"></a> </p> <p>4、生成项目后，在Eclipse中共出现了四个项目，如下：</p> <ul> <li>seamfirst （web项目）</li> <li>seamfirst-ear （ear项目，集成web和ejb）</li> <li>seamfirst-jar （ejb项目）</li> <li>seamfirst-test （测试项目，进行单元测试）</li></ul> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此时运行JBossServer服务器，访问<a href="http://localhost:8080/seamfirst">http://localhost:8080/seamfirst</a>链接，出现如下图页面，此时Seam帮我们生成了一个框架，包含了基本的登录和退出功能，还有一个首页。</p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step5.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 0px 50px; border-left: 0px; border-bottom: 0px" height="375" alt="step5" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step5_thumb.jpg" width="500" border="0"></a> </p> <p>5、继续！使用Seam生成单表的CRUD操作。本步骤前提，有一个mysql数据库，数据库中有一个Customer表，该表有ID（int类型）、customername（varchar2类型）、customerdesc（varchar2类型）、createdate（date类型）、email（varchar2类型）五个字段。在seamfirst项目上点击右键，选择Seam Generate Entities菜单，弹出界面如下图：</p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step6.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 0px 50px; border-left: 0px; border-bottom: 0px" height="431" alt="step6" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step6_thumb.jpg" width="500" border="0"></a> </p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step7.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 0px 50px; border-left: 0px; border-bottom: 0px" height="373" alt="step7" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeam_12C10/step7_thumb.jpg" width="500" border="0"></a> </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单击finish按钮后，再运行JBoss Server服务器，访问<a href="http://localhost:8080/seamfirst">http://localhost:8080/seamfirst</a>，发觉菜单栏上多了一个Customer List菜单，单击此链接，即可进行Customer的添加、删除、修改、查询操作，虽然生成的界面不是很好看，也不是很符合我自己的操作习惯，但是功能倒是完备。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以后若是修改了Seam提供的代码自动生成的模板，然后再使用该功能，想必生成的页面就符合自己的项目要求了，记下一笔，先不管它。</p> <p>&nbsp;</p> <p>生成的代码分析：</p> <p>生成的代码主要有两部分，一部分为Java代码，一部分为页面代码。</p> <p><font color="#0080c0">Java代码包括如下三个类：</font></p> <ul> <li>Customer.java ---- 实体类，映射到数据库中的Customer表。</li> <li>CustomerHome.java ---- SessionBean，提供了Customer类的创建、更新、删除功能。继承了org.jboss.seam.framework.EntityHome类，EntityHome类中提供创建、更新、删除等基本功能。</li> <li>CustomerList.java ---- SessionBean，提供了Customer类的查询功能。继承了org.jboss.seam.framework.EntityQuery类，EntityQuery类中提供了查询功能。</li></ul> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CustomerHome和CustomerList类中都使用了@Name annotation，这样在页面中就可以直接访问Session Bean中的方法了，达到了Seam将表现层和业务层直接融合的目标。</p> <p><font color="#0080c0">页面代码包括如下文件：</font></p> <ul> <li>Customer.xhtml</li> <li>Customer.page.xml</li> <li>CustomerEdit.xhtml</li> <li>CustomerEdit.page.xml</li> <li>CustomerList.xhtml</li> <li>CustomerList.page.xml</li></ul> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚开始看这段代码时，困惑我的有两个地方</p> <ul> <li>一个是CustomerList.xhtml中rich:dataTable的value为"#{customerList.resultList}"，customerList我明白指的是CustomerList SessionBean，但是我看遍了其代码，也没有发现有resultList属性，后来仔细一看，才发觉该属性在其父类EntityQuery中。</li> <li>另一个是每一个xhtml文件都有一个对应的page.xml文件，想了半天也没整明白这是怎么回事，后来只好继续看Seam in Action的第三章，看着看着终于明白了，原来这是Seam对JSF的一个扩展，增强了JSF的功能，具体含义后面详细解释。</li></ul> <p>至此第一个使用JBossTools生成的Seam例子完成了，好像很简单 :-)</p><img src ="http://www.blogjava.net/robbie/aggbug/245362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-09 22:40 <a href="http://www.blogjava.net/robbie/archive/2008/12/09/245362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBossSeam中&amp;quot;No phase id bound to current thread........&amp;quot;异常处理</title><link>http://www.blogjava.net/robbie/archive/2008/12/07/244903.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Sun, 07 Dec 2008 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/07/244903.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/244903.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/07/244903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/244903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/244903.html</trackback:ping><description><![CDATA[<p>用JBossTools生成项目，生成CRUD的代码，然后访问就报了如下异常：</p> <p><font face="Courier New" size="2">Exception during request processing: </font> <p><font face="Courier New" size="2">Caused by java.lang.IllegalStateException with message: "No phase id bound to current thread (make sure you do not have two SeamPhaseListener instances installed)" </font> <blockquote><pre><font size="2">org.jboss.seam.contexts.PageContext.getPhaseId(PageContext.java:163)
org.jboss.seam.contexts.PageContext.isBeforeInvokeApplicationPhase(PageContext.java:175)
org.jboss.seam.contexts.PageContext.getCurrentWritableMap(PageContext.java:91)
org.jboss.seam.contexts.PageContext.remove(PageContext.java:105)
org.jboss.seam.Component.newInstance(Component.java:2102)
org.jboss.seam.Component.getInstance(Component.java:1987)
org.jboss.seam.Component.getInstance(Component.java:1966)
org.jboss.seam.Component.getInstance(Component.java:1960)
org.jboss.seam.Component.getInstance(Component.java:1933)
org.jboss.seam.Component.getInstance(Component.java:1928)
org.jboss.seam.faces.FacesPage.instance(FacesPage.java:92)
org.jboss.seam.core.ConversationPropagation.restorePageContextConversationId(ConversationPropagation.java:84)
org.jboss.seam.core.ConversationPropagation.restoreConversationId(ConversationPropagation.java:57)
org.jboss.seam.jsf.SeamPhaseListener.afterRestoreView(SeamPhaseListener.java:389)
org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:228)
org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:194)
com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:104)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:38)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:177)
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:267)
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:380)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:507)
org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:54)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
java.lang.Thread.run(Thread.java:619)</font></pre></blockquote><pre><font size="2">Google了一下，有人讲是JBoss4.2.3GA版本的BUG，赶紧下载了JBoss4.2.2GA，再测试一切正常！</font></pre><pre><font size="2">不知还会不会有其它莫名的BUG了......</font></pre><img src ="http://www.blogjava.net/robbie/aggbug/244903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-07 22:03 <a href="http://www.blogjava.net/robbie/archive/2008/12/07/244903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBossSeam学习系列之二--什么是JBossSeam</title><link>http://www.blogjava.net/robbie/archive/2008/12/06/244822.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Sat, 06 Dec 2008 15:51:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/06/244822.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/244822.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/06/244822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/244822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/244822.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把环境配好之后，Seam的例子也运行起来了，看了seam_reference第一章中如下几个例子讲解：</p>
<ul>
    <li>the registration example  </li>
    <li>the messages example  </li>
    <li>the todo list example  </li>
    <li>the numberguess example </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 又在满江红的网站上找了seam_reference2.0的中文文档，主要看了《the contextual component model》一章，看完以后感觉Seam最核心的地方就是其contextual component model了，不过看完这一章以后只是对Seam有个大概的了解，对其具体的内容，细节还缺乏进一步的了解，对其优点、缺点也缺乏进一步的认识。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后又找到了《Seam in Action》的电子书，看了一点之后还是觉得这本电子书写得好，内容组织的很好，不象seam_reference后面的章节仅仅是罗列seam的各项功能。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天把Seam in Action的第一章草草看了一遍，将第一章讲述的内容总结如下：</p>
<p>1、什么是Seam</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Seam in Action中，没有将Seam称之为web framework，而是将其称为application stack。Seam将Java EE中的EJB3、JSF、JPA/Hibernate、JAAS等技术融合在一起，提供了更容易使用的方式，比如conversation、page flows、buisness precesses、rule-based security、JavaScript(Ajax) remoting、PDF rendering、email组合、charting、file uploads、Groovy integration等，用以简化web开发。</p>
<p>2、Seam的目标 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简化web开发 </p>
<p>3、Seam如何集成各类技术</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_2.png"><img style="border-width: 0px;" alt="selected" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_thumb.png" width="16" border="0" height="16" /></a>&nbsp;<font color="#0080c0">Seam集成了JSF、JPA和POJO Component</font></p>
<blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 在Seam中将EJB3.0中的Session Bean作为JSF的managed bean，直接将表现层和业务层衔接在一起，使得Session Bean可以直接访问web相关数据，比如request、session、application、JSF的FacesMessage、Component Tree等。而在不使用Seam时，一般都是使用JSF back bean来作为表现层和业务层之间的中介。 </p>
</blockquote> <blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 使用annotation中的@Name标注替代了JSF的faces-config.xml中关于managed bean的配置。 </p>
</blockquote> <blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> Seam不一定必须使用EJB和JPA，也可以使用POJO、Hibernate作为替代。如下图：</p>
</blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/seam.jpg"><img style="border-width: 0px; margin: 0px 0px 0px 70px;" alt="seam" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/seam_thumb.jpg" width="311" border="0" height="263" /></a>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_2.png"><img style="border-width: 0px;" alt="selected" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_thumb.png" width="16" border="0" height="16" /></a>&nbsp;<font color="#0080c0">上下文相关的组件模型（Seam中的核心概念）</font></p>
<blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> Seam提供了7种类型的上下文，其中属于Seam特有的两种上下文类型分别为：Conversation Context、Business process Context。 </p>
</blockquote> <blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> Seam提供了统一的组件注册、annotation、异常配置、方法拦截、统一的EL表达式等功能。其中Seam对其管理的组件拦截过程如下图：</p>
</blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/seam1.jpg"><img style="border-width: 0px; margin: 0px 0px 0px 70px;" alt="seam1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/seam1_thumb.jpg" width="593" border="0" height="203" /></a> </p>
<p>4、Seam的核心竞争力</p>
<p><font color="#0080c0">&nbsp;&nbsp;&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_2.png"><img style="border-width: 0px;" alt="selected" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_thumb.png" width="16" border="0" height="16" /></a> 更好的JSF</font></p>
<blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 增强的JSF</p>
<ul>
    <li>Seam对JSF最被认可的改进就是消除了在配置文件中声明managed bean。  </li>
    <li>Prerender page actions  </li>
    <li>Managed request parameters (for a given page)  </li>
    <li>Intelligent stateless and stateful navigation  </li>
    <li>Transparent JSF data model and data model selection handling  </li>
    <li>Fine-grained exception handling  </li>
    <li>Page-level security (per view ID)  </li>
    <li>基于Annotation的表单验证  </li>
    <li>Bookmarkable command links (solving the &#8220;everything is a POST&#8221; problem)  </li>
    <li>Entity converter for pick lists  </li>
    <li>Conversation controls  </li>
    <li>Support for preventing lazy initialization exceptions and nontransactional data access in the view</li>
</ul>
</blockquote> <blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 消除了连接Bean（ELIMINATING CONNECTOR BEANS）</p>
</blockquote> <blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一幅图可以很好的说明这句话的含义</p>
</blockquote> <blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/seam2.jpg"><img style="border-width: 0px; margin: 0px 0px 0px 30px;" alt="seam2" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/seam2_thumb.jpg" width="616" border="0" height="438" /></a> </p>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 引入了有状态的变量范围（INTRODUCING STATEFUL VARIABLE SCOPES）</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/seam3.jpg"><img style="border-width: 0px; margin: 0px 0px 0px 30px;" alt="seam3" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/seam3_thumb.jpg" width="630" border="0" height="200" /></a> </p>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 扩展的Persistence Context</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring中提供了The Session In View Filter，使得persistence manage可以在一个请求中存在，避免了常见的LazyInitializationException。在Seam中，扩展的Persistence Context可以跨越多个请求。其实扩展的Persistence Context是Conversation Context、Business Process Context的基础。</p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_2.png"><img style="border-width: 0px;" alt="selected" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_thumb.png" width="16" border="0" height="16" /></a> get rich quick</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seam提供了两种方式将Ajax集成到Seam应用中，一种是使用具有Ajax特性的JSF组件，如RichFaces和ICEFaces，另一种是可以在浏览器中使用JavaScript直接调用服务端的组件。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seam还提供了另外一种意义上的Rich，即将PDF、mail等功能集成到Seam应用中。</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_2.png"><img style="border-width: 0px;" alt="selected" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected_thumb.png" width="16" border="0" height="16" /></a> 提供了一个快速开发环境</p>
<blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 代码自动生成</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 热部署</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> Seam调试页面</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_2.png"><img style="border-width: 0px;" alt="selected1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/JBossSeamJBossSeam_13C4B/selected1_thumb.png" width="16" border="0" height="16" /></a> 不部署即可以进行单元测试</p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<blockquote>
<p>从目前我个人的理解来看，Seam的作用与能力如下：</p>
</blockquote>
<ul>
    <li>Seam将EJB3与JSF整合在一起，消除了JSF与业务代码之间的间隙，直接将表现层与业务层衔接在一起  </li>
    <li>Seam提出了Conversation Context的概念，将Stateful EJB引入到web开发中，直接与Conversation Context对应  </li>
    <li>Seam提供了与Jbpm、itext、mail等一系列开源框架的整合，对于需要使用的相关功能的用户来说，提供了便利性  </li>
    <li>提供了开发工具的整合（Seam Gen与IDE），还可以自动生成部分代码 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但由于Seam整合了如此多的框架，带来的一个最大的缺点：<font color="#ff0000">学习曲线陡峭，在SSH非常流行的今天，需要面对很多新技术（JSF、EJB3、JPA等），对于一个新手来说难度比较大</font>，如果想使Seam被更多的开发人员使用，必须加强它的文档，目前的文档还是太少了。</p>
<img src ="http://www.blogjava.net/robbie/aggbug/244822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-06 23:51 <a href="http://www.blogjava.net/robbie/archive/2008/12/06/244822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBossSeam学习系列之一--准备学习环境</title><link>http://www.blogjava.net/robbie/archive/2008/12/03/244224.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Wed, 03 Dec 2008 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/03/244224.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/244224.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/03/244224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/244224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/244224.html</trackback:ping><description><![CDATA[<p>准备深入学习JBossSeam，好好研究研究，具体学习路线基本遵循jboss-seam-2.1.1.CR1中的&lt;&lt;seam_reference.pdf&gt;&gt;。</p> <p>学习JBossSeam之前最好对相关技术有一定的了解，比如：</p> <ul> <li>JSF</li> <li>EJB3.0</li> <li>JPA</li></ul> <p>然后下载相关的软件，如下：</p> <ul> <li>jboss-seam-2.1.1.CR1</li> <li>jboss-4.2.3.GA</li> <li>JBossTools-3.0.0.Beta1-R200810311334-ALL-win32（开发环境）</li> <li>eclipse-jee-ganymede-SR1-win32（开发环境）</li> <li>apache-ant-1.7.0</li> <li>jdk1.6.0_06</li></ul> <p>环境的配置都比较简单，基本都是解压即可，有如下注意事项：</p> <ul> <li>在系统的环境变量中设置JAVA_HOME、ANT_HOME</li> <li>JBossTools解压后需拷贝至eclipse解压后的目录中。</li> <li>jboss-seam-2.1.1.CR1解压后，需设置其bulid目录下的default.build.properties文件中的jboss.home为JBOSS_HOME（假定为jboss-4.2.3GA的安装目录）。</li></ul> <p>上述配置好后，启动JBoss Server，然后至SEAM_HOME（假定为Seam的安装目录）/examples/registration目录下，运行ant explode命令，即可编译部署registration应用至JBoss Server中，最后访问：<a href="http://localhost:8080/seam-registration">http://localhost:8080/seam-registration</a> 即可体验Seam提供的第一个example程序 :-)</p><img src ="http://www.blogjava.net/robbie/aggbug/244224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-03 23:03 <a href="http://www.blogjava.net/robbie/archive/2008/12/03/244224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Seam的一篇有趣的评论</title><link>http://www.blogjava.net/robbie/archive/2008/12/03/244109.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Wed, 03 Dec 2008 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/03/244109.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/244109.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/03/244109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/244109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/244109.html</trackback:ping><description><![CDATA[<p>具体内容参见如下链接：</p>
<p><a title="http://www.javaworld.com.tw/roller/ingramchen/entry/2005_9_20_JBossSeamKingofStateful_" href="http://www.javaworld.com.tw/roller/ingramchen/entry/2005_9_20_JBossSeamKingofStateful_">http://www.javaworld.com.tw/roller/ingramchen/entry/2005_9_20_JBossSeamKingofStateful_</a></p>
<img src ="http://www.blogjava.net/robbie/aggbug/244109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-03 13:11 <a href="http://www.blogjava.net/robbie/archive/2008/12/03/244109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>