基于Annotation的Strust2,Spring,Hibernate的整合,利用Struts2 convention插件

在这里,我主要讲解怎么利用Struts2 convention插件的加入后怎么处理和spring的整合。
首先创建实体类,Customer

@Entity
public class Customer implements Serializable {
private static final long serialVersionUID = 6961371108792430359L;

private Integer id;
private String name;
private String address;
private Date createDate;

public Customer() {

}

public Customer(String name, String address, Date createDate) {
this.name = name;
this.address = address;
this.createDate = createDate;
}

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

@Column(name="name",length=45,nullable=false)
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

@Temporal(TemporalType.TIMESTAMP)
@Column(name="create_date")
public Date getCreateDate() {
return createDate;
}

public void setCreateDate(Date createDate) {
this.createDate = createDate;
}


}

在配置sping sessionFactory bean的时候,sessionFactory的实现类应该为AnnotationSessionFactoryBean,然后再配置一下要spiring扫描的实体类的所在包
<property name="packagesToScan">
<list>
<value>org.clong.domain</value>
</list>
</property>
第二步,完成对dao的设计:
package org.clong.dao;

import java.util.List;

import org.clong.domain.Customer;

public interface CustomerDao {

public void save(Customer customer);

public List<Customer> findAllCustomers();

}

dao实现类如下:
package org.clong.dao.impl;

import java.util.List;

import org.clong.dao.CustomerDao;
import org.clong.dao.SuperDaoSupport;
import org.clong.domain.Customer;
import org.springframework.stereotype.Repository;

@Repository("customerDao")
public class CustomerDaoImpl extends SuperDaoSupport implements CustomerDao {


@SuppressWarnings("unchecked")
@Override
public List<Customer> findAllCustomers() {
return getHibernateTemplate().find("from Customer");
}

@Override
public void save(Customer customer) {
getHibernateTemplate().save(customer);
}

}

在这里我是利用了spring提供的HibernateDaoSupport这个来实现sessionFactory的注入,由于不想在每个dao中都设置sessionFactory的注入,所以写了一个父类用来被子类继承,在父类中注入sessionFactory。由于HibernateDaoSupport的setSessionFactory(SessionFactory sessionFactory)z方法是final类型的,所以子类不能覆盖,而且又不是使用配置文件,所以写了一个辅助类,
import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


public class SuperDaoSupport extends HibernateDaoSupport {
private SessionFactory sessionFactory;

@Resource(name="sessionFactory")
public void setSuperSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}

}

第三步,设计服务层
import java.util.List;

import org.clong.domain.Customer;

public interface CustomerBo {
void addCustomer(Customer customer);
List<Customer> listCustomer();

}

实现类为:
import java.util.List;

import javax.annotation.Resource;

import org.clong.bo.CustomerBo;
import org.clong.dao.CustomerDao;
import org.clong.domain.Customer;
import org.springframework.stereotype.Service;

@Service("customerBo")
public class CustomerBoImpl implements CustomerBo {
private CustomerDao customerDao;

@Resource
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}

@Override
public void addCustomer(Customer customer) {
customerDao.save(customer);

}

@Override
public List<Customer> listCustomer() {
return customerDao.findAllCustomers();
}

}

第四步,设计action
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.clong.bo.CustomerBo;
import org.clong.domain.Customer;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;


public class CustomerAction extends ActionSupport implements ModelDriven<Customer>,Preparable {
private static final long serialVersionUID = -4411234960652825984L;

private Customer customer;
private List<Customer> customerList=new ArrayList<Customer>();
private CustomerBo customerBo;

public Customer getCustomer() {
return customer;
}


public List<Customer> getCustomerList() {
return customerList;
}

@Resource
public void setCustomerBo(CustomerBo customerBo) {
this.customerBo = customerBo;
}


@Override
public Customer getModel() {
if(customer==null){
customer=new Customer();
}
return customer;
}


@Action(value="addCustomer",
results={
@Result(name="success",type="redirectAction",params={"actionName","listCustomer","namespace","/customer"}),
@Result(name="input",location="customer.jsp")
})
public String addCustomer() throws Exception{
//save it
customer.setCreateDate(new Date());
customerBo.addCustomer(customer);

//reload the customer list
// customerList = null;
customerList = customerBo.listCustomer();

return "success";

}


@Action(value="listCustomer",results={@Result(name="success",location="customer.jsp")})
public String listCustomer() throws Exception{

return "success";

}

@Override
public void prepare() throws Exception {
customerList = customerBo.listCustomer();

}

}

在这里,利用struts2提供的验证框架,简单的进行一下服务端验证
我们对CustomerAction这个类中的addCustomer这个action进行验证(验证文件名需要满足一定的规则,具体请参见Struts2官方文档中的内容),我们这里的验证文件名为CustomerAction-addCustomer-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">

<validators>
<field name="name">
<field-validator type="requiredstring">
<message>name cann't be empty</message>
</field-validator>
</field>
</validators>

注意这里action并不需要像没用convention插件那样加上类级别的@Controller注解
最后来个页面展示一下customer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>Add Customer</h2>
<s:form action="addCustomer" namespace="/customer">
<s:textfield name="name" label="Name" value="" />
<s:textarea name="address" label="Address" value="" cols="50" rows="5" />
<s:submit />
</s:form>

<h2>All Customers</h2>

<s:if test="customerList.size() > 0">
<table border="1px" cellpadding="8px">
<tr>
<th>Customer Id</th>
<th>Name</th>
<th>Address</th>
<th>Created Date</th>
</tr>
<s:iterator value="customerList" status="userStatus">
<tr>
<td><s:property value="id" /></td>
<td><s:property value="name" /></td>
<td><s:property value="address" /></td>
<td><s:date name="createDate" format="yyyy-MM-dd" /></td>
</tr>
</s:iterator>
</table>
</s:if>
<br/>
<br/>
</body>
</html>


最后提供一下完整的源代码供下载(Struts2 2.2.1,Spring2.5.6,Hibernate3.6.0的jar包没有提供)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值