Seam-gen的试用手记

什么是Seam-gen?
Seam-gen是Seam自带的一种项目生成工具。开发者只需要用cmd或者Eclipse的UI进行简单的配置就能自动生成一个项目,并且这 个项目还已经具备了完善的CRUD功能。开发者只需要基于需求对项目进行修改就可以了。从这点上和RoR非常类似,不知道是不是从它那偷来的。

开发环境准备
jdk1.5.0 -- 必须是Java 5 或以上;
jboss-4.2.2.GA -- 建议不要用最新的试用版,否则怎么死的都不知道,不值!
jboss-seam-2.0.2.SP1 -- 像jboss一样,下载下来直接解压就行;
MySQL Server 5.0 -- 各位爷们都装了无数次了吧?
完了当然不能忘记设置环境变量了。

这个Demo是干啥的?
小项目,只有三个表。user表存储了管理员帐号和普通用户帐号;suppliers表就是提供商,有id,name和code;deal表存储 交易信息,supplierid作为它的foreign key。这样一说大概也明白是干什么的吧。就是管理交易信息。完了我们就在MySql里创建数据库和表:

Java 代码
  1. create database seam;  
  2.   
  3. use seam;  
  4.   
  5. create table suppliers(  
  6.   id integer primary key auto_increment,  
  7.   name varchar(32 ) not  null ,  
  8.   code varchar(32 ) not  null   
  9. );  
  10.   
  11. create table deal(  
  12.   id integer primary key auto_increment,  
  13.   name varchar(32 ) not  null ,  
  14.   supplierid integer,  
  15.   Foreign Key (supplierid) references suppliers(id)  
  16. );  
  17.   
  18. create table user(  
  19.   id integer primary key auto_increment,  
  20.   name varchar(32 ),  
  21.   password varchar(32 ),  
  22.   role varchar(32 )  
  23. );  
create database seam;

use seam;

create table suppliers(
  id integer primary key auto_increment,
  name varchar(32) not null,
  code varchar(32) not null
);

create table deal(
  id integer primary key auto_increment,
  name varchar(32) not null,
  supplierid integer,
  Foreign Key (supplierid) references suppliers(id)
);

create table user(
  id integer primary key auto_increment,
  name varchar(32),
  password varchar(32),
  role varchar(32)
);


还要插一条管理员的记录进user表,有什么作用待会说

Java 代码
  1. insert into user values( '1' , 'admin' 'password' 'admin' );  
insert into user values('1','admin', 'password', 'admin');



这就是Seam-gen了
因为Seam-gen在Eclipse的plugin只更新到1.2,完全无视了时代的发展,所以只能用cmd来手动生成,再移植到 Eclipse。下面是配置的记录,后面我会慢慢解释:


C:\dev\jboss-seam-2.0.2.SP1是Seam的安装目录
seam setup -- 进入Seam项目的配置步骤;
project workspace -- 工作目录,随意;
JBoss home -- Jboss安装目录;
project name -- 项目名;
ICEFaces -- 可n可y,我这个demo用不上就没用;
RichFaces skin -- 几个都试过,我个人喜好wine,就是酒红色;
as an EAR -- 如果不需要用到EJB的东西,选war,否则ear;
package name -- 爱咋咋的;
database -- 那种数据库,候选里挑一个,我的是mysql;
Hibernate dialect -- 可不能写错了,不懂咋回事的上网google一下;
JDBC driver jar -- 你的jtds存放的位置;
JDBC driver class -- 我用的是com.mysql.jdbc.Driver;
JDBC url -- 就是连接数据库的url,比如我的是:jdbc:mysql://localhost:3306/seam
username -- 链接数据库的用户名;
password -- 密码;
database catalog -- 直接按Enter键跳过;
already exist -- y:数据库已有,n:重新创建数据库,我这里当然是y了;
drop and recreate -- 我选n;
搞定!快吧?
当然了,我们也有另外一种设置方式,就是直接在Seam的目录里的build.properties文件里直接编辑,这样可能效率更高:


下一步就是生成项目:seam new-project 。非常简单,一步搞定。有人也许会问,如果我是用 build.properties配置的,也是这样生成项目吗?对,配置完后进入seam的目录,直接输入命令就行。
生成实体:还是这么简单:seam generate-entities 。输入命令后,seam就会连接数据库,并把你数据库 里的表生成Java实体和mapping的配置文件。

还是得用Eclipse
打开Eclipse,按照以下步骤就能把项目import进来:
New project --> General project --> 你的项目名(provider)。就这样你就能在Eclipse开发了。

在Eclipse创建好了后我们就能尝试布置到应用服务器里运行。配置非常简单:


完了在cmd里输入以下命令:seam deploy ;再启动Jboss,在浏览器里输 入:http://localhost:8080/provider。牛!home page出来咯:


Login
项目生成的时候,Seam已经自动创建了一个Authenticator.java文件,里面只有一个method。当然了,最初肯定是没有任何 业务逻辑的,这些还得自己写。下面这段Java code就是就实现了简单的login逻辑:

Java 代码
  1. @Name ( "authenticator" )  
  2. public   class  Authenticator  
  3. {  
  4.     @Logger  Log log;  
  5.       
  6.     @In  Identity identity;  
  7.       
  8.     @In  EntityManager entityManager;  
  9.      
  10.     public   boolean  authenticate()  
  11.     {  
  12.         try   
  13.         {  
  14.            User user = (User) entityManager.createQuery(  
  15.            "from User where name = :username and password = :password" )  
  16.            .setParameter("username" , Identity.instance().getUsername())  
  17.            .setParameter("password" , Identity.instance().getPassword())  
  18.            .getSingleResult();  
  19.   
  20.            if  (user.getRole() !=  null )  
  21.            {  
  22.                Identity.instance().addRole(user.getRole());  
  23.            }  
  24.            return   true ;  
  25.         }  
  26.         catch  (NoResultException ex)  
  27.         {  
  28.            return   false ;  
  29.         }  
  30.     }  
  31. }  
@Name("authenticator")
public class Authenticator
{
    @Logger Log log;
    
    @In Identity identity;
    
    @In EntityManager entityManager;
   
    public boolean authenticate()
    {
    	try
        {
           User user = (User) entityManager.createQuery(
           "from User where name = :username and password = :password")
           .setParameter("username", Identity.instance().getUsername())
           .setParameter("password", Identity.instance().getPassword())
           .getSingleResult();

           if (user.getRole() != null)
           {
        	   Identity.instance().addRole(user.getRole());
           }
           return true;
        }
        catch (NoResultException ex)
        {
           return false;
        }
    }
}


功能很简单,就是检索数据库里是否存在用户输入用户名和密码,不存在就返回false;如果存在的话就把此用户的role赋给Identity object。这里,role是user表的一个字段,只存在两种可能值:user或admin,不允许为空。Identity是Seam一个 built-in的对象,我们拿来就可以用。我就不对它进行过多的解释,总之是和security有关的。

配置页面,限制访问权限
Seam为其自动生成的所有页面都配置了一个配置文件。比如菜单就有:menu.xhtml和menu.xhtml.xml.还有一个总的配置文 件:page.xml。一堆配置文件,确实有点烦。其实配置也很简单,在登录后才能访问的页面或菜单选项里加入login- required="true";在需要管理员身份才能访问的地方加上identity.loggedIn and s:hasRole(‘admin’)就能实现访问限制。简单!好,上pp吧:

菜单里只剩下home这个谁都能访问的链接了


普通用户登录后还是不能看到userList,但可以编辑deal和suppliers。


用管理员身份登录就啥都能干了。刚才说要手动插入一条管理员的记录进数据库,因为只有管理员身份登录以后才能在web里插入新的用户记录。

总结
pros:特别是那些针对数据库进行操作的中小型项目,并且简单,快捷,还有。。。。。爽!
cons:生成一大堆配置文件,虽然你能重新配置;不太适合大项目,否则你会发觉还不如自己配置后才开发呢。
总之啥都试试你才知道是不是你要的。ENJOY!

 

 

 

你可能感兴趣的:(eclipse,mysql,jboss,配置管理,seam)