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

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: , , ,

技术文章

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: , , , , ,

技术文章

How To: Prevent Cross-Site Scripting in ASP.NET

by Lancer 27. September 2009 15:02

Applies To

  • ASP.NET version 1.1
  • ASP.NET version 2.0

Summary

This How To shows how you can help protect your ASP.NET applications from cross-site scripting attacks by using proper input validation techniques and by encoding the output. It also describes a number of other protection mechanisms that you can use in addition to these two main countermeasures.

Cross-site scripting (XSS) attacks exploit vulnerabilities in Web page validation by injecting client-side script code. Common vulnerabilities that make your Web applications susceptible to cross-site scripting attacks include failing to properly validate input, failing to encode output, and trusting the data retrieved from a shared database. To protect your application against cross-site scripting attacks, assume that all input is malicious. Constrain and validate all input. Encode all output that could, potentially, include HTML characters. This includes data read from files and databases.

Contents

Objectives
Overview
Summary of Steps
Step 1. Check That ASP.NET Request Validation Is Enabled
Step 2. Review ASP.NET Code That Generates HTML Output
Step 3. Determine Whether HTML Output Includes Input Parameters
Step 4. Review Potentially Dangerous HTML Tags and Attributes
Step 5. Evaluate Countermeasures
Additional Considerations
Additional Resources

Objectives

  • Understand the common cross-site scripting vulnerabilities in Web page validation.
  • Apply countermeasures for cross-site scripting attacks.
  • Constrain input by using regular expressions, type checks, and ASP.NET validator controls.
  • Constrain output to ensure the browser does not execute HTML tags that contain script code.
  • Review potentially dangerous HTML tags and attributes and evaluate countermeasures.

详细内容请阅读: http://msdn.microsoft.com/en-us/library/ms998274(classic).aspx

Tags: ,

软件安全

JSF Demo Project (Study notes)

by Lancer 24. September 2009 15:13

JSF - JavaServer Faces Technology

系统安装:
1) 安装并配置 JDK 1.5 or above
2) 安装 Eclipse IDE for Java EE Developers
3)   安装 JBOSS

1) 在磁盘上创建一个文件夹用来存放项目:
例如: E:\Development\Study\ForShow\JSF
2)打开Eclipse,工作空间选择刚刚创建的文件夹。


3)关掉欢迎界面后,在项目浏览器中右键新建动态Web项目:


4) 填写项目名称,并新建目标服务器(新建刚刚安装的JBOSS服务器),配置选择JSF1.2:


5)按下一步,(JAVA)下一步,(Web Module)下一步,(JSF Capabilities):


6) 选择Disable Library Configuration, 点击完成。


7)项目创建成功。


8)修订配置:/myJSF/WebContent/WEB-INF/Web.xml. 添加servlet-mapping到*.JSF


9) 在/myJSF/WebContent/WEB-INF/下面创建一个index.html来作为启示页。
10)在JAVA Resource:src下面新建一个package和类:

UserBean.java
package apj.myJSF;

public class UserBean {
private String name;
private String password;
private String errMessage;

public UserBean() {
this.name = "";
this.password = "";
this.errMessage = "";
}

public UserBean(String name, String password) {
this.name = name;
this.password = password;
this.errMessage = "";
}

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

public String getName() {
return name;
}

public void setPassword(String password) {
this.password = password;
}

public String getPassword() {
return password;
}

public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
}

public String getErrMessage() {
return errMessage;
}

public String verify() {
if (!name.equals("Lancer") || !password.equals("123456")) {
errMessage = "Name or password is not correct : ";
errMessage = errMessage + name + "|" + password;
return "failure";
} else {
return "success";
}
}
}

11) 在/myJSF/WebContent/目录下创建login.jsp文件。

login.jsp
"text/html;charset=Big5"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<f:view>
<h:form>
<h3>Please input your name</h3>
<h:outputText value="#{user.errMessage}"/><p>
Name: <h:inputText value="#{user.name}"/><p>
Password: <h:inputSecret value="#{user.password}"/><p>
<h:commandButton value="Login" action="#{user.verify}"/>
</h:form>
</f:view>
</body>
</html>

12) 在/myJSF/WebContent/目录下创建welcome.jsp文件。

welcome.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@page contentType="text/html;charset=Big5"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<f:view>
Hello <h:outputText value="#{user.name}"/>!
<h3>Welcome JavaServer Faces!</h3>
</f:view>
</body>
</html>

13)打开/myJSF/WebContent/WEB-INF/faces-config.xml 的源码视图,添加login.jsp到welcome.jsp的控制,以及UserBean的注册。

faces-config.xml
<?xml version="1.0"?>
<!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>
<navigation-rule>
<from-view-id>/longin.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/welcome.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/longin.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>
apj.myJSF.UserBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>

14)修改index.html,添加一个link到login.jsf.
<a href="login.jsf">login.jsf</a>

15)运行myJSF项目(Run on Server).

 

Tags: ,

技术文章

一个高级乞丐的营销方法

by Lancer 18. September 2009 12:45

      我拎着刚买的levi’s从茂业出来,站在门口等一个朋友。一个职业乞丐发现了我,非常专业的、径直的停在我面前。这一停,于是就有了后面这个让我深感震撼的故事,就象上了一堂生动的市场调查案例课。为了忠实于这个乞丐的原意,我凭记忆尽量重复他原来的话。 “先生……行行好,给点吧。”我一时无聊便在口袋里找出一个硬币扔给他并同他攀谈起来。 乞丐很健谈。“……我只在华强北一带乞讨,你知道吗?我一扫眼就见到你。在茂业买levi’s,一定舍得花钱……” “哦?你懂的蛮多嘛!”我很惊讶。 “做乞丐,也要用科学的方法。”他说。 我一愣,饶有兴趣地问“什么科学的方法?” “你看看我和其他乞丐有什么不同的地方先?”我仔细打量他,头发很乱、衣服很破、手很瘦,但都不脏。 他打断我的思考,说:“人们对乞丐都很反感,但我相信你并没有反感我,这点我看的出来。这就是我与其他乞丐的不同之处。” 我点头默认,确实不反感,要不我怎么同一个乞丐攀谈起来。 “我懂得swot分析,优势、劣势、机会和威胁。对于我的竞争对手,我的优势是我不令人反感。机会和威胁都是外在因素,无非是深圳人口多和深圳将要市容整改等。” “我做过精确的计算。这里每天人流上万,穷人多,有钱人更多。理论上讲,我若是每天向每人讨1块钱,那我每月就能挣30万。但是,并不是每个人都会给,而且每天也讨不了这么多人。所以,我得分析,哪些是目标客户,哪些是潜在客户。”他润润嗓子继续说,“在华强北区域,我的目标客户是总人流量的3成,成功几率70%。潜在客户占2成,成功几率50%;剩下5成,我选择放弃,因为我没有足够的时间在他们身上碰运气。” “那你是怎样定义你的客户呢?”我追问。 “首先,目标客户。就像你这样的年轻先生,有经济基础,出手大方。另外还有那些情侣也属于我的目标客户,他们为了在异性面前不丢面子也会大方施舍。其次,我把独自一人的漂亮女孩看作潜在客户,因为她们害怕纠缠,所以多数会花钱免灾。这两类群体,年龄都控制在20~30岁。年龄太小,没什么经济基础;年龄太大,可能已结婚,财政大权掌握在老婆手中。这类人,根本没戏,恨不得反过来找我要钱。” “那你每天能讨多少钱。”我继续问。 “周一到周五,生意差点,两百块左右吧。周末,甚至可以讨到四、五百。” “这么多?” 见我有些怀疑,他给我算了一笔帐。“和你们一样,我也是每天工作8小时,上午11点到晚上7点,周末正常上班。我每乞讨1次的时间大概为5秒钟,扣除来回走动和搜索目标的时间,大概1分钟乞讨1次得1块钱,8个小时就是480块,再乘以成功几率60%[(70% 50%)÷2],得到将近300块。” “千万不能黏着客户满街跑。如果乞讨不成,我决不死缠滥打。因为他若肯给钱的话早就给了,所以就算腆着脸纠缠,成功的机会还是很小。不能将有限的时间浪费在无施舍欲望的客户身上,不如转而寻找下一个目标。” 强!这个乞丐听上去真不可貌相,倒像是一位资深的市场营销总监。 “你接着说。”我更感兴趣了,看来今天能学到新的东西了。 “有人说做乞丐是靠运气吃饭,我不以然。给你举个例子,女人世界门口,一个帅气的男生,一个漂亮的女孩,你选哪一个乞讨?” 我想了想,说不知道。 “你应该去男的那儿。身边就是美女,他不好意思不给。但你要去了女的那边,她大可假装害怕你远远地躲开。” “再给你举个例子。那天cocopark门口,一个年轻女孩,拿着一个购物袋,刚买完东西;还有一对青年男女,吃着冰淇淋;第三个是衣着考究的年轻男子,拿着笔记本包。我看一个人只要3秒钟,我毫不犹豫地走到女孩面前乞讨。女孩在袋子里掏出两个硬币扔给我,并奇怪我为什么只找她乞讨。我回答说,那对情侣,在吃东西,不方便掏钱;那个男的是高级白领,身上可能没有零钱;你刚从超市买东西出来,身上肯定有零钱。” 有道理!我越听越有意思。 “所以我说,知识决定一切!”我听十几个总裁讲过这句话,第一次听乞丐也这么说。 “要用科学的方法来乞讨。天天躺在天桥上,怎么能讨到钱?走天桥的都是行色匆匆的路人,谁没事走天桥玩,爬上爬下的多累。要用知识武装自己,学习知识可以把一个人变得很聪明,聪明的人不断学习知识就可以变成人才。21世纪最需要的是什么?就是人才。” “有一次,一人给我50块钱,让我替他在楼下喊‘安红,我想你’,喊100声。我一合计,喊一声得花5秒钟,跟我乞讨一次花费的时间相当,所得的酬劳才5毛钱,于是我拒绝了他。” “在深圳,一般一个乞丐每月能讨个千儿八百。运气好时的大概两千多点。全深圳十万个乞丐,大概只有十个乞丐,每月能讨到一万以上。我就是这万里挑一中的一个。而且很稳定,基本不会有很大的波动。” 太强了!我越发佩服这个乞丐了。 “我常说我是一个快乐的乞丐。其他乞丐说是因为我讨的钱多,所以快乐。我对他们说,你们正好错了。正是因为我有快乐、积极的心态,所以讨的钱多。” 说的多好啊! “乞讨就是我的工作,要懂得体味工作带来的乐趣。雨天人流稀少的时候,其他乞丐都在抱怨或者睡觉。千万不要这样,用心感受一下这坐城市的美。晚上下班后带着老婆孩子逛街玩耍看夜景,一家三口其乐融融,也不枉此生了。若是碰到同行,有时也会扔个硬币,看着他们高兴的道谢走开,就仿佛看见自己的身影。” “你还有老婆孩子?”我不禁大声赞叹,引来路人侧目。 “我老婆在家做全职太太,孩子念小学。我在福田区按揭了一套房,十年分期,还差六年就还清了。我要努力挣钱,供我儿子读大学念市场营销专业,然后子承父业当一个比我更出色的乞丐。” “我5年前在微软中华大区做市场策划,2年前升为营销经理,月薪5千。那时按揭了一台1万多的***笔记本,每个月还款2千,要死要活的。后来我想这样永远也出不了头,就辞职不干了,下海来做乞丐,我愿意做一个高素质的乞丐。” 听完,我激动地说:“你有没有兴趣收我做徒弟…

Tags: , , , ,

娱乐八卦

2009 HKCG & APJ Team Building 插图

by Lancer 31. July 2009 10:05

整齐划一的口号

别开生面的自我介绍

创意的队徽对歌

 

两队的分享

 

有时候要学会共赢,争斗只会得到失利和惩罚

正确的理解指令,“要保护自己”并没有要求攻击他人的含义

分组讨论:要取得好的成绩就应该把握高分,分清优先级

整装待发的机器人--发出清晰的指令和理解正确的信息很重要

分工与逻辑推理

创意与果决

总结与分享

Happy ending

Tags:

开心团队

避免进行不必要的强制转换

by Lancer 29. July 2009 09:12
Visual Studio Team System
避免进行不必要的强制转换

更新:2007 年 11 月

TypeName

DoNotCastUnnecessarily

CheckId

CA1800

类别

Microsoft.Performance

是否重大更改

某方法对其参数或局部变量之一执行重复的强制转换。要通过该规则进行全面分析,必须使用调试信息生成被测试的程序集,并且关联的程序数据库 (.pdb) 文件必须可用。

重复强制转换会降低性能,特别是在精简的迭代语句中执行强制转换时。对于显式重复强制转换操作,将强制转换的结果存储在局部变量中,并使用局部变量来替代重复强制转换操作。

如果在执行实际的强制转换之前,使用 C# is 运算符来测试强制转换是否将成功,请考虑转为测试 as 运算符的结果。后者可以提供相同的功能,但不需要由 is 运算符执行的隐式强制转换操作。

要修复与该规则的冲突,请修改方法实现,以最大限度地减少强制转换操作的次数。

如果无需顾虑性能,则可以安全地禁止显示此规则发出的警告,或者完全忽略此规则。

下面的示例演示一个使用 C# is 运算符的与规则冲突的方法。第二个方法将 is 运算符替换为针对 as 运算符的结果进行的测试(该测试将每个迭代的强制转换操作的次数从两次减少为一次),从而满足该规则。

using System;
 
using System.Collections;
using System.Windows.Forms;
 
namespace PerformanceLibrary
{
   public sealed class SomeClass
   {
      private SomeClass() {}
 
      // This method violates the rule.
 
      public static void UnderPerforming(ArrayList list)
      {
         foreach(object obj in list) 
         {
            // The 'is' statement performs a cast operation.
            if(obj is Control) 
            {
               // The 'as' statement performs a duplicate cast operation.
 
               Control aControl = obj as Control;
               // Use aControl.
            }
 
         }
      }
 
      // This method satisfies the rule.
      public static void BetterPerforming(ArrayList list)
      {
         foreach(object obj in list) 
         {
            Control aControl = obj as Control;
            if(aControl != null) 
            {
               // Use aControl.
 
            }
         }
      }
   }
}
 

下面的示例演示一个与规则冲突的方法 start_Click(多次重复执行显式强制转换)和一个满足规则的方法 reset_Click(将强制转换存储在局部变量中)。

Visual Basic
Imports System
Imports System.Drawing
Imports System.Windows.Forms
 
 
Namespace PerformanceLibrary
 
   Public Class SomeForm : Inherits Form
 
      Dim start, reset As Button
 
      Sub New()
 
         start = New Button()
         reset = New Button()
         AddHandler start.Click, AddressOf start_Click
         AddHandler reset.Click, AddressOf reset_Click
         Controls.Add(start)
         Controls.Add(reset)
 
      End Sub
 
      ' This method violates the rule.
      Private Sub start_Click(sender As Object, e As EventArgs)
 
         Dim controlSize As Size = DirectCast(sender, Control).Size
         Dim rightToLeftValue As RightToLeft = _ 
            DirectCast(sender, Control).RightToLeft
         Dim parent As Control = DirectCast(sender, Control)
 
      End Sub
 
      ' This method satisfies the rule.
      Private Sub reset_Click(sender As Object, e As EventArgs)
 
         Dim someControl As Control = DirectCast(sender, Control)
         Dim controlSize As Size = someControl.Size
         Dim rightToLeftValue As RightToLeft = someControl.RightToLeft
         Dim parent As Control = someControl
 
      End Sub
 
   End Class
 
End Namespace
 
using System;
 
using System.Drawing;
using System.Windows.Forms;
 
namespace PerformanceLibrary
{
   public class SomeForm : Form
   {
      Button start, reset;
 
      public SomeForm()
      {
         start = new Button();
         reset = new Button();
         start.Click += new EventHandler(start_Click);
         reset.Click += new EventHandler(reset_Click);
         Controls.Add(start);
         Controls.Add(reset);
      }
 
      // This method violates the rule.
 
      void start_Click(object sender, EventArgs e)
      {
         Size controlSize = ((Control)sender).Size;
         RightToLeft rightToLeftValue = ((Control)sender).RightToLeft;
         Control parent = (Control)sender;
      }
 
      // This method satisfies the rule.
      void reset_Click(object sender, EventArgs e)
      {
         Control someControl = (Control)sender;
         Size controlSize = someControl.Size;
         RightToLeft rightToLeftValue = someControl.RightToLeft;
         Control parent = someControl;
      }
   }
}
 

Tags:

代码检查 | 技术文章

Copyright © 2009 APJ Software

最新评论

Comment RSS

公告

欢迎使用APJ Blog!

日历

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

View posts in large calendar