Linq学习笔记(16)- Min, Max, Average操作

by Kimi 18. November 2009 11:39

Kimi

示例1:

    简单的Min和Max操作。

    运行结果:

 

示例2:

    查询处字符串数组中,长度最大和最小的字符。

    显示结果:

 

示例3:

    在Group操作中使用Min 和 Max。

 

显示结果:

Average 的操作与Max 和 Min 相同,只是取平均值。

Tags:

技术文章

返回插入到标识列中的值(SCOPE_IDENTITY, IDENT_CURRENT 和 @@IDENTITY)

by Kimi 9. November 2009 16:09

Kimi

    在写SQL的时候,我们经常会遇到一种情况。那就是一个表中的某个列是自增的标识列,在插入记录到这个表后,我们需要返回这个标识列的值。

    我们通常都会习惯性的使用@@IDENTITY 来获得这个值。其实SQL Server 不只提供一个@@IDENTITY这个一个方式来获得新插入自增标识列的值,还有 SCOPE_IDENTITYIDENT_CURRENT 这两个函数。下面我们就来看看这个3个函数的区别,以及我们如何正确的选用它们。

    下面先给出MSDN上对这3个函数的描述:

@@IDENTITY

    返回最后插入的标识值的系统函数

备注:

    在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值。如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL。如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成的标识值。如果语句触发了一个或多个触发器,该触发器又执行了生成标识值的插入操作,那么,在语句执行后立即调用 @@IDENTITY 将返回触发器生成的最后一个标识值。如果对包含标识列的表执行插入操作后触发了触发器,并且触发器对另一个没有标识列的表执行了插入操作,则 @@IDENTITY 将返回第一次插入的标识值。出现 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或者事务被回滚的情况时,@@IDENTITY 值不会恢复为以前的设置。

 

SCOPE_IDENTITY()

    返回插入到同一作用域中的标识列内的最后一个标识值。一个范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

备注:

    SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

 

IDENT_CURRENT

    返回为某个会话和作用域中指定的表或视图生成的最新的标识值。

备注:

    IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。在空表中调用 IDENT_CURRENT 函数时,此函数将返回 NULL。

 

    从MSDN上看,这3个函数的主要区别就是一个会话和作用域的问题:

  • IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。
  • @@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
  • SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。

 

    接下来,我们需要通过示例来看看这个3个函数的区别

-- 创建一个表TA, 为它定义一个自增列ID, 默认这个列是从开始自增.

CREATE TABLE TA(ID int IDENTITY);

-- 创建另一个表TB, 为它定义一个自增列ID, 设置这个列是从开始自增.

CREATE TABLE TB(ID int IDENTITY(100,1));

GO

-- 为表TA 创建一个INSERT的出发器,让给TA 表插入数据后, 给TB 表也插入数据.

CREATE TRIGGER TA_INSERT ON TA FOR INSERT

AS

BEGIN

INSERT TB DEFAULT VALUES

END;

GO

 

SELECT * FROM TA;

--ID is empty.

 

SELECT * FROM TB;

--ID is empty.

 

-- 在一个会话(session)中运行这些语句. --------------------

-- 向TA表插入一条默认记录.

INSERT TA DEFAULT VALUES;

SELECT @@IDENTITY;

/* 返回的值是100. 因为使用的是@@IDENTITY, 它得到的结果是触发器执行的插入数据到TB表后返回的标识列的值.*/

 

SELECT SCOPE_IDENTITY();

/* 返回的值是1. 因为向TA表插入的一条记录, 然而SCOPE_IDENTITY()是不能垮作用域的,那么它只获得插入TA表操作时返回的标识列的值.*/

 

SELECT IDENT_CURRENT('TB');

/* 返回插入TB表的标识列的值, 100.*/

 

SELECT IDENT_CURRENT('TA');

/* 返回插入TA表的标识列的值, 1.*/

 

-- 在另一个会话(session)中运行这些语句.

SELECT @@IDENTITY;

/* 返回的是NULL, 因为当前会话(session)中没有插入操作.*/

 

SELECT SCOPE_IDENTITY();

/* 返回的是NULL, 因为当前会话(session)当前作用域中没有插入操作*/

 

SELECT IDENT_CURRENT('TB');

/* 返回最后插入TB表的标识列的值, 100.*/

 

注意的一点是,作用域指的是一个模块:存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。我们来看一个示例:

-- 创建一个存储过程, 其功能就是往TA表插入一条记录

CREATE PROCEDURE usp_ins_TA

AS

BEGIN

    INSERT TA DEFAULT VALUES;

END

 

-- 插入一条记录到TA表.

INSERT TA DEFAULT VALUES;

-- 调用存储过程插入一条记录到TA表.

EXECUTE usp_ins_TA;

 

SELECT @@IDENTITY;

/* 返回的结果是2, 因为执行了两次插入操作. */

 

SELECT SCOPE_IDENTITY();

/* 返回的结果是1, 因为尽管执行了两次操作, 但是第二次操作是调用一个存储过程, 那么它属于另一个范围内. */

 

SELECT IDENT_CURRENT('TA');

/* 返回的结果是2, 因为执行了两次插入操作. */

 

通过这两个示例,我想大家应该明白了这个3个函数的用法。(Kimi 2009-03-25)

Tags:

技术文章

Linq学习笔记(15)- Sum操作

by Kimi 9. November 2009 09:19

Kimi Yang

示例1:

    通过Sum计算出数组的和。

    运行结果为:

 

示例2:

    计算出字符串数组中的所有的字母个数。

运行结果为:

 

示例3:

    在Group中使用Sum

    运行结果为:

Tags:

技术文章

lLinq学习笔记(14)- Count操作

by Kimi 4. November 2009 09:07

Kimi Yang

示例1:

    使用Count,统计数组中的元素个数。

    运行结果:

 

示例2:

    带条件的Count, 统计数组中的奇数个数。

运行结果:

 

示例3:

    嵌套的Count。

运行结果:

 

示例4:

    在Group中使用Count。

    运行结果:

Tags:

技术文章

自己写的用泛型简化代码的例子

by Lancer 31. October 2009 17:29

 

泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

    泛型在使用中还有一些规则和限制:
    1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
    2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
    3、泛型的类型参数可以有多个。
    4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
    5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(Java.lang.String)

 

Base Service 类:

Java代码 
  1. import java.io.Serializable;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4.   
  5. import javax.persistence.EntityManager;  
  6. import javax.persistence.Query;  
  7.   
  8. import org.jboss.seam.annotations.In;  
  9.   
  10.   
  11. public class BaseService implements Serializable {  
  12.     private static final long serialVersionUID = 232790306929537427L;  
  13.   
  14.     @In  
  15.     EntityManager em;  
  16.   
  17.     protected EntityManager getEntityManager() {  
  18.         return em;  
  19.     }  
  20.   
  21.     protected <T> void persist(T t) {  
  22.         getEntityManager().persist(t);  
  23.     }  
  24.   
  25.     protected <T> void update(T t) {  
  26.         getEntityManager().merge(t);  
  27.     }  
  28.   
  29.     protected <T> void remove(T t) {  
  30.         getEntityManager().remove(t);  
  31.     }  
  32.   
  33.     @SuppressWarnings("unchecked")  
  34.     protected <T> T getEntityById(String namedQuery, String queryKey, int keyId) {  
  35.         T t;  
  36.         Query q = getEntityManager().createNamedQuery(namedQuery);  
  37.         q.setParameter(queryKey, keyId);  
  38.         t = (T) q.getSingleResult();  
  39.   
  40.         return t;  
  41.     }  
  42.       
  43.     @SuppressWarnings("unchecked")  
  44.     protected <T> List<T> findResults(String querysql){  
  45.         List<T> tl = new ArrayList<T>();  
  46.           
  47.         tl = (List<T>)getEntityManager().createQuery(querysql).getResultList();  
  48.           
  49.         return tl;  
  50.     }  
  51. }   

具体实现类:

 

Java代码 
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import org.jboss.seam.annotations.Name;  
  4.   
  5. import com.apj.epm.model.Customer;  
  6. import com.apj.epm.model.Project;  
  7. import com.apj.epm.vo.ProjectVO;  
  8.   
  9. @Name("projectService")  
  10. public class ProjectService extends BaseService {  
  11.     private static final long serialVersionUID = -4134390648777536330L;  
  12.   
  13.     public List<ProjectVO> findAllProjects(String customerId,  
  14.             String projectName, String abbrProjectName) {  
  15.         List<ProjectVO> pl = new ArrayList<ProjectVO>();  
  16.   
  17.         String querysql = "";  
  18.   
  19.         if (projectName != null) {  
  20.             if (projectName.length() > 0)  
  21.                 querysql += "AND PROJECT_NAME like '" + projectName + "' ";  
  22.         }  
  23.   
  24.         if (abbrProjectName != null) {  
  25.             if (abbrProjectName.length() > 0)  
  26.                 querysql += "AND ABBR_PROJECT_NAME like '" + abbrProjectName  
  27.                         + "' ";  
  28.         }  
  29.   
  30.         querysql = "select p from Project p where (CUSTOMER_ID = " + customerId + " or 0=" + customerId + ") "  
  31.                 + querysql;  
  32.           
  33.         List<Project> pml = this.findResults(querysql);  
  34.   
  35.         for (Project p : pml) {  
  36.             pl.add(new ProjectVO(p));  
  37.         }  
  38.         return pl;  
  39.     }  
  40.   
  41.     public void Save(ProjectVO p) {  
  42.         Project newProject;  
  43.         Customer c;  
  44.   
  45.         c = this.getEntityById("Customer.findCustomerById""customerId", p  
  46.                 .getCustomer().getCustomerId());  
  47.   
  48.         newProject = new Project(p.getPiNo(), p.getProjectName(), p  
  49.                 .getAbbrProjectName(), c, p.getProjectType(), p  
  50.                 .getProjectStatus(), p.getProjectNature(),  
  51.                 p.getSystemManager(), p.getGroupBy());  
  52.   
  53.         this.persist(newProject);  
  54.     }  
  55.   
  56.     public void UpdateProject(ProjectVO p) {  
  57.         Project newProject;  
  58.           
  59.         newProject =this.getEntityById("Project.findProjectById""projectId", p.getProjectId());  
  60.           
  61.         Customer c;  
  62.   
  63.         c = this.getEntityById("Customer.findCustomerById""customerId", p  
  64.                 .getCustomer().getCustomerId());  
  65.   
  66.         newProject.setAbbrProjectName(p.getAbbrProjectName());  
  67.         newProject.setCustomer(c);  
  68.         newProject.setGroupBy(p.getGroupBy());  
  69.         newProject.setPiNo(p.getPiNo());  
  70.         newProject.setProjectName(p.getProjectName());  
  71.         newProject.setProjectNature(p.getProjectNature());  
  72.         newProject.setProjectStatus(p.getProjectStatus());  
  73.         newProject.setProjectType(p.getProjectType());  
  74.         newProject.setSystemManager(p.getSystemManager());  
  75.   
  76.         this.update(newProject);  
  77.     }  
  78.   
  79.     public void RemoveProject(ProjectVO p) {  
  80.         Project newProject;  
  81.           
  82.         newProject =this.getEntityById("Project.findProjectById""projectId", p.getProjectId());  
  83.   
  84.         this.remove(newProject);  
  85.     }  
  86. }  

 

 

 

Tags: , , ,

技术文章

Visual Studio 2010 Beta2 抢先体验

by Kimi 23. October 2009 10:40

Kimi Yang

Microsoft在10月21日发布了Visual Studio 2010 Beta2 的测试版。在Visual Studio 2010 的产品系列中,分为如下几个版本:

  • Microsoft® Visual Studio 2010 Professional Edition
  • Microsoft® Visual Studio 2010 Premium Edition
  • Microsoft® Visual Studio 2010 Ultimate Edition

 

今天我就来尝试安装和试用一下Visual Studio 2010 Beta2。首先是在官方网站上下载了安装的ISO文件,由于里面没有包括MSDN帮助文件,所以只有2.3G左右。

把ISO 加载入虚拟光驱,运行安装。

貌似一点也不省空间。

去掉了几个不用的选项,貌似还是很大,而且占用的是C盘,o(╯□╰)o。

不管那么多了,开始安装。(中间没有步骤提示输入序列号)

现在可以去泡杯茶喝了……

当安装完.Net Framework 4.0 Beta 2的时候,系统提示重启。

 

终于安装完成了,现在启动看看,启动的等待画面还真不错!

图标也变了样了。

挺不错的,现在来看看IDE界面。启动界面也不一样了。

由于VS2010的IDE界面是使用WPF技术来创建,所有在Vista,Windows 7这样的系统中,效果会非常好。

新建项目中,跟2008一样,可以选择其它.NET平台的版本进行开发。

2010的另一个亮点,就是提供一个动态语言F#,由于我不太了解,就不多说了。

我们主要关注的还是Web开发,所以在Web项目中,多了MVC2这个版本。

OK,今天的安装非常成功,今后在学习中有些什么新玩意儿,会第一时间给大家分享。

Tags:

技术文章

JSF+Facelets+Seam需要加载的jar包及关键配置

by Lancer 23. October 2009 10:30

在\WebContent\WEB-INF\lib\下面应该有一下jar包

commons-beanutils.jar

commons-collections.jar

commons-digester.jar

commons-lang.jar

commons-logging.jar

jboss-el.jar

jboss-seam-debug.jar

jboss-seam-ui.jar

jboss-seam.jar

jsf-facelets.jar

richfaces-api.jar

richfaces-impl.jar

richfaces-ui.jar

 

持久层数据源 epmWeb-ds.xml 应放入部署目录,特别要注意的是jndi-name的配置,在persistence.xml要用到的:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE datasources
PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
"http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
<datasources>
<local-tx-datasource>
<jndi-name>epmWeb</jndi-name>
<connection-url>jdbc:sqlserver://192.168.0.10:1433;databaseName=××</connection-url>
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
<user-name>××</user-name>
<password>×××××</password>
</local-tx-datasource>
</datasources>

 在src\META-INF\下面放入persistence.xml。要注意non-jta-data-source是数据源里面配置 的,jboss.entity.manager.factory.jndi.name是seam组件components.xml里面配置生成的。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
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">

<persistence-unit name="epmJPA" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:/epmWeb</non-jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="jboss.entity.manager.factory.jndi.name"
value="java:/epmJPAEntityManagerFactory" />
</properties>
</persistence-unit>
</persistence>

在\WebContent\WEB-INF\下放入components.xml

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:core="http://jboss.com/products/seam/core" xmlns:persistence="http://jboss.com/products/seam/persistence"
xmlns:transaction="http://jboss.com/products/seam/transaction"
xmlns:security="http://jboss.com/products/seam/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd
http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.1.xsd
http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.1.xsd
http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd
http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd">

<core:manager conversation-timeout="120000"
concurrent-request-timeout="500" conversation-id-parameter="cid" />

<transaction:entity-transaction
entity-manager="#{em}" />

<persistence:entity-manager-factory
name="epmJPA" installed="true" />

<!--
If Seam loads the persistence unit (JBoss 4.x), the
EntityManagerFactory will be resolved from #{bookingDatabase}. On
JBoss AS 5, the EntityManagerFactory is retrieved from JNDI (the
binding occurs during application deployment).
-->

<persistence:managed-persistence-context
name="em" auto-create="true" entity-manager-factory="#{epmJPA}"
persistence-unit-jndi-name="java:/epmJPAEntityManagerFactory" />

<security:identity authenticate-method="#{authenticator.authenticate}" />
</components>

 在\WebContent\WEB-INF\下放入pages.xml。

<?xml version="1.0" encoding="UTF-8"?>
<pages xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.1.xsd">
</pages>

 修改\WebContent\WEB-INF\web.xml:

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

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>

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

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

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

<context-param>
<param-name>org.richfaces.SKIN</param-name>
<param-value>blueSky</param-value>
</context-param>

<context-param>
<param-name>org.richfaces.CONTROL_SKINNING</param-name>
<param-value>enable</param-value>
</context-param>

<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>

<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>

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

<filter>
<display-name>RichFaces Filter</display-name>
<filter-name>richfaces</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>

<filter-mapping>
<filter-name>richfaces</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>

<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>

Tags: , ,

技术文章

Simple JSF application with facelets

by Lancer 17. October 2009 21:16

1. 把 jsf-facelets.jar 拷贝到 WEB-INF/lib 目录(在应用程序部署时,它最终必须放在 WEB-INF/lib 目录中)。

2. 把 Facelet 初始化参数添加到 web.xml 文件中。
在web.xml里面添加以下参数:
<context-param>
  <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
   <param-value>.xhtml</param-value>
</context-param>
这告诉 JSF 采用 xhtml 前缀,Facelet 渲染器能够解释这个前缀。

3. 把 FaceletViewHandler 添加到 faces-config.xml 文件中。
通过添加以下视图处理器到 faces-config.xml 中,就把 Facelets 插进了 JSF 中:

<application>
    <locale-config>
        <default-locale>en</default-locale>
    </locale-config>
    <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>

4. 制作Facelets模板相当于.net的master page

<!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:ui="http://java.sun.com/jsf/facelets">

<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" />
<title>Enterprise Project Management System</title>
</head>
<body>
<!-- tabpanel begin -->
<ui:insert name="content">content</ui:insert>
<!-- tabpanel end -->
</body>
</html>

5. 制作页面并使用模板

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

<ui:composition template="/commons/templates/main.xhtml">
    <ui:define name="content">
        <f:view>
            <a4j:form>
                <rich:panel header="RichFaces Greeter" style="width: 315px">
                    <h:outputText value="Your name: " />
                    <h:inputText value="#{user.name}">
                        <f:validateLength minimum="1" maximum="30" />
                    </h:inputText>
                    <a4j:commandButton value="Get greeting" reRender="greeting" />

                    <h:panelGroup id="greeting">
                        <h:outputText value="Hello, " rendered="#{not empty user.name}" />
                        <h:outputText value="#{user.name}" />
                        <h:outputText value="!" rendered="#{not empty user.name}" />
                    </h:panelGroup>
                </rich:panel>
            </a4j:form>
        </f:view>
    </ui:define>
</ui:composition>
</html>

参考 : http://www.ibm.com/developerworks/cn/java/j-facelets/

 

Tags: ,

技术文章

Simple JSF application with RichFaces

by Lancer 17. October 2009 10:31

"RichFaces Greeter"—the simple application—is hello-world like application but with one difference: the world of RichFaces will say "Hello!" to user first.
Create standard JSF 1.2 project with all necessary libraries; name the project "Greeter" and follow the decription.

1. Adding RichFaces libraries into the project

Copy following "jars" from lib folder to WEB-INF/lib folder of "Greeter" JSF application.

commons-beanutils.jar
commons-collections.jar
commons-digester.jar
commons-logging.jar
jhighlight-1.0.jar
richfaces-api-3.3.2.SR1.jar
richfaces-impl-3.3.2.SR1.jar
richfaces-ui-3.3.2.SR1.jar

2. Registering RichFaces in web.xml

After RichFaces libraries where added into the project it is necessary to register them in project web.xml file. Add following lines in web.xml:

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

<welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>server</param-value> </context-param>

<context-param> <param-name>org.richfaces.SKIN</param-name> <param-value>blueSky</param-value> </context-param>

<context-param> <param-name>org.richfaces.CONTROL_SKINNING</param-name> <param-value>enable</param-value> </context-param>

<filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter>

<filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>

<listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener>

<!-- Faces Servlet --> <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>*.jsf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/* </url-pattern> </servlet-mapping>

<login-config> <auth-method>BASIC</auth-method> </login-config>

</web-app>

3. Managed bean

The "RichFaces Greeter" application needs a managed bean. In project JavaSource folder create a new managed bean with name user in demo package and paste there the following simple code:

package com.apj.epm.demo;

public class User { private String name = "";

public String getName() { return name; }

public void setName(String name) { this.name = name; } }

4. Registering bean in faces-cofig.xml

With the next step the user bean should be registered in faces-config.xml file:

<?xml version="1.0" encoding="UTF-8"?> <faces-config 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-facesconfig_1_2.xsd" version="1.2"> <managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class>com.apj.epm.demo.User</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>name</property-name> <property-class>java.lang.String</property-class> <value></value> </managed-property> </managed-bean> </faces-config>

5. RichFaces Greeter index.jsp

The "RichFaces Greeter" application has only one JSP page. Create index.jsp page in root of WEB CONTENT folder and add there following code:

<?xml version="1.0" encoding="ISO-8859-1" ?> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <!-- RichFaces tag library declaration --> <%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%> <%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>

<!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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <title>RichFaces Greeter</title> </head> <body> <f:view> <a4j:form> <rich:panel header="RichFaces Greeter" style="width: 315px"> <h:outputText value="Your name: " /> <h:inputText value="#{user.name}"> <f:validateLength minimum="1" maximum="30" /> </h:inputText> <a4j:commandButton value="Get greeting" reRender="greeting" />

<h:panelGroup id="greeting"> <h:outputText value="Hello, " rendered="#{not empty user.name}" /> <h:outputText value="#{user.name}" /> <h:outputText value="!" rendered="#{not empty user.name}" /> </h:panelGroup> </rich:panel> </a4j:form> </f:view> </body> </html>

The application uses three RichFaces components: <rich:panel> is used as visual container for information;<a4j:commandButton> with built-in Ajax support allows rendering a greeting dynamically after a response comes back and <a4j:form> helps the button to perform the action.
Note, that the RichFaces tag library should be declared on each JSP page.

6. Welcome Page - index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Refresh" content="0;url=index.jsf" > <title>Enterprise Project Management System</title> </head> <body>

</body> </html>

7. Deploy and show result

Tags: ,

技术文章

PO VO BO DTO POJO DAO解释

by Lancer 16. October 2009 16:40

PO :persistent object持久对象
1 .有时也被称为Da

ta对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。
2 .在hibernate持久化框架中与insert/delet操作密切相关。
3 .PO中不应该包含任何对数据库的操作。
---------------------------------------------------------
POJO :plain ordinary java object 无规则简单java对象
一个中间对象,可以转化为PO、DTO、VO。
1 .POJO持久化之后==〉PO
(在运行期,由Hibernate中的cglib动态把POJO转换为PO,PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。PO对于programmer来说完全透明,由于是运行期生成PO,所以可以支持增量编译,增量调试。)
2 .POJO传输过程中==〉DTO
3 .POJO用作表示层==〉VO
PO 和VO都应该属于它。
----------------------------------------------------------
BO :business object 业务对象
封装业务逻辑为一个对象(可以包括多个PO,通常需要将BO转化成PO,才能进行数据的持久化,反之,从DB中得到的PO,需要转化成BO才能在业务层使用)。
关于BO主要有三种概念
1 、只包含业务对象的属性;
2 、只包含业务方法;
3 、两者都包含。
在实际使用中,认为哪一种概念正确并不重要,关键是实际应用中适合自己项目的需要。
----------------------------------------------------------
VO :value object值对象 / view object表现层对象
1 .主要对应页面显示(web页面/swt、swing界面)的数据对象。
2 .可以和表对应,也可以不,这根据业务的需要。
注 :在struts中,用ActionForm做VO,需要做一个转换,因为PO是面向对象的,而ActionForm是和view对应的,要将几个PO要显示的属性合成一个ActionForm,可以使用BeanUtils的copy方法。
----------------------------------------------------------
DTO (TO) :Data Transfer Object数据传输对象
1 .用在需要跨进程或远程传输时,它不应该包含业务逻辑。
2 .比如一张表有100个字段,那么对应的PO就有100个属性(大多数情况下,DTO 内的数据来自多个表)。但view层只需显示10个字段,没有必要把整个PO对象传递到client,这时我们就可以用只有这10个属性的DTO来传输数 据到client,这样也不会暴露server端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。
----------------------------------------------------------
DAO :data access object数据访问对象
1 .主要用来封装对DB的访问(CRUD操作)。
2 .通过接收Business层的数据,把POJO持久化为PO。

Tags: , , , , ,

技术文章

Copyright © 2009 APJ Software

最新评论

Comment RSS

公告

欢迎使用APJ Blog!

日历

<<  February 2012  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

View posts in large calendar