首页 技术 正文
技术 2022年11月12日
0 收藏 480 点赞 4,798 浏览 2860 个字

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

使用Seam Framework + JBoss 5.0 开发第一个Web应用 – 简单投票程序

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

在终端运行

seam setup

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

使用Seam Framework + JBoss 5.0 开发第一个Web应用 – 简单投票程序
关于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会为我们自动创建一个如下的表:
使用Seam Framework + JBoss 5.0 开发第一个Web应用 – 简单投票程序

开发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配置文件。整个开发过程通过注解即可完成大部分功能。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,957
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,481
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,327
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,110
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,742
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,776