什么是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里创建数据库和表:
- 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 )
- );
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表,有什么作用待会说
- 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逻辑:
- @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 ;
- }
- }
- }
@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!