Seam学习3--第一个实例(注册实例的建立与理解)

本学习结合结合了满江红的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来验证自己的成果。你会发现数据库中的表会自动创建好。



分析一:与新建项目的区别
1.移动了view下的页面,到registration下的WebContent目录中,进行粘帖覆盖-->新增了2两个jsp页面(.xhtml)
2.移动了  src\org\jboss\seam\example\registration 目录下的.java文件到session中 -->新增了一个会话bean
3.新创建了包entity,并且将类似JavaBean的.java移动进去 -->新增了一个实体bean
END

页面效果:

代码分析:
本示例有两个jsp页面,一个实体Bean一个无状态会话Bean实现


实体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
<!--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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值