本学习结合结合了满江红的JBoss seam中文手册
jboss-seam-2.2.2.Final\examples\registration 例子(注册示例)的创建与分析
工程实现具体步骤如下:
1:在eclipse里,新建一个“Seam Web Project”,project名称是registration,数据库我用的是mysql,这里也要设置好,并通过测试。(创建Seam Project的步骤,可参见Seam Project的建立)
2:把jboss-seam-2.2.2.Final\examples\view文件夹下的3个文件,拷贝到项目registration下的WebContent下,index.html可以覆盖掉已存在的。
3:把 src\org\jboss\seam\example\registration下的 Register.java,RegisterAction.java 拷贝到工程registration-ejb下的ejbModule的org.domain.registration.session包的下面。然后把 两个java文件的package修改成正确的“package org.domain.registration.session;”
这时候的错误先不用管,应为entity bean还没有拷贝过来。
4:上面提及的工程registration-ejb只有一个包,为了有一个好习惯,我们还要自己创建一个org.domain.registration.entity的包,用来存放entity。
5:把 src\org\jboss\seam\example\registration下的User.java拷贝到刚刚创建好的 org.domain.registration.entity包的下面。然后把package修改成正确的“package org.domain.registration.entity;”
6:把相关的java错误都修正。比较简单,就不多啰嗦了。另外,test的部分先不涉及,日后在慢慢学习。
7:~~\examples\registration\resources下的文件可以不使用,因为eclipse自动生成中都包含了这部分内容。
8:就是启动jboss server来验证自己的成果。你会发现数据库中的表会自动创建好。
页面效果:
实体Bean: User.java
该实体bean用于保存用户资料,通过注解完成与数据库的映射关系,并提供类似于hibernate中的validate校验功能(同样是注解)
@Entity //声明这个类是实体bean
@Name("user") //Seam组件,整个seam工程中唯一,当jsf页面中通过user.xx调用该组件上下文时,实例化这个User
@Scope(SESSION) //Seam组件,指明这个bean的作用域为一个会话
@Table(name="users") //指明这个bean与数据库中哪个表进行映射
public class User implements Serializable
{
private static final long serialVersionUID = 1881413500711441951L;
//实现bean的属性
private String username;
private String password;
private String name;
public User(String name, String password, String username)
{
this.name = name;
this.password = password;
this.username = username;
}
//必须需要一个空的构造方法
public User() {}
@NotNull //不能为null
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@NotNull @Length(min=5, max=15) //字段不能为null且指明了长度的范围
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
@Id @NotNull @Length(min=5, max=15)//每个实体bean必须有一个ID 唯一标识
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
@Override
public String toString()
{
return "User(" + username + ")";
}
}
无状态会话bean RegisterAction.java
用于做事务管理和数据库访问,是jsf的动作监听器
@Stateless //指明该类是一个无状态会话bean
@Name("register") //Seam组件,整个seam工程中唯一
public class RegisterAction implements Register
{
@In //通过该注解,表示user需要由Seam注入,也就是将user这个组件注入到这个会话bean中
private User user;
@PersistenceContext //动态注入EJB实体管理器,注入后可通过它完成对数据库的简单操作
private EntityManager em;
@Logger //资料没看懂...相当于日志吧...
private static Log log;
public String register()
{
List existing = em.createQuery("select u.username from User u where u.username=#{user.username}")
.getResultList(); //根据用户名称查询用户
if ( existing.size()==0 ) //如果没有结果,说明没有重复名称,可以添加用户
{
em.persist(user); //相当于我们sql中的save ,将对象数据添加到数据库
log.info("Registered new user #{user.username}"); //将信息录入日志
return "/registered.xhtml"; //返回到registered.xhtml页面显示
}
else //用户已经存在
{
//seam的内置组件,将信息存入,页面通过 <h:messages/>标签进行读取
FacesMessages.instance().add("User #{user.username} already exists");
return null; //为null表示当页
}
}
}
视图页面
<!--index.xhtml -->
<html>
<head>
<!-- 页面定期刷新,如果加url的,则会重新定向到指定的网页,content后面跟的是时间(单位秒),把这句话一般加到指定网页的head标签里 -->
<!--此处发生了改变,表示跳转到register.xhtml页面 -->
<meta http-equiv="Refresh" content="0; URL=register.seam">
</head>
</html>
当访问首页index.xhtml时,进行跳转,根据指定,跳转到register.xhtml
<!-- register.xhtml -->
<body>
<f:view><!-- jsf标签需要在view这个标签内使用 -->
<h:form id="registration">
<s:validateAll> <!-- 这个标签内的输入需要经过实体bean的校验 -->
<h:panelGrid columns="2">
Username: <h:inputText id="username" value="#{user.username}" required="true"/>
Real Name: <h:inputText id="name" value="#{user.name}" required="true"/>
Password: <h:inputSecret id="password" value="#{user.password}" required="true"/>
</h:panelGrid>
</s:validateAll>
<h:messages id="messages"/> <!-- 显示错误信息,无则不显示 -->
<!-- 按钮,点击后执行register这个组件中的register方法 -->
<h:commandButton id="register" value="Register" action="#{register.register}"/>
</h:form>
</f:view>
</body>