打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[Apache Click快速开发]整合Hibernate3.3和Spring3.0

[Apache Click快速开发]整合Hibernate3.3和Spring3.0

分类: Java 151人阅读 评论(1) 收藏 举报

俗话说,说的多,不如做的多。废话不说了,快速进入配置。

首先,hibernate配置。mysql中新建名为click的数据库,新建一个person表,表结构如下:

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| name      | varchar(100) | YES  |     | NULL    |                |
| gender    | varchar(10)  | YES  |     | NULL    |                |
| birth     | datetime     | YES  |     | NULL    |                |
| email     | varchar(255) | YES  |     | NULL    |                |
| tel       | varchar(255) | YES  |     | NULL    |                |
| job       | varchar(100) | YES  |     | NULL    |                |
| salary    | float        | YES  |     | NULL    |                |
| education | varchar(50)  | YES  |     | NULL    |                |
| remark    | varchar(500) | YES  |     | NULL    |                |
| active    | int(11)      | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

完成后,在eclipse中新建工程,并添加click支持。不知道怎么添加click支持的请点击 [Apache Click快速开发]开发环境配置初试

1.配置web.xml,这些在新建工程完毕后是可以自动生成的,click和spring整合所用的关键类为SpringClickServlet

  1. <context-param>  
  2.         <param-name>contextConfigLocation</param-name>  
  3.         <param-value>WEB-INF/spring-beans.xml</param-value>  
  4.     </context-param>  
  5.     <filter>  
  6.         <filter-name>PerformanceFilter</filter-name>  
  7.         <filter-class>org.apache.click.extras.filter.PerformanceFilter</filter-class>  
  8.         <init-param>  
  9.             <param-name>cachable-paths</param-name>  
  10.             <param-value>/assets/*</param-value>  
  11.         </init-param>  
  12.     </filter>  
  13.     <filter-mapping>  
  14.         <filter-name>PerformanceFilter</filter-name>  
  15.         <servlet-name>ClickServlet</servlet-name>  
  16.     </filter-mapping>  
  17.     <filter-mapping>  
  18.         <filter-name>PerformanceFilter</filter-name>  
  19.         <url-pattern>*.css</url-pattern>  
  20.     </filter-mapping>  
  21.     <filter-mapping>  
  22.         <filter-name>PerformanceFilter</filter-name>  
  23.         <url-pattern>*.js</url-pattern>  
  24.     </filter-mapping>  
  25.     <filter-mapping>  
  26.         <filter-name>PerformanceFilter</filter-name>  
  27.         <url-pattern>*.gif</url-pattern>  
  28.     </filter-mapping>  
  29.     <filter-mapping>  
  30.         <filter-name>PerformanceFilter</filter-name>  
  31.         <url-pattern>*.png</url-pattern>  
  32.     </filter-mapping>  
  33.     <listener>  
  34.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  35.     </listener>  
  36.       
  37.     <servlet>  
  38.         <servlet-name>ClickServlet</servlet-name>  
  39.         <servlet-class>org.apache.click.extras.spring.SpringClickServlet</servlet-class>  
  40.         <load-on-startup>0</load-on-startup>  
  41.     </servlet>  
  42.     <servlet-mapping>  
  43.         <servlet-name>ClickServlet</servlet-name>  
  44.         <url-pattern>*.htm</url-pattern>  
  45.     </servlet-mapping>  

修改click.xml配置文件,添加click page所在包

  1. <!DOCTYPE click-app PUBLIC  
  2.   "-//Apache Software Foundation//DTD Click Configuration 2.2//EN"  
  3.   "http://click.apache.org/dtds/click-2.2.dtd">  
  4.   
  5. <click-app charset="UTF-8">  
  6.   
  7.   <pages package="com.csh.pages" autobinding="annotation">  
  8.   </pages>  
  9.   
  10.   <mode value="debug"/>  
  11.   
  12. </click-app>  

2.新建hibernate持久化对象Person,这里就不详细讲了,相信做过Hibernate持久化的都知道。

下面是spring配置(hibernate.cfg.xml省略掉,直接用spring托管),

  1. <beans xmlns="http://www.springframework.org/schema/beans"    
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  3.     xmlns:tx="http://www.springframework.org/schema/tx"    
  4.     xmlns:aop="http://www.springframework.org/schema/aop"    
  5.     xmlns:context="http://www.springframework.org/schema/context"    
  6.     xsi:schemaLocation="http://www.springframework.org/schema/aop       
  7.       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd     
  8.       http://www.springframework.org/schema/beans       
  9.       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
  10.       http://www.springframework.org/schema/context     
  11.       http://www.springframework.org/schema/context/spring-context-3.0.xsd     
  12.       http://www.springframework.org/schema/tx       
  13.       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">   
  14.     <context:annotation-config/>  
  15.     <context:component-scan base-package="com.csh"/>  
  16.     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">     
  17.         <property name="driverClass" value="com.mysql.jdbc.Driver" />     
  18.         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/click" />     
  19.         <property name="user" value="root" />     
  20.         <property name="password" value="root" />     
  21.         <property name="minPoolSize" value="10" />     
  22.         <property name="maxPoolSize" value="20" />     
  23.         <property name="maxIdleTime" value="1800" />     
  24.         <property name="acquireIncrement" value="2" />     
  25.         <property name="maxStatements" value="0" />     
  26.         <property name="initialPoolSize" value="2" />     
  27.         <property name="idleConnectionTestPeriod" value="1800" />     
  28.         <property name="acquireRetryAttempts" value="30" />     
  29.         <property name="breakAfterAcquireFailure" value="true" />     
  30.         <property name="testConnectionOnCheckout" value="false" />     
  31.     </bean>    
  32.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  33.         <property name="dataSource" ref="dataSource"></property>  
  34.         <property name="hibernateProperties">  
  35.             <props>  
  36.                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>   
  37.                 <prop key="hibernate.show_sql">true</prop>  
  38.             </props>  
  39.         </property>  
  40.         <property name="mappingResources">  
  41.             <list>  
  42.                 <value>com/csh/beans/Person.hbm.xml</value>  
  43.             </list>  
  44.         </property>  
  45.     </bean>  
  46. </beans>  

3.配置完成后,完成dao层和manager业务层书写。

首先,我用hibernatedaosupport实现了commonDao,并采用泛型让子类来指定具体持久化类型。

  1. @Repository("commonDao")  
  2. public class CommonDaoHibernateImpl<T> extends HibernateDaoSupport implements CommonDao<T> {  
  3.     private Class<T> clazz;  
  4.     @Autowired  
  5.     public void setSuperSessionFactory(SessionFactory sessionFactory){  
  6.         super.setSessionFactory(sessionFactory);  
  7.     }  
  8.     @SuppressWarnings("unchecked")  
  9.     public CommonDaoHibernateImpl(){  
  10.          if (this.getClass().getGenericSuperclass() instanceof ParameterizedType) {  
  11.              clazz = (Class<T>)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];  
  12.          }  
  13.     }  
  14.     public void add(T entity) {  
  15.         getHibernateTemplate().save(entity);  
  16.     }  
  17.   
  18.     public int count(String hql, Object... objects) {  
  19.         List list = getHibernateTemplate().find(hql, objects);  
  20.         return list.size()==1?Integer.parseInt(list.get(0).toString()):0;  
  21.     }  
  22.   
  23.     public int count(String hql) {  
  24.         List list = getHibernateTemplate().find(hql);  
  25.         return list.size()==1?Integer.parseInt(list.get(0).toString()):0;  
  26.     }  
  27.   
  28.     public void delete(T entity) {  
  29.         getHibernateTemplate().delete(entity);  
  30.     }  
  31.   
  32.     @SuppressWarnings("unchecked")  
  33.     public T find(Serializable pk) {  
  34.         return (T)getHibernateTemplate().get(clazz, pk);  
  35.     }  
  36.   
  37.     public T find(final String hql, final Object... objects) {  
  38.         return (T)getHibernateTemplate().execute(new HibernateCallback<T>() {  
  39.             @SuppressWarnings("unchecked")  
  40.             public T doInHibernate(Session session) throws HibernateException,  
  41.                     SQLException {  
  42.                 Query query = session.createQuery(hql);  
  43.                 setParameters(query,objects);  
  44.                 return (T)query.uniqueResult();  
  45.             }  
  46.         });  
  47.     }  
  48.   
  49.     @SuppressWarnings("unchecked")  
  50.     public List<T> query(final String hql, final int page, final int size, final Object... objects) {  
  51.         return getHibernateTemplate().executeFind(new HibernateCallback() {  
  52.             public List<T> doInHibernate(Session session) throws HibernateException,SQLException {  
  53.                 Query query = session.createQuery(hql);  
  54.                 setParameters(query, objects);  
  55.                 if(page != 0 && size!=0){  
  56.                     query.setFirstResult((page-1)*size);  
  57.                     query.setMaxResults(size);  
  58.                 }  
  59.                 return (List<T>)query.list();  
  60.             }  
  61.               
  62.         });  
  63.     }  
  64.   
  65.     @SuppressWarnings("unchecked")  
  66.     public List<T> query(String hql) {  
  67.         return (List<T>)getHibernateTemplate().find(hql);  
  68.     }  
  69.   
  70.     public void update(T entity) {  
  71.         getHibernateTemplate().update(entity);  
  72.     }  
  73.       
  74.     private void setParameters(Query query, Object...objects){  
  75.         for(int i=0; i<objects.length; i++){  
  76.             query.setParameter(i, objects[i]);  
  77.         }  
  78.     }  
  79. }  

然后实现personDao

  1. @Repository("personDao")  
  2. public class PersonDaoImpl extends CommonDaoHibernateImpl<Person> implements PersonDao {  
  3.       
  4.     public List<Person> queryPerson(String hql, int page, int size,  
  5.             Object... objects) {  
  6.         return super.query(hql,page,size,objects);  
  7.     }  
  8.   
  9.     public Person findPerson(int id) {  
  10.         return super.find(id);  
  11.     }  
  12.   
  13.     public void addPerson(Person person) {  
  14.         super.add(person);  
  15.     }  
  16.   
  17.     public void updatePerson(Person person) {  
  18.         super.update(person);  
  19.     }  
  20. }  

接着是业务管理器personManager

  1. @Service("personManager")  
  2. public class PersonManagerImpl implements PersonManager {  
  3.     @Autowired  
  4.     private PersonDao personDao;  
  5.       
  6.     public void setPersonDao(PersonDao personDao) {  
  7.         this.personDao = personDao;  
  8.     }  
  9.   
  10.     public List<Person> queryPerson(int page, int size) {  
  11.         return personDao.queryPerson("from Person", page, size);  
  12.     }  
  13.   
  14.     public List<Person> queryPersonByName(String name, int page, int size) {  
  15.         return personDao.queryPerson("select p from Person p where p.name like ?", page, size, "%"+name+"%");  
  16.     }  
  17.   
  18.     public List<Person> queryPersonByStatus(int status, int page, int size) {  
  19.         return personDao.queryPerson("from Person p where p.active=?", page, size, status);  
  20.     }  
  21.   
  22.     public void addPerson(Person person) {  
  23.         personDao.addPerson(person);  
  24.     }  
  25.   
  26.     public void updatePerson(Person person) {  
  27.         personDao.updatePerson(person);  
  28.     }  
  29.   
  30.     public void deletePerson(int id) {  
  31.         Person person = personDao.findPerson(id);  
  32.         person.setActive(0);  
  33.         personDao.updatePerson(person);  
  34.     }  
  35. }  

4.准备工作完成后,就是Click来实现界面功能了。

首先,完成每个页面都需要的界面框架BorderPage

  1. public class BorderPage extends org.apache.click.Page {  
  2.     private Menu mainMenu;  
  3.     private ActionLink logout = new ActionLink("logout","登出",this,"onLogout");  
  4.     public BorderPage(){  
  5.         String className = getClass().getName();  
  6.         String shortName = className.substring(className.lastIndexOf('.') + 1);  
  7.         String title = ClickUtils.toLabel(shortName);  
  8.         addModel("title", title);  
  9.         String srcPath = className.replace('.''/') + ".java";  
  10.         addModel("srcPath", srcPath);  
  11.     }  
  12.       
  13.     @Override  
  14.     public void onInit() {  
  15.         super.onInit();  
  16.         mainMenu = new MenuFactory().getRootMenu("mainMenu","/WEB-INF/menu.xml");  
  17.         addControl(mainMenu);  
  18.         addControl(logout);  
  19.         addModel("nowtime"new SimpleDateFormat("yyyy年MM月dd日").format(new Date()));  
  20.     }  
  21.   
  22.     @Override  
  23.     public void onDestroy() {  
  24.         if(mainMenu != null){  
  25.             removeControl(mainMenu);  
  26.         }  
  27.     }  
  28.   
  29.     public boolean onLogout(){  
  30.         setRedirect(Login.class);  
  31.         return true;  
  32.     }  
  33.     @Override  
  34.     public String getTemplate() {  
  35.         return "/borderPage.htm";  
  36.     }  
  37. }  

之中用到的菜单配置文件menu.xml(默认放置在/WEB-INF下面即可)如下:

  1. <menu>  
  2.     <menu label="员工管理" path="#" imageSrc="/assets/images/user.png" title="员工管理">  
  3.         <menu label="新增" imageSrc="/assets/images/user_add.png" path="employee_add.htm" title="新增员工"/>  
  4.         <menu label="员工列表" imageSrc="/assets/images/columns.png" path="employees.htm" title="员工列表"/>  
  5.     </menu>  
  6.     <menu label="系统设置" path="#" imageSrc="/assets/images/wrench.png" title="系统设置">  
  7.         <menu label="权限设置" imageSrc="/assets/images/cup_key.png" path="helloPage.htm" title="权限设置"/>  
  8.         <menu label="系统信息" imageSrc="/assets/images/page_white_wrench.png" path="helloControls.htm" title="系统信息"/>  
  9.         <menu label="帮助" imageSrc="/assets/images/star.png" path="helloControls2.htm" title="帮助"/>  
  10.     </menu>  
  11. </menu>  

其次,我需要一个页面来完成添加操作

EmployeeAdd.java

  1. @Scope("prototype")  
  2. @Component("employeeAdd")  
  3. public class EmployeeAdd extends BorderPage {  
  4.     private Form form = new Form("form");  
  5.     @Autowired  
  6.     private PersonManager personManager;  
  7.     public EmployeeAdd(){  
  8.         addControl(form);  
  9.         form.add(new TextField("name""姓名"true));  
  10.         RadioGroup gender = new RadioGroup("gender","性别"true);  
  11.         gender.add(new Radio("男","男","gender"));  
  12.         gender.add(new Radio("女","女","gender"));  
  13.         form.add(gender);  
  14.         DateField birth = new DateField("birth""出生日期"true);  
  15.         birth.setFormatPattern("yyyy-MM-dd");  
  16.         form.add(birth);  
  17.         form.add(new EmailField("email""电子邮箱"true));  
  18.         form.add(new TelephoneField("tel""联系电话"true));  
  19.         Select job = new Select("job""职位"true);  
  20.         form.add(job);  
  21.         job.addAll(new String[]{"无","经理","销售"});  
  22.         form.add(new NumberField("salary""工资"));  
  23.         Select education = new Select("education""学历"true);  
  24.         education.addAll(new String[]{"无","本科","研究生","博士","其他"});  
  25.         form.add(education);  
  26.         form.add(new TextArea("remark""备注"));  
  27.           
  28.         form.add(new Submit("submit","保存",this,"addPerson"));  
  29.         form.add(new Submit("reset","重填",this,"resetForm"));  
  30.         form.add(new Submit("cancel","关闭",this,"backToList"));  
  31.     }  
  32.     public boolean addPerson(){  
  33.         if(form.isValid()){  
  34.             Person person = new Person();  
  35.             form.copyTo(person);  
  36.             personManager.addPerson(person);  
  37.             clearForm();  
  38.             addModel("msg""保存成功");  
  39.         }  
  40.         return true;  
  41.     }  
  42.     public boolean resetForm(){  
  43.         clearForm();  
  44.         return false;  
  45.     }  
  46.     public boolean backToList(){  
  47.         setRedirect(Employees.class);  
  48.         return true;  
  49.     }  
  50.     private void clearForm(){  
  51.         form.clearErrors();  
  52.         form.clearValues();  
  53.     }  
  54.     public void setPersonManager(PersonManager personManager) {  
  55.         this.personManager = personManager;  
  56.     }  
  57. }  

最后用一个列表来显示所有的person记录

Employees.java:

  1. @Scope("prototype")  
  2. @Component("employees")  
  3. public class Employees extends BorderPage {  
  4.     @Autowired  
  5.     private PersonManager personManager;  
  6.       
  7.     final int page;  
  8.     final int size;  
  9.     private Table empTable = new Table("empTable");  
  10.     private Form searchForm = new Form("searchForm");  
  11.     private TextField name;  
  12.     private EmailField email;  
  13.     private TelephoneField tel;  
  14.     private Select job;  
  15.     public Employees(){  
  16.         addControl(empTable);  
  17.         addControl(searchForm);  
  18.         initTable();  
  19.         initForm();  
  20.         String p = getContext().getRequestParameter("page");  
  21.         String s = getContext().getRequestParameter("size");  
  22.         page = p==null?1:Integer.parseInt(p);  
  23.         size = s==null?20:Integer.parseInt(s);  
  24.     }  
  25.     private void initForm(){  
  26.         searchForm.setColumns(2);  
  27.         searchForm.add(name = new TextField("name""姓名"));  
  28.         searchForm.add(new Submit("search","查找",this,"search"));  
  29.     }  
  30.     private void initTable(){  
  31.         empTable.setClass(Table.CLASS_ITS);  
  32.         empTable.setPageSize(20);  
  33.         //添加列   
  34.         Column id = new Column("id""序号");  
  35.         id.setWidth("50px");  
  36.         id.setTextAlign("center");  
  37.         empTable.addColumn(id);  
  38.           
  39.         Column name = new Column("name""姓名");  
  40.         name.setWidth("120px");  
  41.         name.setTextAlign("center");  
  42.         empTable.addColumn(name);  
  43.           
  44.         Column gender = new Column("gender""性别");  
  45.         gender.setWidth("50px");  
  46.         empTable.addColumn(gender);  
  47.           
  48.         Column birth = new Column("birth""出生日期");  
  49.         birth.setWidth("120px");  
  50.         birth.setSortable(true);  
  51.         birth.setFormat("{0,date,yyyy-MM-dd}");  
  52.   
  53.         empTable.addColumn(birth);  
  54.           
  55.         Column email = new Column("email""电子邮箱");  
  56.         email.setWidth("120px");  
  57.         email.setAutolink(true);  
  58.         empTable.addColumn(email);  
  59.           
  60.         Column tel = new Column("tel""联系电话");  
  61.         tel.setWidth("100px");  
  62.         empTable.addColumn(tel);  
  63.           
  64.         Column job = new Column("job""职位");  
  65.         job.setWidth("100px");  
  66.         empTable.addColumn(job);  
  67.         Column salary = new Column("salary""工资");  
  68.         salary.setFormat("${0,number,#,##0.00}");  
  69.         salary.setTextAlign("right");  
  70.         salary.setWidth("100px");  
  71.         salary.setSortable(true);  
  72.         empTable.addColumn(salary);  
  73.           
  74.         Column education = new Column("education","学历");  
  75.         education.setWidth("100px");  
  76.         empTable.addColumn(education);  
  77.           
  78.         Column remark = new Column("remark","备注");  
  79.         remark.setWidth("140px");  
  80.         empTable.addColumn(remark);  
  81.           
  82.         empTable.setDataProvider(new DataProvider<Person>() {  
  83.             public List<Person> getData() {  
  84.                 return personManager.queryPerson(page, size);  
  85.             }  
  86.         });  
  87.     }  
  88.     public boolean search(){  
  89.         empTable.setDataProvider(new DataProvider<Person>() {  
  90.             public List<Person> getData() {  
  91.                 String name_val = name.getValue();  
  92.                 if(name_val==null || "".equals(name_val.trim())){  
  93.                     return personManager.queryPerson(page, size);  
  94.                 }else{  
  95.                     return personManager.queryPersonByName(name_val,page, size);  
  96.                 }  
  97.             }  
  98.         });  
  99.         return true;  
  100.     }  
  101.       
  102.     public boolean resetForm(){  
  103.         searchForm.clearErrors();  
  104.         searchForm.clearValues();  
  105.         return true;  
  106.     }  
  107.     public void setPersonManager(PersonManager personManager) {  
  108.         this.personManager = personManager;  
  109.     }  
  110. }  

都完成后,下面是工程结构图:



再贴上几张截图:






 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
.NET使用FastDBF读写DBF
Hibernate中outer-join与lazy关键字的使用--mofour live
Hibernate Mapping 中的catalog属性导制生成HQL时报错!_~小雨_...
Hibernate left join(左连接)
hibernate--basedao,借鉴别人的完善自己的
hibernate实现增删改查的各种方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服