俗话说,说的多,不如做的多。废话不说了,快速进入配置。
首先,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;
}
}
都完成后,下面是工程结构图:
再贴上几张截图: