代码包的目录结构如下:
数据模型类:Site ,通过 @Entity 标签来标示需要进行数据库映射,然后通过@Table @Column等标签,告诉Hibernate如何绑定到数据库表
package cn.toncen.cms.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @ClassName: Site
* @Description: 站点信息数据模型
* @author: Wang DaoYong
* @date: 2014年3月9日
*
*/
@Entity
@Table(name = "site")
public class Site {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(length = 128, unique = true, nullable = false)
private String name;
@Column(length = 256)
private String url;
@Column(length = 512)
private String comment;
@Column(name = "access_statistics")
private int accessStatistics;
public int getId() {
return id;
}
public Site() {
super();
}
public Site(int id, String name, String url, String comment, int accessStatistics) {
super();
this.id = id;
this.name = name;
this.url = url;
this.comment = comment;
this.accessStatistics = accessStatistics;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public int getAccessStatistics() {
return accessStatistics;
}
public void setAccessStatistics(int accessStatistics) {
this.accessStatistics = accessStatistics;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Site other = (Site) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Site [id=" + id + ", name=" + name + ", url=" + url + ", comment=" + comment + ", accessStatistics="
+ accessStatistics + "]";
}
}
DAO工具父类
package cn.toncen.cms.dao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @ClassName: AbstractDao
* @Description: DAO通用方法封装抽象类
* @author: Wang DaoYong
* @date: 2014年3月9日
*
*/
public abstract class AbstractDao<E, I extends Serializable> {
private final Class<E> entityClass;
protected AbstractDao(Class<E> entityClass) {
this.entityClass = entityClass;
}
@Autowired
private SessionFactory sessionFactory;
public Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
public I addNew(E e) {
return (I) getCurrentSession().save(e);
}
@SuppressWarnings("unchecked")
public E findById(I id) {
return (E) getCurrentSession().get(entityClass, id);
}
public void saveOrUpdate(E e) {
getCurrentSession().saveOrUpdate(e);
}
public void delete(E e) {
getCurrentSession().delete(e);
}
@SuppressWarnings("unchecked")
public List<E> findByCriteria(Criterion criterion) {
Criteria criteria = getCurrentSession().createCriteria(entityClass);
if (criterion != null) {
criteria.add(criterion);
}
return criteria.list();
}
}
SiteDAO实现 通过@Repository标注数据访问组件,即DAO组件,Spring容器进行管理
package cn.toncen.cms.dao.impl;
import java.util.List;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import cn.toncen.cms.dao.AbstractDao;
import cn.toncen.cms.dao.SiteDao;
import cn.toncen.cms.entity.Site;
/**
* @ClassName: SiteDaoImpl
* @Description: 站点信息DAO实现
* @author: Wang DaoYong
* @date: 2014年3月9日
*
*/
@Repository
public class SiteDaoImpl extends AbstractDao<Site, Integer> implements SiteDao {
protected SiteDaoImpl() {
super(Site.class);
}
/**
*
* @see cn.toncen.cms.dao.SiteDao#addSite(cn.toncen.cms.entity.Site)
*/
@Override
public int addSite(Site site) {
return addNew(site);
}
/**
*
* @see cn.toncen.cms.dao.SiteDao#deleteSite(int)
*/
@Override
public void deleteSite(int id) {
delete(findSiteByID(id));
}
@Override
public Site findSiteByID(int id) {
return findById(id);
}
/**
*
* @see cn.toncen.cms.dao.SiteDao#updateSite(cn.toncen.cms.entity.Site)
*/
@Override
public void saveOrUpdateSite(Site site) {
saveOrUpdate(site);
}
@Override
public List<Site> findSiteByName(String name) {
return findByCriteria(Restrictions.like("name", name, MatchMode.START));
}
/**
* @see cn.toncen.cms.dao.SiteDao#getAllSites()
*/
@Override
public List<Site> getAllSites() {
// return getCurrentSession().createCriteria(Site.class).list();
return findByCriteria(null);
}
}
SiteService类代码如下 通过@Service标注其为服务类,在该类的代码中,通过@Auotwired来从容器中装载DAO接口的实现类对象
package cn.toncen.cms.service.impl;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.toncen.cms.dao.SiteDao;
import cn.toncen.cms.entity.Site;
import cn.toncen.cms.service.SiteService;
/**
* @ClassName: SiteServiceImpl
* @Description: 站点服务实现
* @author: Wang DaoYong
* @date: 2014年3月10日
*
*/
@Service("siteService")
@Transactional(readOnly = true)
public class SiteServiceImpl implements SiteService {
private static final Logger logger = LoggerFactory.getLogger(SiteServiceImpl.class);
@Autowired
private SiteDao siteDao;
/**
* @see cn.toncen.cms.service.SiteService#addSite(cn.toncen.cms.entity.Site)
*/
@Override
@Transactional(readOnly = false)
public int addSite(Site site) {
return siteDao.addSite(site);
}
/**
* @see cn.toncen.cms.service.SiteService#updateSite(cn.toncen.cms.entity.Site)
*/
@Override
@Transactional(readOnly = false)
public void updateSite(Site site) {
siteDao.saveOrUpdateSite(site);
}
/**
* @see cn.toncen.cms.service.SiteService#deleteSite(int)
*/
@Override
@Transactional(readOnly = false)
public void deleteSite(int id) {
siteDao.deleteSite(id);
}
/**
* @see cn.toncen.cms.service.SiteService#findSiteById(int)
*/
@Override
@Transactional(readOnly = true)
public Site findSiteById(int id) {
return siteDao.findSiteByID(id);
}
@Override
@Transactional(readOnly = true)
public List<Site> findSiteByName(String name) {
return siteDao.findSiteByName(name);
}
/**
* @see cn.toncen.cms.service.SiteService#findAllSites()
*/
@Override
@Transactional(readOnly = true)
public List<Site> findAllSites() {
logger.debug("Get all sites info.");
return siteDao.getAllSites();
}
}
Controller类实现 通过@Controller标签标注其为一个WEB控制器类,通过@Autowired装载Service接口的实现类对象
package cn.toncen.cms.web;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import cn.toncen.cms.entity.Site;
import cn.toncen.cms.service.SiteService;
/**
* @ClassName: SiteController
* @Description: TODO
* @author: Wang DaoYong
* @date: 2014年3月10日
*
*/
@Controller
public class SiteController {
private static final Logger logger = LoggerFactory.getLogger(SiteController.class);
@Autowired
private SiteService siteService;
@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String adminIndex(Model model) {
logger.debug("Access /site/list.");
List<Site> sites = siteService.findAllSites();
model.addAttribute("sites", sites);
return "/admin/site/site";
}
@RequestMapping(value = "/admin/site/add", method = RequestMethod.GET)
public String showSiteForm(Model model) {
model.addAttribute("Site", new Site());
return "/admin/site/add";
}
@RequestMapping(value = "/admin/site/save", method = RequestMethod.POST)
public String saveSite(Model model, Site site) {
List<Site> existing = siteService.findSiteByName(site.getName());
if (existing.size() != 0) {
model.addAttribute("nameMsg", "exist");
return "admin/site/add";
}
siteService.addSite(site);
model.addAttribute("created", "success");
model.addAttribute("sites", siteService.findAllSites());
return "/admin/site/site";
}
@RequestMapping(value = "/admin/site", method = RequestMethod.GET)
public String listSites(Model model) {
logger.debug("Access /site/list.");
List<Site> sites = siteService.findAllSites();
model.addAttribute("sites", sites);
return "/admin/site/site";
}
@RequestMapping(value = "/admin/site/search", method = RequestMethod.POST)
public String searchUser(Model model, Site site) {
List<Site> sites = siteService.findSiteByName(site.getName());
model.addAttribute("sites", sites);
return "/admin/site/site";
}
@RequestMapping(value = "/admin/site/edit/{id}", method = RequestMethod.GET)
public String editSite(Model model, @PathVariable int id) {
Site site = siteService.findSiteById(id);
model.addAttribute("site", site);
model.addAttribute("sites", siteService.findAllSites());
return "/admin/site/edit/"+id;
}
@RequestMapping(value = "/admin/site/update", method = RequestMethod.POST)
public String updateSite(Model model, Site site) {
siteService.updateSite(site);
model.addAttribute("saved", "success");
model.addAttribute("sites", siteService.findAllSites());
return "/admin/site/site";
}
@RequestMapping(value = "/admin/site/delete/{id}", method = RequestMethod.GET)
public String deleteSite(Model model, @PathVariable int id) {
siteService.deleteSite(id);
model.addAttribute("deleted", "success");
model.addAttribute("sites", siteService.findAllSites());
return "/admin/site/site";
}
}
接口代码就不需要贴了,上面就是一个服务流程后台到前台的实现代码,数据校验之类的功能尚未添加
可以看到,在代码中通过各种注解标签,代替了配置文件的功能
后续还有页面代码