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

/*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() {}@NotNullpublic String getName(){return name;}public void setName(String name){this.name = name;}public String getPassword(){return password;}public void setPassword(String password){this.password = password;}
 
   public String getUsername(){return username;}public void setUsername(String username){this.username = username;}@Overridepublic 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;@Statelesspublic class RegisterAction implements Register
{注解 @In将Bean的一个属性标记为由Seam来注入。 在此例中,此属性由名为 user 的上下文变量注入(实例的变量名)。 
   private User user;@PersistenceContextprivate EntityManager em;@Loggerprivate 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.initjndiPattern 属性。这里需要奇怪的@符号是因为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/javaeehttp://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 实体的属性值。

转载于:https://www.cnblogs.com/cxccbv/archive/2009/01/25/1380876.html

SEAM学习(一)-----安装运行example相关推荐

  1. WEB编程学习之Windows安装运行Tomcat

    前言 本博客主要记录在学习web编程中,在Windows10系统下,安装运行Tomcat服务器,以及所遇到的常见问题以及解决方案. 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https ...

  2. window docker mysql_windows使用docker运行mysql等工具(二)安装运行mysql

    今天接着上一篇的内容继续来学习安装运行mysql.建议先阅读第一篇:windows安装docker 一 查看mysql版本 如果想知道mysql镜像具体有哪几个版本,需要去docker hub查看. ...

  3. python 安装pandas 权限不够_详解Python学习之安装pandas

    一.python pip的安装与使用 1.pip 是 python 包管理工具,该工具提供了对python 包的查找.下载.安装.卸载的功能. 目前如果你在 python.org 下载最新版本的安装包 ...

  4. MatConvNet深度学习工具箱安装教程

    MatConvNet深度学习工具箱安装教程 方法1 方法2 安装成功测试方法 安装matlab2020a: 安装Visual Studio 2017: 方法1 步骤1: 到官网http://www.v ...

  5. 要运行python程序要安装什么_windows下面如何安装运行python程序

    不管我们从事什么,总会遇到那么几个"难题",小编也是在不断的学习,那么今天我来讲:windows下面如何安装运行python程序? 工具/原料 电脑:联想拯救者Y7000 软件:P ...

  6. Kubernetes学习-K8S安装篇-Kubeadm安装高可用K8S集群

    Kubernetes学习-K8S安装篇-Kubeadm高可用安装K8S集群 1. Kubernetes 高可用安装 1.1 kubeadm高可用安装k8s集群1.23.1 1.1.1 基本环境配置 1 ...

  7. NVIDIA Jetson Nano主机的autoware的学习与demo运行-第1章-操作环境的搭建

    操作环境的搭建   计算机平台介绍 NVIDIA 在2019年NVIDIA GPU技术大会(GTC)上发布了Jetson Nano开发套件,这是一款售价99美元的计算机,现在可供嵌入式设计人员,研究人 ...

  8. 【慕伏白教程】《动手学深度学习》学习环境安装流程

    [慕伏白教程]<动手学深度学习>学习环境安装流程 一.Conda环境的安装 1. 安装Anaconda 二.安装CUDA 1. 下载相应CUDA版本 三.配置虚拟环境 1. 卸载虚拟环境 ...

  9. MapGIS IGServer开发平台学习版安装文档

    MapGIS IGServer开发平台学习版安装文档 准备工作:下载 第一部分:添加例外端口 第一步:打开防火墙 开始-->运行-->输入firewall.cpl-->确定 或者 开 ...

  10. AM5728开发深度学习之安装 caffe-jacinto

    AM5728开发深度学习之安装 caffe-jacinto--WizNote笔记 要先使用自己训练的模型,可以使用caffe和Tensorflow,但是使用TI的caffe-jacinto能让训练的模 ...

最新文章

  1. 数字图像处理:腐蚀与膨胀操作
  2. NDO中的ActiveRecord 简介 2——强类型的活动记录
  3. 开源大数据周刊-第15期
  4. Boost:返回报告错误report errors
  5. 【Leetcode | 6】136. 只出现一次的数字
  6. oracle ldap 配置,Ubuntu安装OpenLDAP之配置LDAP
  7. php读这文件速度,php 测试硬盘读写-php 测试硬盘写速率
  8. 加版S3(I747M)的4.4.2版本,可root
  9. php找零页面,找零问题
  10. sql获取服务器系统时间,SQL Server取系统当前时间
  11. 2018款联想Y7000 黑苹果外接显示器方案
  12. 算法之显著性检测《Saliency Detection: A Spectral Residual A》
  13. Meta-learning algorithms for Few-Shot Computer Vision 论文解读(二)
  14. poi导出excel文件加密处理
  15. 安卓学习专栏——百度地图(6)移动到我的位置(图文+代码)
  16. 艾永亮:时代的较量,谁在定义四个轮子的未来?
  17. 记录:捕鱼达人开发笔记
  18. Windows 下安装 Ubuntu 双系统
  19. 品牌零售号角吹响,开发B2C网站需要注意什么?
  20. early翻译_early是什么意思

热门文章

  1. Java分析股票涨跌走势
  2. Java+Selenium爬贴吧
  3. Java中字符串以小数点分割时无效,String s = “12.34“; String[] ss = split(“.“);分割结果为空
  4. 富满电子鸿蒙系统,电子行业周报:HARMONYOS+2.0助力AIOT生态体系发展
  5. python time strptime_Python中操作时间之strptime()方法的使用
  6. python二级多少分过_python二级操作题与分析(2)
  7. matlab的guide怎么添加函数,整理:matlab如何添加m_map工具箱
  8. Git工具 - 子模块
  9. Python 之字典常用方法
  10. 详解图的各种令人心慌的概念和四种图的存储结构(整理到吐)