`
zjt112g
  • 浏览: 25900 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

SEAM学习(一)-----安装运行example

    博客分类:
  • seam
阅读更多

1.下载jboss seam并解压

2.安装ant:解压bin版本,新建ANT_HOME,并将其bin目录添加到系统path

3.更改seam的build.properties,添加jboss.home D:\\DevelopTool\\jboss-4.2.2.GA。注意路径后边不能有空格

4.用cmd转到examples的registration目录下,运行ant deploy

5.浏览器:http://localhost:8080/seam-registration



分析:

user

//$Id: User.java 2360 2006-10-25 20:17:46Z gavin $
package org.jboss.seam.example.registration;

import static org.jboss.seam.ScopeType.SESSION;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

@Entity
@Name("user")//组件名称
@Scope(SESSION)//作用范围

/*Seam组件需要一个 组件名称,此名称由注解 @Name来指定。此名称必须在Seam应用内唯一。

当JSF用一个与组件同名的名称去请求Seam来解析上下文变量, 且该上下文变量尚未定义(null)时,

Seam就将实例化那个组件,并将新实例绑定给上下文变量。 在此例中,Seam将在JSF第一次遇到名为 user 的变量时实例化 User。

每当Seam实例化一个组件时,它就将始化后的实例绑定给组件中 默认上下文 的上下文变量。

默认的上下文由 @Scope注解指定。 User Bean是个会话作用域的组件。*/

@Table(name="users")
public class User implements Serializable
{
   private static final long serialVersionUID = 1881413500711441951L;
  
   private String username;
   private String password;
   private String name;
  
   public User(String name, String password, String username)
   {
      this.name = name;
      this.password = password;
      this.username = username;
   }
  
   public User() {}
  
   @NotNull
   public String getName()
   {
      return name;
   }

   public void setName(String name)
   {
      this.name = name;
   }
  
   @NotNull @Length(min=5, max=15) //hibernate校验
   public String getPassword()
   {
      return password;
   }

   public void setPassword(String password)
   {
      this.password = password;
   }
  
   @Id @NotNull @Length(min=5, max=15)//@NotNull 和 @Length 注解是

                   Hibernate Validator框架的组成部份,

    // Seam集成了Hibernate Validator并让你用它来作为数据校验。

   public String getUsername()
   {
      return username;
   }

   public void setUsername(String username)
   {
      this.username = username;
   }
  
   @Override
   public String toString()
   {
      return "User(" + username + ")";
   }
}



---------------------------------------------------------------------------------------------

register接口:

//$Id: Register.java 2056 2006-09-28 00:36:56Z gavin $
package org.jboss.seam.example.registration;

import javax.ejb.Local;

@Local
public interface Register
{
   public String register();
}



-----------------------------------------------------------------------------------------------

register action

//$Id: RegisterAction.java 5298 2007-06-20 00:08:47Z gavin $
package org.jboss.seam.example.registration;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;

@Stateless
@Name("register")//组件名称
public class RegisterAction implements Register
{

   @In //注解 @In将Bean的一个属性标记为由Seam来注入。 在此例中,此属性由名为 user 的上下文变量注入(实例的变量名)。

   private User user;
  
   @PersistenceContext
   private EntityManager em;
  
   @Logger
   private static Log log;
  
   public String register()
   {
      List existing = em.createQuery("select u.username from User u where u.username=#{user.username}")
         .getResultList();
     
      if ( existing.size()==0 )
      {
         em.persist(user);
         log.info("Registered new user #{user.username}");
         return "/registered.jspx";
      }
      else
      {
         FacesMessages.instance().add("User #{user.username} already exists");



//Seam提供了大量的 内置组件(built-in components) 来协助解决那些经常遇到的问题。

  用 FacesMessages 组件就可很容易地来显示模板化的错误或成功的消息。 内置的Seam组件还可由注入或通过调用 instance() 方法来获取。

         return null;

//多个JSF动作监听器方法返回一个字符串值的输出,它决定了接下来应显示的页面内容。

  空输出(或返回值为空的动作监听器方法)重新显示上一页的内容.
      }
   }

}

Seam组件需要一个 组件名称,此名称由注解 @Name来指定。此名称必须在Seam应用内唯一。当JSF用一个与组件同名的名称去请求Seam来解析上下文变量, 且该上下文变量尚未定义(null)时,Seam就将实例化那个组件,并将新实例绑定给上下文变量。 在此例中,Seam将在JSF第一次遇到名为 user 的变量时实例化 User。 每当Seam实例化一个组件时,它就将始化后的实例绑定给组件中 默认上下文 的上下文变量。默认的上下文由 @Scope注解指定。 User Bean是个会话作用域的组件。



页面:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:s="http://jboss.com/products/seam/taglib"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

   <head>
      <title>Register New User</title>
   </head>
   <body>
      <f:view>
         <h:form>
            <s:validateAll>这里的 <s:validateAll>标签是Seam特有的。

                            该JSF组件告诉JSF让它用实体Bean中所指定的Hibernat验证器注解来验证所有包含输入的字段。
               <h:panelGrid columns="2">
                  Username: <h:inputText value="#{user.username}" required="true"/>
                  Real Name: <h:inputText value="#{user.name}" required="true"/>
                  Password: <h:inputSecret value="#{user.password}" required="true"/>
               </h:panelGrid>
            </s:validateAll>
            <h:messages/>
            <h:commandButton value="Register" action="#{register.register}"/>
         </h:form>
      </f:view>
   </body>

</html>



registered

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core">

   <head>
      <title>Successfully Registered New User</title>
   </head>
   <body>
      <f:view>
         Welcome, #{user.name}, you are successfully registered as #{user.username}.
      </f:view>
   </body>

</html>



--------------------------------------------------------------------------------------------------------------------

部署描述文件:
(1)Seam组件部署描述文件:components.xml

如果你此前曾接触过许多的Java框架,你就会习惯于将所有的组件类放在某种XML文件中来声明,那些文件就会随着项目的不断成熟而不断加大到最终到不可收拾的地步。对于Seam应用,你尽可放心,因为它并不要求应用组件都要有相应的XML。大部份的Seam应用要求非常少量的XML即可,且XML文件大小不会随着项目的增大而快速增长。

无论如何,若能为 某些 组件(特别是Seam内置组件)提供某些 外部配置往往是有用的。这样一来,我们就有几个选择, 但最灵活的选择还是使用位于 WEB-INF 目录下的 components.xml 配置文件。 我们将用 components.xml 文件来演示Seam怎样在JNDI中找到EJB组件:

<components xmlns="http://jboss.com/products/seam/components"
            xmlns:core="http://jboss.com/products/seam/core">
     <core:init jndi-pattern="@jndiPattern@"/>
</components>

此代码配置了Seam内置组件 org.jboss.seam.core.init 的 jndiPattern 属性。这里需要奇怪的@符号是因为ANT脚本会在部署应用时将正确的JNDI语法在标记处自动填补
(2)Web部署描述文件:web.xml

我们将以WAR的形式来部署此小应用的表示层,因此需要web部署描述文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- Seam -->

    <listener>
        <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
    </listener>

    <!-- MyFaces -->

    <listener>
        <listener-class>
            org.apache.myfaces.webapp.StartupServletContextListener
        </listener-class>
    </listener>

    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Faces Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.seam</url-pattern>
    </servlet-mapping>

</web-app>

此 web.xml 文件配置了Seam和JSF。所有Seam应用中的配置与此处的配置基本相同。
(3)JSF配置:faces-config.xml

绝大多数的Seam应用将JSF来作为表示层。因而我们通常需要 faces-config.xml。SEAM将用Facelet定义视图表现层,所以我们需要告诉JSF用Facelet作为它的模板引擎。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config
PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
                            "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>

    <!-- A phase listener is needed by all Seam applications -->

    <lifecycle>
        <phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener>
    </lifecycle>

</faces-config>

注意我们不需要申明任何JSF managed Bean!因为我们所有的managed Bean都是通过经过注释的Seam组件。所以在Seam的应用中,faces-config.xml比原始的JSF更少用到。

实际上,一旦你把所有的基本描述文件配置完毕,你所需写的 唯一类型的 XML文件就是导航规则及可能的jBPM流程定义。对于Seam而言, 流程(process flow) 及 配置数据 是唯一真正属于需要XML定义的。

在此简单的示例中,因为我们将视图页面的ID嵌入到Action代码中,所以我们甚至都不需要定义导航规则。
(4)EJB部署描述文件:ejb-jar.xml

ejb-jar.xml 文件将 SeamInterceptor 绑定到压缩包中所有的会话Bean上,以此实现了Seam与EJB3的整合。

<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
         version="3.0">

   <interceptors>
     <interceptor>
       <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
     </interceptor>
   </interceptors>

   <assembly-descriptor>
      <interceptor-binding>
         <ejb-name>*</ejb-name>
         <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
      </interceptor-binding>
   </assembly-descriptor>

</ejb-jar>

(5)EJB持久化部署描述文件:persistence.xml

persistence.xml 文件告诉EJB的持久化层在哪找到数据源,该文件也含有一些厂商特定的设定。此例在程序启动时自动创建数据库Schema。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">
    <persistence-unit name="userDatabase">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/DefaultDS</jta-data-source>
      <properties>
         <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      </properties>
    </persistence-unit>
</persistence>



---------------------------------------------------------------------------------------------------------------------


工作原理

当提交表单时,JSF请求Seam来解析名为 user 的变量。由于还没有值绑定到 user 上(在任意的Seam上下文中), Seam就会实例化 user组件,接着把它保存在Seam会话上下文后,然后将 User 实体Bean实例返回给JSF。

表单输入的值将由在 User 实体中所指定的Hibernate验证器来验证。 若有非法输入,JSF就重新显示当前页面。否则,JSF就将输入值绑定到 User 实体Bean的字段上。

接着,JSF请求Seam来解析变量 register。 Seam在无状态上下文中找到 RegisterAction 无状态的会话Bean并把它返回。JSF随之调用 register() 动作监听器方法。

Seam拦截方法调用并在继续调用之前从Seam会话上下文注入 User 实体。

register() 方法检查所输入用户名的用户是否已存在。 若存在该用户名,则错误消息进入 facesmessages 组件队列,返回无效结果并触发浏览器重显页面。facesmessages 组件嵌在消息字符串的JSF表达式,并将JSF facesmessage 添加到视图中。

若输入的用户不存在,"/registered.jsp" 输出就会将浏览器重定向到 registered.jsp 页。 当JSF来渲染页面时,它请求Seam来解析名为 user 的变量,并使用从Seam会话作用域返回的 User 实体的属性值。
分享到:
评论

相关推荐

    Seam-Carving-Matlab-master.rar_boardkkc_seam_seam carving_seamca

    这个名为"Seam-Carving-Matlab-master.rar_boardkkc_seam_seam carving_seamca"的压缩包文件包含了Matlab实现的Seam Carving算法,非常适合学习和理解这一技术。 Seam Carving的基本思想是找到图像中的一条或几条...

    Algorithm-seam-carving-js.zip

    Algorithm-seam-carving-js.zip,seam-carver的javascript实现。seam carver是一种基于内容的图像缩放算法,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。

    mahmoudnafifi-seam-carving-b553f4e_709com_数字图像处理_seamcarving_

    标题“mahmoudnafifi-seam-carving-b553f4e_709com_数字图像处理_seamcarving_”所提及的主题是数字图像处理中的一个独特技术——Seam Carving(缝合雕刻)。Seam Carving是一种动态调整图像尺寸的方法,它能在保持...

    Seam in Action - MEAP - 2008

    8. **Seam 管理的事务和持久化 (Seam-Managed Transactions and Persistence)** - **事务管理**:Seam 自动处理事务的开始、提交或回滚,简化了事务管理的复杂性。 - **持久化支持**:Seam 提供了一系列工具和...

    Seam-gen生成基础项目骨架

    Seam-gen 是一款用于快速生成基于 Seam 框架的基础项目结构的工具,它通过简单的命令行交互式过程,帮助开发者构建项目的雏形,并且能够根据数据库信息自动生成管理数据库的 CRUD(Create, Read, Update, Delete)...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.6. 一个完整的Seam 应用程序:宾馆预订范例............................................................................................................ 45 1.6.1. 介绍......................................

    seam-carving-matlab.rar_seam carving_seamcarving_图像处理 matlab

    Seam Carving,又称为Seam Carving,是一种图像处理技术,主要用于图像的无损缩放和对象删除。这项技术的核心在于通过寻找能量最小的“接缝”(seams)来调整图像的尺寸,同时尽可能地保持图像的整体视觉效果。在...

    Seam Carving for Content-Aware Image Resizing(基于内容缩放图片的方法)

    2007年Shai Avidan 和Ariel Shamir论文《Seam Carving for Content-Aware Image Resizing》所提出方法的Matlab代码实现和作者的论文。 效果非常炫,而且代码不长

    seam-forge dist

    3. **验证安装**:通过运行`seam-forge --version`来检查是否正确安装和配置。 4. **开始使用**:接下来,可以使用`seam-forge`的各种命令来创建、构建和部署Seam项目。 五、优化与维护: 1. **跟踪更新**:由于是`...

    jboss-seam-selectitems

    java jboss seam jboss-seam-selectitems

    seam-carving

    在提供的压缩包文件`seam-carving-master`中,可能包含了以下内容: - 源代码文件:实现了接缝雕刻算法的C++代码,可能包括主程序、图像读取和写入、能量计算、接缝寻找等功能模块。 - 示例图像:用于测试算法效果的...

    seam-gen命令解析文档

    - **作用**:运行一个向导来设置`seam-gen/build.properties`文件中的属性,这些属性包括项目的工作目录、JBoss目录等,同时也可以设置关于代码生成的其他属性,如model、action和test使用的包名、数据库连接等信息...

    jbossseam eclipse安装 例子学习.doc

    - **下载文件**:jboss-seam-2.1.1.GA.zip 4. **JBoss Tools** - **下载地址**:[www.jboss.org/tools/download/index.html](http://www.jboss.org/tools/download/index.html) - **推荐版本**:3.0.0 CR1 - *...

    seam插件下载地址及安装过程

    将下载的 jboss-seam-2.0.0.GA.zip 解压,并修改 build.properties 文件,添加 jboss.home 指向你的 JBoss 服务器安装目录。这使得 Ant 能自动将应用部署到 JBoss 服务器。在 examples\booking 目录下运行 Ant 命令...

    如何部署seam的例子程序

    进入Seam安装目录`C:\jboss-seam-2.2.1.CR3\jboss-seam-2.2.1.CR3`,修改`build.properties`文件,添加一行`jboss.home=C:\\jboss-5.1.0.GA-jdk6\\jboss-5.1.0.GA`。 #### 五、部署示例程序 1. **部署并运行...

    seam-javapolis2007

    ### Seam-Javapolis2007 知识点解析 #### 标题解析 - **标题**:“seam-javapolis2007” - **解释**:此标题表明了内容是关于 Seam 框架在 2007 年 Javapolis 大会上的演示或演讲材料。Javapolis 是一个重要的 Java...

    seam-978-1-8471-9592-0:Seam 2.x 网页开发

    seam-978-1-8471-9592-0 Seam 2.x 网页开发

    Seam-Carving-canvas-demo:缝线雕刻算法的课堂演示

    在这个"Seam-Carving-canvas-demo"项目中,作者利用HTML5的Canvas API实现了这一算法的课堂演示。 Canvas是HTML5中的一个核心元素,它提供了一个二维图形绘制环境,允许开发者通过JavaScript动态创建和修改图像。在...

Global site tag (gtag.js) - Google Analytics