[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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dyyaries

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值