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

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

首先,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

<context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/spring-beans.xml</param-value> </context-param> <filter> <filter-name>PerformanceFilter</filter-name> <filter-class>org.apache.click.extras.filter.PerformanceFilter</filter-class> <init-param> <param-name>cachable-paths</param-name> <param-value>/assets/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>PerformanceFilter</filter-name> <servlet-name>ClickServlet</servlet-name> </filter-mapping> <filter-mapping> <filter-name>PerformanceFilter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>PerformanceFilter</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping> <filter-mapping> <filter-name>PerformanceFilter</filter-name> <url-pattern>*.gif</url-pattern> </filter-mapping> <filter-mapping> <filter-name>PerformanceFilter</filter-name> <url-pattern>*.png</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>ClickServlet</servlet-name> <servlet-class>org.apache.click.extras.spring.SpringClickServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ClickServlet</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>

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

<!DOCTYPE click-app PUBLIC "-//Apache Software Foundation//DTD Click Configuration 2.2//EN" "http://click.apache.org/dtds/click-2.2.dtd"> <click-app charset="UTF-8"> <pages package="com.csh.pages" autobinding="annotation"> </pages> <mode value="debug"/> </click-app>

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

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

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <context:annotation-config/> <context:component-scan base-package="com.csh"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/click" /> <property name="user" value="root" /> <property name="password" value="root" /> <property name="minPoolSize" value="10" /> <property name="maxPoolSize" value="20" /> <property name="maxIdleTime" value="1800" /> <property name="acquireIncrement" value="2" /> <property name="maxStatements" value="0" /> <property name="initialPoolSize" value="2" /> <property name="idleConnectionTestPeriod" value="1800" /> <property name="acquireRetryAttempts" value="30" /> <property name="breakAfterAcquireFailure" value="true" /> <property name="testConnectionOnCheckout" value="false" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="mappingResources"> <list> <value>com/csh/beans/Person.hbm.xml</value> </list> </property> </bean> </beans>

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

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

@Repository("commonDao") public class CommonDaoHibernateImpl<T> extends HibernateDaoSupport implements CommonDao<T> { private Class<T> clazz; @Autowired public void setSuperSessionFactory(SessionFactory sessionFactory){ super.setSessionFactory(sessionFactory); } @SuppressWarnings("unchecked") public CommonDaoHibernateImpl(){ if (this.getClass().getGenericSuperclass() instanceof ParameterizedType) { clazz = (Class<T>)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } } public void add(T entity) { getHibernateTemplate().save(entity); } public int count(String hql, Object... objects) { List list = getHibernateTemplate().find(hql, objects); return list.size()==1?Integer.parseInt(list.get(0).toString()):0; } public int count(String hql) { List list = getHibernateTemplate().find(hql); return list.size()==1?Integer.parseInt(list.get(0).toString()):0; } public void delete(T entity) { getHibernateTemplate().delete(entity); } @SuppressWarnings("unchecked") public T find(Serializable pk) { return (T)getHibernateTemplate().get(clazz, pk); } public T find(final String hql, final Object... objects) { return (T)getHibernateTemplate().execute(new HibernateCallback<T>() { @SuppressWarnings("unchecked") public T doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); setParameters(query,objects); return (T)query.uniqueResult(); } }); } @SuppressWarnings("unchecked") public List<T> query(final String hql, final int page, final int size, final Object... objects) { return getHibernateTemplate().executeFind(new HibernateCallback() { public List<T> doInHibernate(Session session) throws HibernateException,SQLException { Query query = session.createQuery(hql); setParameters(query, objects); if(page != 0 && size!=0){ query.setFirstResult((page-1)*size); query.setMaxResults(size); } return (List<T>)query.list(); } }); } @SuppressWarnings("unchecked") public List<T> query(String hql) { return (List<T>)getHibernateTemplate().find(hql); } public void update(T entity) { getHibernateTemplate().update(entity); } private void setParameters(Query query, Object...objects){ for(int i=0; i<objects.length; i++){ query.setParameter(i, objects[i]); } } }

然后实现personDao

@Repository("personDao") public class PersonDaoImpl extends CommonDaoHibernateImpl<Person> implements PersonDao { public List<Person> queryPerson(String hql, int page, int size, Object... objects) { return super.query(hql,page,size,objects); } public Person findPerson(int id) { return super.find(id); } public void addPerson(Person person) { super.add(person); } public void updatePerson(Person person) { super.update(person); } }

接着是业务管理器personManager

@Service("personManager") public class PersonManagerImpl implements PersonManager { @Autowired private PersonDao personDao; public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } public List<Person> queryPerson(int page, int size) { return personDao.queryPerson("from Person", page, size); } public List<Person> queryPersonByName(String name, int page, int size) { return personDao.queryPerson("select p from Person p where p.name like ?", page, size, "%"+name+"%"); } public List<Person> queryPersonByStatus(int status, int page, int size) { return personDao.queryPerson("from Person p where p.active=?", page, size, status); } public void addPerson(Person person) { personDao.addPerson(person); } public void updatePerson(Person person) { personDao.updatePerson(person); } public void deletePerson(int id) { Person person = personDao.findPerson(id); person.setActive(0); personDao.updatePerson(person); } }

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

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

public class BorderPage extends org.apache.click.Page { private Menu mainMenu; private ActionLink logout = new ActionLink("logout","登出",this,"onLogout"); public BorderPage(){ String className = getClass().getName(); String shortName = className.substring(className.lastIndexOf('.') + 1); String title = ClickUtils.toLabel(shortName); addModel("title", title); String srcPath = className.replace('.', '/') + ".java"; addModel("srcPath", srcPath); } @Override public void onInit() { super.onInit(); mainMenu = new MenuFactory().getRootMenu("mainMenu","/WEB-INF/menu.xml"); addControl(mainMenu); addControl(logout); addModel("nowtime", new SimpleDateFormat("yyyy年MM月dd日").format(new Date())); } @Override public void onDestroy() { if(mainMenu != null){ removeControl(mainMenu); } } public boolean onLogout(){ setRedirect(Login.class); return true; } @Override public String getTemplate() { return "/borderPage.htm"; } }

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

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

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

EmployeeAdd.java

@Scope("prototype") @Component("employeeAdd") public class EmployeeAdd extends BorderPage { private Form form = new Form("form"); @Autowired private PersonManager personManager; public EmployeeAdd(){ addControl(form); form.add(new TextField("name", "姓名", true)); RadioGroup gender = new RadioGroup("gender","性别", true); gender.add(new Radio("男","男","gender")); gender.add(new Radio("女","女","gender")); form.add(gender); DateField birth = new DateField("birth", "出生日期", true); birth.setFormatPattern("yyyy-MM-dd"); form.add(birth); form.add(new EmailField("email", "电子邮箱", true)); form.add(new TelephoneField("tel", "联系电话", true)); Select job = new Select("job", "职位", true); form.add(job); job.addAll(new String[]{"无","经理","销售"}); form.add(new NumberField("salary", "工资")); Select education = new Select("education", "学历", true); education.addAll(new String[]{"无","本科","研究生","博士","其他"}); form.add(education); form.add(new TextArea("remark", "备注")); form.add(new Submit("submit","保存",this,"addPerson")); form.add(new Submit("reset","重填",this,"resetForm")); form.add(new Submit("cancel","关闭",this,"backToList")); } public boolean addPerson(){ if(form.isValid()){ Person person = new Person(); form.copyTo(person); personManager.addPerson(person); clearForm(); addModel("msg", "保存成功"); } return true; } public boolean resetForm(){ clearForm(); return false; } public boolean backToList(){ setRedirect(Employees.class); return true; } private void clearForm(){ form.clearErrors(); form.clearValues(); } public void setPersonManager(PersonManager personManager) { this.personManager = personManager; } }

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

Employees.java:

@Scope("prototype") @Component("employees") public class Employees extends BorderPage { @Autowired private PersonManager personManager; final int page; final int size; private Table empTable = new Table("empTable"); private Form searchForm = new Form("searchForm"); private TextField name; private EmailField email; private TelephoneField tel; private Select job; public Employees(){ addControl(empTable); addControl(searchForm); initTable(); initForm(); String p = getContext().getRequestParameter("page"); String s = getContext().getRequestParameter("size"); page = p==null?1:Integer.parseInt(p); size = s==null?20:Integer.parseInt(s); } private void initForm(){ searchForm.setColumns(2); searchForm.add(name = new TextField("name", "姓名")); searchForm.add(new Submit("search","查找",this,"search")); } private void initTable(){ empTable.setClass(Table.CLASS_ITS); empTable.setPageSize(20); //添加列 Column id = new Column("id", "序号"); id.setWidth("50px"); id.setTextAlign("center"); empTable.addColumn(id); Column name = new Column("name", "姓名"); name.setWidth("120px"); name.setTextAlign("center"); empTable.addColumn(name); Column gender = new Column("gender", "性别"); gender.setWidth("50px"); empTable.addColumn(gender); Column birth = new Column("birth", "出生日期"); birth.setWidth("120px"); birth.setSortable(true); birth.setFormat("{0,date,yyyy-MM-dd}"); empTable.addColumn(birth); Column email = new Column("email", "电子邮箱"); email.setWidth("120px"); email.setAutolink(true); empTable.addColumn(email); Column tel = new Column("tel", "联系电话"); tel.setWidth("100px"); empTable.addColumn(tel); Column job = new Column("job", "职位"); job.setWidth("100px"); empTable.addColumn(job); Column salary = new Column("salary", "工资"); salary.setFormat("${0,number,#,##0.00}"); salary.setTextAlign("right"); salary.setWidth("100px"); salary.setSortable(true); empTable.addColumn(salary); Column education = new Column("education","学历"); education.setWidth("100px"); empTable.addColumn(education); Column remark = new Column("remark","备注"); remark.setWidth("140px"); empTable.addColumn(remark); empTable.setDataProvider(new DataProvider<Person>() { public List<Person> getData() { return personManager.queryPerson(page, size); } }); } public boolean search(){ empTable.setDataProvider(new DataProvider<Person>() { public List<Person> getData() { String name_val = name.getValue(); if(name_val==null || "".equals(name_val.trim())){ return personManager.queryPerson(page, size); }else{ return personManager.queryPersonByName(name_val,page, size); } } }); return true; } public boolean resetForm(){ searchForm.clearErrors(); searchForm.clearValues(); return true; } public void setPersonManager(PersonManager personManager) { this.personManager = personManager; } }

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



再贴上几张截图:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值