sdtf08 发表于 2017-1-11 09:30:32

[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支持的请点击 开发环境配置初试
  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;@Autowiredpublic 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();}}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);}}}  然后实现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 {@Autowiredprivate 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);}@Overridepublic 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()));}@Overridepublic void onDestroy() {if(mainMenu != null){removeControl(mainMenu);}}public boolean onLogout(){setRedirect(Login.class);return true;}@Overridepublic 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");@Autowiredprivate 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 {@Autowiredprivate 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;}}  都完成后,下面是工程结构图:


再贴上几张截图:





  
页: [1]
查看完整版本: [Apache Click快速开发]整合Hibernate3.3和Spring3.0