zoukankan      html  css  js  c++  java
  • 使用Seam Framework + JBoss 5.0 开发第一个Web应用

    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配置文件。整个开发过程通过注解即可完成大部分功能。
  • 相关阅读:
    在有多个input的表单当中按回车按钮,如何不自动提交表单,而触发某个按钮的事件
    login.jsp
    json数据源
    translation.js
    cookie.js
    i18next.min.js
    struts2拦截器实现原理
    proxy-target-class="true" 与proxy-target-class="false"的区别(声明事务的时候)
    NavLink
    【转载】target='_blank' 安全漏洞示例
  • 原文地址:https://www.cnblogs.com/riskyer/p/3279785.html
Copyright © 2011-2022 走看看