tomcat6013+myeclipse55m1+jsf12+spring2+proxool+jtds 的开发实现!!

TITLE: -- tomcat6013+myeclispe55m1+jsf12+spring2+proxool+jtds 的开发实现!!
先前,我们已经配置了好了用tomcat6013+myeclispe55m1+jsf12的开发环境!!
地址: http://fangbiao23.iteye.com/admin/show/98458
接下来我们就要与数据库打交道了!!
该节我们将应用开源连接池proxool-090RC3与开源JDBC驱动器jtds12作为我们应用程序与数据库打交道,
我们应用使用的数据库是sqlserver2000,有点老了,不过你也可以尝试使用sqlserver2005
在此,我不推蒋使用官方的jdbc驱动SQLServerDriver,因为他与连接池proxool所联合的137错误令我闷了半天!

接下来,让我们到sourceforge网上去下载我们所需要的库:
proxool-0.9.0RC3.jar 和 jtds-1.2.jar

把他们加入到我们先前的lib中

一、配置proxool
偶在web-inf下创建一个datasource.xml(数据源配置)
详情如下:

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2. <!---->
  3.  "http://www.springframework.org/dtd/spring-beans.dtd">  
  4.     
  5. <beans>  
  6.        <!---->  
  7.       <bean id="placeholderConfig"  
  8.           class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  9.              
  10.           <property name="location">  
  11.             <value>/WEB-INF/mssqlJdbc.propertiesvalue>  
  12.           property>  
  13.     bean>  
  14.     <bean id="mssql_dataSource"  
  15.           class="org.logicalcobwebs.proxool.ProxoolDataSource">  
  16.           <property name="driver">  
  17.             <value>${proxool.driverName}value>  
  18.           property>  
  19.           <property name="driverUrl">  
  20.             <value>${proxool.url}value>  
  21.           property>  
  22.           <property name="user">  
  23.             <value>${proxool.userName}value>  
  24.           property>  
  25.           <property name="password">  
  26.             <value>${proxool.password}value>  
  27.           property>  
  28.           <property name="houseKeepingTestSql">  
  29.             <value>${proxool.houseKeepingTestSql}value>  
  30.           property>  
  31.           <property name="prototypeCount">  
  32.             <value>${proxool.prototypeCount}value>  
  33.           property>  
  34.           <property name="houseKeepingSleepTime">  
  35.             <value>${proxool.hourseKeepingSleepTime}value>  
  36.           property>  
  37.           <property name="maximumConnectionCount">  
  38.             <value>${proxool.maximumConnectionCount}value>  
  39.           property>  
  40.           <property name="minimumConnectionCount">  
  41.             <value>${proxool.minimumConnectionCount}value>  
  42.           property>  
  43.     bean>    
  44. beans>  

 

创建WEB-INF/mssqlJdbc.properties文件,用于与mssql_dataSource下参数相映射

#数据库名称
proxool.datasource = jsfDemo
#数据库驱动名称
#proxool.driverName = com.microsoft.jdbc.sqlserver.SQLServerDriver
proxool.driverName =net.sourceforge.jtds.jdbc.Driver
#连接的url{可能是proxool的Bug,只能把用户名和密码写在url上(具体你可以参考proxoolDataSource这个类[关于各参数据加载次序])}
proxool.url =jdbc:jtds:sqlserver://localhost:1433/${proxool.datasource};user=sa;password=1234
#用户名称
proxool.userName =sa
#密码
proxool.password =1234
#数据源别名
#proxool.alias = myProxool
#侦察时间间隔
proxool.hourseKeepingSleepTime = 60000
#最小空闲数
proxool.prototypeCount = 2
#最大连接数
proxool.maximumConnectionCount = 50
#最小连接数
proxool.minimumConnectionCount = 2
#执行语句是否要记录
#proxool.trace = false
#记录执行的详细信息
#proxool.verbose = false
#测试的SQL执行语句
proxool.houseKeepingTestSql = select getDate()
#最大活动时间(超过此时间线程将被kill,默认为5分钟)
proxool.maximumActiveTime = 300000
#连接最长时间(默认为4个小时)
proxool.maximumConnectionLifetime = 3060000000

此外,我们可以在web.xml中装载一个proxool提供的Servlet,以便我们可以随时查看连接池的连接情况,该处可选
 

xml 代码
  1. <servlet>  
  2.   <servlet-name>adminservlet-name>  
  3.   <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServletservlet-class>  
  4. servlet>  
  5.   
  6.   
  7. <servlet-mapping>  
  8.   <servlet-name>adminservlet-name>  
  9.   <url-pattern>/adminurl-pattern>  
  10. servlet-mapping>  

当应用部署成功并开始运作后,我们可以输入http://localhost:8080/项目名/admin
你就可以查询相关的数据库连接池情况

由于开发的跟风和软件本身的性能,我选择了spring作业我的业务操层,持久层将使用Ibatis,但此实例偶将不涉及ibatis,偶
将利用spring的JdbcTemplate来进行数据库CRUD操作

NOW,选择项目,右击>>选择Myeclipse>>add Spring Capli...
选择spring2-->core library && aop library && web library ,单击finish ,OK

打开Web.xml,在里面进行相关的设置,偶给出其配置成功的web.xml

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"  
  3.          xmlns="http://java.sun.com/xml/ns/javaee"  
  4.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6.   <!---->  
  7.   <context-param>  
  8.     <param-name>javax.faces.CONFIG_FILESparam-name>  
  9.     <param-value>/WEB-INF/faces-config.xmlparam-value>  
  10.   context-param>  
  11.   <!---->  
  12.   <context-param>  
  13.     <param-name>log4jConfigLocationparam-name>  
  14.     <param-value>/WEB-INF/log4j.propertiesparam-value>  
  15.   context-param>  
  16.   <!---->  
  17.   <context-param>  
  18.     <param-name>contextConfigLocationparam-name>  
  19.     <param-value>/WEB-INF/datasource.xml /WEB-INF/applicationContext.xmlparam-value>  
  20.   context-param>  
  21.     <!---->  
  22.   <listener>  
  23.     <listener-class>org.springframework.web.util.Log4jConfigListenerlistener-class>  
  24.   listener>  
  25.   <listener>  
  26.     <listener-class> org.springframework.web.context.ContextLoaderListenerlistener-class>  
  27.   listener>  
  28.   <listener>  
  29.     <listener-class>com.sun.faces.config.ConfigureListenerlistener-class>  
  30.   listener>    
  31.   <!---->  
  32.   <servlet>  
  33.     <servlet-name>fServletservlet-name>  
  34.     <servlet-class>javax.faces.webapp.FacesServletservlet-class>  
  35.     <load-on-startup>0load-on-startup>  
  36.   servlet>  
  37.   <!---->    
  38.   <servlet>  
  39.     <servlet-name>adminservlet-name>  
  40.     <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServletservlet-class>  
  41.   servlet>  
  42.      
  43.   <servlet-mapping>  
  44.     <servlet-name>fServletservlet-name>  
  45.     <url-pattern>*.jsfurl-pattern>  
  46.   servlet-mapping>  
  47.   
  48.   <servlet-mapping>  
  49.     <servlet-name>adminservlet-name>  
  50.     <url-pattern>/adminurl-pattern>  
  51.   servlet-mapping>    
  52. web-app>  

现在,我们的应用中已经有了jsf/spring/proxool/jtds

如何把他们的关系相互的整合起来呢

首先,利用简单的配置整合JSF ^ SPRING
该配置将在faces-config.xml中进行设置,具体如下:

xml 代码
  1. <application>  
  2.         <!---->  
  3.         <message-bundle>mes.messagesmessage-bundle>  
  4.         <locale-config>  
  5.             <default-locale>zh_CNdefault-locale>  
  6.             <supported-locale>ensupported-locale>  
  7.         locale-config>  
  8.         <!---->  
  9.         <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolvervariable-resolver>  
  10.  application>  

那么下面,将是我们的spring与数据库之间的搭桥啦
记得先前我们创建的mssql_dataSource吗!!我们将利用spring的JdbcDaoSupport和JdbcTemplate来进行交接
我们创建一个类来实现,如下所示:

java 代码
  1. package com.fangbiao.spring;   
  2. import java.util.List;   
  3. import org.springframework.jdbc.core.JdbcTemplate;   
  4. import org.springframework.jdbc.core.support.JdbcDaoSupport;   
  5.   
  6. /**  
  7.  * @author fangbiao  
  8.  *  
  9.  */  
  10. public class UserDaoImpl extends JdbcDaoSupport implements IUserDao{   
  11.     //假如你要用自定义的datasource的值注入的话,请不要继承JdbcDaoSupport,这样做的好处是依赖之间松藕合   
  12.     //DataSource dataSource ;   
  13.     public List findByUserId() {   
  14.         //以下这种this.getApplicationContext,你必须继承spring中的WebApplicationContextSupport以取得spring web上下文环境   
  15.         //dataSource = (BasicDataSource)this.getApplicationContext().getBean("mssql_dataSource");   
  16.         // 这里的this就是引用JdbcDaoSupport   
  17.         JdbcTemplate jdbcTemplate = this.getJdbcTemplate();   
  18.         return jdbcTemplate.queryForList(FIND_BY_USERID);   
  19.     }   
  20.     /*public void setDataSource(DataSource dataSource){  
  21.         this.dataSource = dataSource;  
  22.     }*/  
  23. }   

在这个类中我没有把他独立出来,所以当你要创建一个真实的项目时,请不要这么做,这样你会重复写很多次类似的代码,如JdbcTemplate

现在,来说说我们这节的目标 ,我们将通过用户web请求,从一个数据库中取出所有用户的数据信息
一、创建数据库和相应的数据表信息

sql 代码
  1. create database jsfDemo   
  2. go   
  3. use jsfDemo   
  4. go   
  5. drop table myJsfUser   
  6. go   
  7. create table myJsfUser   
  8. (   
  9.   userId decimal identity(1,1) constraint pk_userId primary key,   
  10.   userName varchar(25) not null,   
  11.   userPsw varchar(18) not null,   
  12.   userAge int not null,   
  13.   userAddress varchar(100)    
  14. )   
  15.   
  16. go   
  17. insert into myJsfUser select 'fangbiao', 'fangbiao',  24,  'zhongguo guangzhou'    
  18. insert into myJsfUser select '小郑',     'fangbiao',  24,  'zhongguo guangzhou'    
  19. insert into myJsfUser select 'mikey',    'fangbiao',  24,  'zhongguo shanghai'    
  20. insert into myJsfUser select 'duck',     'fangbiao',  24,  'zhongguo guangzhou tianhe'    
  21. go   
  22. select * from myJsfUser  

二、创建Jsf与Spring上下文环境交接的助手类对象

java 代码
  1. package com.fangbiao.jsf.util;   
  2. import org.springframework.context.ApplicationContext;   
  3. import org.springframework.web.context.support.WebApplicationContextUtils;   
  4. import javax.faces.context.FacesContext;   
  5. import javax.servlet.ServletContext;   
  6. /**  
  7.  * @author fangbiao  
  8.  *  
  9.  */  
  10. public class SpringFacesUtil {   
  11.     /**  
  12.      * 将JSF上下文环境对象也装载进Spring当,以后JSF和Spring中的Bean对象皆可以从该方法中找到  
  13.      * @param beanName 输入要获取的Bean的名称  
  14.      * @return Object  
  15.      */  
  16.     public static Object findBean(String beanName){   
  17.         ServletContext context = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();   
  18.         ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);   
  19.         return ctx.getBean(beanName);   
  20.     }   
  21. }   

三、创建我们的业务对象,目的是查找所有的用户数据
(1)、首先,定义一个业务对象接口(把关系定义在接口中是JAVA编程来实现重用的最大优点)。

java 代码
  1. package com.fangbiao.spring;   
  2. import java.util.List;   
  3.   
  4. /**  
  5.  * @author fangbiao  
  6.  *  
  7.  */  
  8. public interface IUserBusinessService {   
  9.     /**  
  10.     * 实现把用户资料根据ID信息给读出来,并返回一个用户列表数据信息  
  11.     */  
  12.     public List getUserWithdUserId();   
  13. }   

(2)、定义一个业务对象的实现类对象,该对象将具体的实现赋予DAO去实现。

java 代码
  1. package com.fangbiao.spring;   
  2.   
  3. import java.util.List;   
  4.   
  5.   
  6. /**  
  7.  * @author fangbiao  
  8.  *  
  9.  */  
  10. public class UserBusinessImpl implements IUserBusinessService {   
  11.     //用于值注入时,加载相应的userDao实现类对象   
  12.     IUserDao userDao;   
  13.     /**  
  14.      * 实现根据ID信息获取用户列表资料  
  15.      * @see com.fangbiao.spring.IUserBusinessService#getUserWithdUserId(java.util.Map)  
  16.      */  
  17.     public List getUserWithdUserId() {   
  18.         //把具体的实现委托级userDao   
  19.         return  userDao.findByUserId();   
  20.     }   
  21.        
  22.     public void setUserDao(IUserDao iud){   
  23.         this.userDao = iud;   
  24.     }   
  25. }   

(3)定义一个UserDao的接口,声明相应的dao实现

java 代码
  1. package com.fangbiao.spring;   
  2. import java.util.List;   
  3.   
  4. /**  
  5.  * @author fangbiao  
  6.  *  
  7.  */  
  8. public interface IUserDao {   
  9.     //此处我们定义了一条sql查询语句,真下在的实现可以把所有的SQL语句放置于一个文件中,以便统一管理   
  10.     public final String FIND_BY_USERID = "SELECT userName,userPsw,userAge,userAddress FROM myJsfUser WHERE userId <> 0";   
  11.     //定义一个根据ID信息获取用户列表资料的方法声明   
  12.     public List findByUserId();   
  13. }   
(4)实现UserDao接口的具体类对角,该类是最基础的DAO底层操作实现,该对象引用了spring中JDBC实现的JdbcTemplate对象,以便完
成较为低级的JDBC实现
java 代码
  1. package com.fangbiao.spring;   
  2. import java.util.List;   
  3. import org.springframework.jdbc.core.JdbcTemplate;   
  4. import org.springframework.jdbc.core.support.JdbcDaoSupport;   
  5.   
  6. /**  
  7.  * @author fangbiao  
  8.  *  
  9.  */  
  10. public class UserDaoImpl extends JdbcDaoSupport implements IUserDao{   
  11.        //具体的查找实现方法   
  12.     public List findByUserId() {   
  13.         // 这里的this就是引用JdbcDaoSupport   
  14.         JdbcTemplate jdbcTemplate = this.getJdbcTemplate();   
  15.         return jdbcTemplate.queryForList(FIND_BY_USERID);   
  16.     }   
  17. }  
(5)、定义的一个简单的包装类对象,以便不暴露我们的相关的业务操作对象

 

java 代码
  1. package com.fangbiao.spring;   
  2.   
  3. import java.util.List;   
  4.   
  5.   
  6. import com.fangbiao.jsf.util.SpringFacesUtil;   
  7. import com.fangbiao.spring.IUserBusinessService;   
  8. /**  
  9.  * @author fangbiao  
  10.  *  
  11.  */  
  12. public class SpringTest    
  13. {   
  14.     //这是我们做测试的一个例子,以后具体实现偶也推蒋这种方法,不要让业务接口暴露(该方法命名可能不太好,但做测试用,也就不改啦)   
  15.     public List doSpringTest(){   
  16.         //利用SpringFacesUtil来查找我们的业务实现   
  17.         IUserBusinessService iubs = (IUserBusinessService)SpringFacesUtil.findBean("user_business");   
  18.         return iubs.getUserWithdUserId();      
  19.     }   
  20. }   

 四、以上完成了我们的Spring业务实现和DAO实现,现在来看看我们的交互层实现
 
(1)、现在就来写我们的View对角,以便把查找的结果显现出来

java 代码
  1. package com.fangbiao.jsf;   
  2. import java.util.List;   
  3.   
  4. import com.fangbiao.jsf.util.SpringFacesUtil;   
  5. import com.fangbiao.spring.SpringTest;   
  6. /**  
  7.  * @author fangbiao  
  8.  *  
  9.  */  
  10. public class UserList {   
  11.     //该列表将在JSP中的<h:datatable></h:datatable>中显示出来   
  12.     private List allUserMsg;   
  13.     public List getAllUserMsg(){   
  14.         //看这里,我们还能知道业务接口吗??呵呵   
  15.         allUserMsg = ((SpringTest)SpringFacesUtil.findBean("spring_test")).doSpringTest();   
  16.         return allUserMsg;   
  17.     }   
  18. }  

 

你可能感兴趣的:(spring,Web,servlet,jdbc,JSF)