Seam这个单词的本意是缝合、连接,因而,Seam的作用即是把Java EE 规范里的JSF 和 EJB技术完美融合在一起,免去了很多胶合代码,并增强了JSF 和 EJB的很多功能。Seam的设计目标之一是,写最少的代码,做最多的事,并且极力减少 “对XML的编程”。现在我们就用Seam_2.2.2_Final 来开发一个简单的投票程序。截图如下:

使用 seam-gen 生成应用程序骨架

在终端运行
seam setup

启动seam-gen。按照提示回答所有问题。这里使用postgreSQL数据库,以EAR的格式部署应用程序,工程名为: icon_vote。


关于sean-gen的使用方法,可以从官方的 seam_reference中找到详细说明。

开发Entity Bean

Entity Bean,即实体Bean,它的对象代表一个现实事物的实体。在Seam中(包括EJB中),Entity Bean可以通过JPA持久化到数据库中。这里我们设计一个名为 Candidate的实体,用来表示一个候选人。Candidate 实体定义如下:
package com.lab.vote.model;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; @Entity
public class Candidate implements Serializable {
@Id @GeneratedValue
private int id;
private String name; //候选人名
private String photoName; //照片文件名
private int voteAmount; //票数 //get and set method }

@Entity注解用来告诉Seam这是一个实体bean,可以将其持久化的数据库中。

在没有指定@Table和@Column的情况下,seam默认使用名为作为表名,属性名作为字段名。JPA规定,每一个Entity Bean必须有一个属性被标注为@Id。这就是该实体的主键。我们用@GeneratedValue注解来指定,让提供持久化服务的数据库自动生成主键。

对于以上实体,seam会为我们自动创建一个如下的表:




开发POJO

POJO,即纯Java类。Seam允许我们使用单纯的Java类来实现EJB中Session Bean的功能。这样做的好处是,你的应用可以部署在没有EJB容器的应用服务器中,如Tomcat。还有一个好处是,不需要实现特定接口,减少了工作量。
VoteAction类的定义如下:
package com.lab.vote.action;

import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel; import com.lab.vote.model.Candidate; @Name("voteAction")
@Scope(ScopeType.SESSION)
public class VoteAction {
@In
private EntityManager em;
@DataModel
private List<Candidate> candidates; /*
* 从数据库中取出所有候选人票数
*/
@SuppressWarnings("unchecked")
@Factory("candidates")
public void findCandidate() {
candidates = em.createQuery("select can from Candidate can order by can.name").getResultList();
} /*
* 给指定候选人投票
* 更新数据库
*/
public void vote(Candidate select) {
Candidate can = em.find(Candidate.class, select.getId());
can.setVoteAmount(can.getVoteAmount() + 1);
em.flush();
}
}

其中,@Name注解表示给该组件起一个名字,以便于我们在EL表达式中进行引用。

@Scope注解则指定该组件的生存范围,这里为Session。
@In注解表示要求Seam从上下文中注入一个EntityMenager类型的组件,以便于我们实现持久化工作。
@DataModel会将被标注的candidates属性自动注出到上下文,这样在EL表达式中就能直接引用candiates而不需要指定组件名了。

创建页面

修改 resource/WEB-INF/pages.xml文件,添加<page>节点,以指定Seam在渲染home.xhtm之前先调用 findCandidate()方法。
<page view-id="/home.xhtml">
<action execute="#{voteAction.findCandidate()}"/>
</page>

修改 view/home.xthml文件,内容如下:
<ui:define name="body">

        <center>
<h:dataTable value="#{candidates}" var="can"> <h:column>
<p>Name: #{can.name}</p>
</h:column> <h:column>
<img src="img/#{can.photoName}" />
</h:column> <h:column>
<p>当前票数:#{can.voteAmount}</p>
</h:column> <h:column>
<h:form><h:commandButton action="#{voteAction.vote(can)}" value="投票" /></h:form>
</h:column> </h:dataTable>
</center> </ui:define>

至此一个简单的投票程序开发完毕。

打开终端,进入工程目录下,运行
ant explode

即可将应用部署到JBoss下。

可以看到,在该过程中,除了pages.xml中的少量代码外,我们没有动过任何的xml配置文件。整个开发过程通过注解即可完成大部分功能。

使用Seam Framework + JBoss 5.0 开发第一个Web应用 - 简单投票程序的更多相关文章

  1. [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序

    本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...

  2. 使用MyEclipse开发第一个Web程序

    MyEclipse环境配置 首先,安装一个MyEclipse,然后进行一些相关的环境配置(Window->Preferences): 比如字体.Formatter等. 也可以从Eclipse中导 ...

  3. JBoss + EJB3 + MySql : 开发第一个EJB

    JBoss开发Bean并不困难,而对于不知道的人来说,数据库配置才是比较棘手的问题.现在我们就来一步一步开发一个EJB3 + MySql的Bean. 一.MySql数据库的配置 1. 配置数据源 在 ...

  4. 【炫丽】从0开始做一个WPF+Blazor对话小程序

    大家好,我是沙漠尽头的狼. .NET是免费,跨平台,开源,用于构建所有应用的开发人员平台. 本文演示如何在WPF中使用Blazor开发漂亮的UI,为客户端开发注入新活力. 注 要使WPF支持Blazo ...

  5. 前端开发:一个开源、简单易用的jQuery表格插件(DataTables)

    DataTables是一个基于jQuery库的开源(MIT协议)表格插件,支持添加.排序.分页.搜索.过滤等功能,使用简单.广受欢迎,能够与主流前端UI整合(如bootstrap.jQuery UI等 ...

  6. 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  7. web Servlet 3.0 新特性之web模块化编程,web-fragment.xml编写及打jar包

    web Servlet 3.0 模块化 原本一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差,因此Servlet 3.0可以将每个Servlet. ...

  8. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  9. 解决.VS2012+EF5.0开发的网站在window server2003上无法部署的问题

    (一)前  言                                                                    最近一个月使用VS2012(默认框架是.net f ...

随机推荐

  1. iphone分辨率终极指南(含有iphone6/6+)

    如文本不清楚.请 "对->图片另存为" 下载大图后, ------------------------- 原文及翻译文本 Points点 At the beginning, ...

  2. Light OJ 1318 Strange Game 组合数+高速幂+分解因子

    长度为l的用k种字符组成的字符串有k^l中 当中m个字符要不同样 那就是k^l*C(l, m)*(k-1)^m 有反复 要除以2 可是你mod n了 不能直接除 n不一定是素数 所以不能乘以逆元 所以 ...

  3. 通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)-大壮他哥

    步骤: 1.运行--〉cmd:打开cmd命令框 2.在命令行里定位到InstallUtil.exe所在的位置 InstallUtil.exe 默认的安装位置是在C:/Windows/Microsoft ...

  4. vbox要手动mount才能挂载windows的共享文件夹(好用,不用安装samba了)

    mount -t vboxsf BaiduShare /mnt/bdshare/ 我按照这篇文章成功: http://www.wuji8.com/meta/448016166.html 其它参考: h ...

  5. Swift初体验 (一)

    // 声明一个常量 let maxNumberOfStudents: Int = 47 // 声明一个变量,假设没有在声明的时候初始化,须要显示的标注其类型 var currentNumberOfSt ...

  6. javascript 中 undefined 和 null 区别

    1.相同点 如果我们直接用 undefined == null  比较他们是相等的返回的将是 true. 2.区别 当我们用undefined === null 比较的时候最后返回的将是 false. ...

  7. redhat6.3+oracle11GR2 单库 安装规划

    oracle11g单实例安装+redhat6.3   规划 一.查看环境 [root@JSCS78DB dev]# cat /etc/redhat-release Red Hat Enterprise ...

  8. [置顶] 遇到难题(bug)的解决方法心得

    今天早上花了2个小时解决一个问题...界面抖动.. 最近把淄博项目的界面用BT改了,后来发现4个界面之间切换会抖动.. 就是整个界面会左右抖动... 文章出处: PHP攻城师 www.phpgcs.c ...

  9. Swift - 使用Auto Layout和Size Classes实现页面自适应弹性布局

    在过去只有iphone4的时候,可以在代码里将一个可视单元的位置写死,这样是没问题的,但随着iPhone5,6的发布,屏幕尺寸有了越来越多种可能.这就要求App的UI控件具有在不同屏幕尺寸的设备上具有 ...

  10. servlet后台怎样接收对象參数

    主要思想是用js把对象转换成json.然后把json提交到后台去,后台把这个json字符串转换成map对象 <script type="text/javascript"> ...