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

来源:互联网 发布:php统计网站访问量代码 编辑:程序博客网 时间:2024/06/05 16:00

本学习结合结合了满江红的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
原创粉丝点击