Spring和Hibernate整合(2)

WEB-INF下创建views文件夹,并创建404.jsp, error.jsp,main.jsp,内容皆任意,
下面给出404和error页面的个人的设计:
404.jsp内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="<%=basePath %>favicon.ico">

    <title>404错误页面</title>

    <!-- Bootstrap core CSS -->
    <link href="<%=basePath %>css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="<%=basePath %>css/font-awesome.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->




    <div class="container">
      <div style="position: absolute;left:50%;top:50%;margin-left:-350px;margin-top: -100px;width:700px;height: 200px;line-height:200px;
        text-align:center;
        background: none repeat scroll 0% 0% #FFECEC;border: 1px solid #FFD2D2;">
        页面未找到
      </div>
    </div><!-- /.container -->

    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="<%=basePath %>js/bootstrap.min.js"></script>

error.jsp内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="<%=basePath %>favicon.ico">

    <title>错误信息显示页面</title>

    <!-- Bootstrap core CSS -->
    <link href="<%=basePath %>css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="<%=basePath %>css/font-awesome.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->




    <div class="container">
      <div style="position: absolute;left:50%;top:50%;margin-left:-350px;margin-top: -100px;width:700px;height: 200px;
        text-align:center;
        background: none repeat scroll 0% 0% #FFECEC;border: 1px solid #FFD2D2;">
        <div style="height: 125px;line-height: 125px;">
            ${errorMsg}
        </div>
        <div>
            <button class="btn btn-primary" onclick="window.history.back();"><i class="fa fa-arrow-left"></i> 点击返回</button>
        </div>
      </div>
    </div><!-- /.container -->

    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="<%=basePath %>js/bootstrap.min.js"></script>

在src根目录下创建hibernate.cfg.xml文件,内容如下:

<!--?xml version="1.0" encoding="UTF-8"?-->


<hibernate-configuration>
    <session-factory>
        <!-- 数据库方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库连接信息 -->
        <!-- 本地使用 -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/wiki</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">server</property>
        <!-- 服务器使用 -->
        <!--
        <property name="hibernate.connection.url">jdbc:mysql://127.4.222.2:3306/wiki?useUnicode=true&characterEncoding=utf-8</property>
        <property name="hibernate.connection.username">adminNrQmBAY</property>
        <property name="hibernate.connection.password">7uK_x3Cmqy4P</property>
        -->
        <!-- 打印SQL语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 不格式化SQL语句 -->
        <property name="hibernate.format_sql">false</property>
        <!-- 为Session指定一个自定义策略 -->
        <property name="hibernate.current_session_context_class">thread</property>
        <!-- C3P0 JDBC连接池 -->
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.timeout">120</property>
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.idle_test_period">120</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.validate">true</property>
        <!--  
        <property name="connection.autocommit">true</property>
        -->
        <!-- 映射文件 -->
        <mapping resource="com/ais/cms/mapping/Bookmark.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

在src下创建包 com.ais.cms.controller,并创建BaseController类,内容如下:

package com.ais.cms.controller;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import com.ais.cms.exception.BusinessException;

public class BaseController extends SimpleMappingExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request,
            HttpServletResponse response, Object object, Exception exception) {
        // TODO Auto-generated method stub
        String viewName = determineViewName(exception, request);
        if (viewName != null) {
            if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request
                    .getHeader("X-Requested-With") != null && request.getHeader(
                    "X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
                // 非异步方式返回
                Integer statusCode = determineStatusCode(request, viewName);
                if (statusCode != null) {
                    applyStatusCodeIfPossible(request, response, statusCode);
                 // 跳转到提示页面
                    return getModelAndView(viewName, exception, request);
                }
                String errorMsg = null;
                if (exception instanceof BusinessException) {
                    errorMsg = exception.getMessage();
                } else {
                    errorMsg = "系统异常!";
                }
                request.getSession().setAttribute("errorMsg", errorMsg);
                exception.printStackTrace();
                return new ModelAndView("redirect:/error.do");
            } else {
                // 异步方式返回
                try {
                    PrintWriter writer = response.getWriter();
                    writer.write(exception.getMessage());
                    response.sendError(404, exception.getMessage());
                    writer.flush();
                } catch ( Exception e ) {
                    e.printStackTrace();
                }
                // 不进行页面跳转
                return null;
            }
        }
        return null;
    }

    @RequestMapping(value = "/error.do", method = RequestMethod.GET)
    public ModelAndView  error(HttpServletRequest request) {
        String errorMsg = (String)request.getSession().getAttribute("errorMsg");
        ModelAndView view = new ModelAndView("error");
        view.addObject("errorMsg", errorMsg);
        return view;
    }

}

在src下创建包 com.ais.cms.dao,并创建IDAO接口,内容如下:

package com.ais.cms.dao;

import java.io.Serializable;
import java.util.Map;

import com.ais.cms.model.PageModel;

public interface IDAO {
    public Serializable save(Object obj);
    public void saveOrUpdate(Object obj);
    public void update(Object obj);
    public void delete(Serializable ... ids);
    public T get(Serializable entityId);
    public T load(Serializable entityId);
    public Object uniqueResult(String hql, Object[] queryParams);

    public long getCount();
    public PageModel find(int pageNo, int maxResult);
    public PageModel find(int pageNo, int maxResult,String where, Object[] queryParams);
    public PageModel find(int pageNo, int maxResult,Map orderby);
    public PageModel find(int pageNo, int maxResult, String where, Object[] queryParams,
            Map orderby);
}

在src下创建包 com.ais.cms.dao.impl,并创建BookmarkDaoImpl类,内容如下:

/**
 * 
 */
package com.ais.cms.dao.impl;

import java.util.List;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.ais.cms.dao.BookmarkDao;
import com.ais.cms.model.BookmarkModel;
import com.ais.cms.model.PageModel;

@Repository("bookmarkDao")
@Transactional
public class BookmarkDaoImpl extends DaoSupport implements BookmarkDao
{

    /*
     * (non-Javadoc)
     * @see com.ais.dao.BookmarkDao#findAll()
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public List findAll()
    {
        // TODO Auto-generated method stub
        final PageModel pageModel = this.find(1, 100);
        return pageModel.getList();
    }

}

在src下创建包 com.ais.cms.dao.impl,并创建DaoSupport类,内容如下:

package com.ais.cms.dao.impl;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.ais.cms.model.PageModel;
import com.ais.cms.dao.IDAO;
import com.ais.cms.util.GenericsUtils;

@Transactional
@SuppressWarnings("unchecked")
public class DaoSupport implements IDAO{

    protected Class entityClass = GenericsUtils.getGenericType(this.getClass());

    @Autowired
    protected HibernateTemplate template;

    public HibernateTemplate getTemplate() {
        return template;
    }
    @Override
    public void delete(Serializable ... ids) {
        for (Serializable id : ids) {
            T t = (T) getTemplate().load(this.entityClass, id);
            Session session = getTemplate().getSessionFactory().openSession();
            Transaction tx = session.beginTransaction();
            tx.begin();
            session.delete(session.merge(t));
            tx.commit();
            session.close();
//          getTemplate().delete(t);
        }
    }

    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public T get(Serializable entityId) {
        return (T) getTemplate().get(this.entityClass, entityId);
    }

    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public T load(Serializable entityId) {
        return (T) getTemplate().load(this.entityClass, entityId);
    }
    /**
     * NO USE
     */
    @SuppressWarnings("rawtypes")
    @Override
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public Object uniqueResult(final String hql,final Object[] queryParams) {
        return getTemplate().execute(new HibernateCallback() {
            @Override
            public Object doInHibernate(Session session) throws HibernateException,
                    SQLException {
                Query query = session.createQuery(hql);
                setQueryParams(query, queryParams);
                return query.uniqueResult();
            }
        });
    }
    /**
     * NO USE
     */
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public long getCount() {
        String hql = "select count(*) from " + GenericsUtils.getGenericName(this.entityClass);
        return (Long)uniqueResult(hql,null);
    }

    @Override
    public Serializable save(Object obj) {
        return getTemplate().save(obj);
    }

    @Override
    public void saveOrUpdate(Object obj) {
        Session session = getTemplate().getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        tx.begin();
        session.saveOrUpdate(session.merge(obj));
        tx.commit();
        session.close();
//      getTemplate().saveOrUpdate(obj);
    }

    @Override
    public void update(Object obj) {
        getTemplate().update(obj);
    }
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public PageModel find(final int pageNo, int maxResult) {
        return find(pageNo, maxResult, null, null, null);
    }
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public PageModel find(int pageNo, int maxResult,
            Map orderby) {
        return find(pageNo, maxResult, null, null, orderby);
    }
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public PageModel find(int pageNo, int maxResult, String where,
            Object[] queryParams) {
        return find(pageNo, maxResult, where, queryParams, null);
    }

    @SuppressWarnings("rawtypes")
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public PageModel find(final int pageNo, final int maxResult, 
            final String where, final Object[] queryParams,
            final Map orderby) {
        final PageModel pageModel = new PageModel();
        pageModel.setPageNo(pageNo);
        pageModel.setPageSize(maxResult);
        getTemplate().execute(new HibernateCallback() {
            @Override
            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                String hql = new StringBuffer().append("from ")
                                .append(GenericsUtils.getGenericName(entityClass))
                                .append(" ")
                                .append(where == null ? "" : where)
                                .append(createOrderBy(orderby))
                                .toString();
                Query query = session.createQuery(hql);
                setQueryParams(query,queryParams);
                List list = null;

                if(maxResult < 0 && pageNo < 0){
                    list = query.list();
                }else{
                    list = query.setFirstResult(getFirstResult(pageNo, maxResult))
                                .setMaxResults(maxResult)
                                .list();
                    hql = new StringBuffer().append("select count(*) from ")
                                    .append(GenericsUtils.getGenericName(entityClass))
                                    .append(" ")
                                    .append(where == null ? "" : where)
                                    .toString();
                    query = session.createQuery(hql);
                    setQueryParams(query,queryParams);
                    int totalRecords = ((Long) query.uniqueResult()).intValue();
                    pageModel.setTotalRecords(totalRecords);
                }
                pageModel.setList(list);
                return null;
            }
        });
        return pageModel;
    }

    protected int getFirstResult(int pageNo,int maxResult){
        int firstResult = (pageNo-1) * maxResult;
        return firstResult < 0 ? 0 : firstResult;
    }

    protected void setQueryParams(Query query, Object[] queryParams){
        if(queryParams!=null && queryParams.length>0){
            for(int i=0; i orderby){
        StringBuffer sb = new StringBuffer("");
        if(orderby != null && orderby.size() > 0){
            sb.append(" order by ");
            for(String key : orderby.keySet()){
                sb.append(key).append(" ").append(orderby.get(key)).append(",");
            }
            sb.deleteCharAt(sb.length() - 1);
        }
        return sb.toString();
    }




    protected Session getSession(){
        return (!this.template.isAllowCreate() ?
            SessionFactoryUtils.getSession(this.template.getSessionFactory(), false) :
                SessionFactoryUtils.getSession(
                        this.template.getSessionFactory(),
                        this.template.getEntityInterceptor(),
                        this.template.getJdbcExceptionTranslator()));
    }
}

在src下创建包 com.ais.cms.exception,并创建BusinessException类,内容如下:

package com.ais.cms.exception;

public class BusinessException extends Exception {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public BusinessException(String msg) {
        super(msg);
    }   

    public BusinessException(Throwable ex, String msg) {
        super(msg, ex);
    }

}

在src下创建包 com.ais.cms.model,并创建PageModel类,内容如下:

package com.ais.cms.model;

import java.util.List;

public class PageModel {
    private int totalRecords;
    private List list;
    private int pageNo;
    private int pageSize;

    public int getTopPageNo() {
        return 1;
    }

    public int getPreviousPageNo() {
        if (pageNo <= 1) {
            return 1;
        }
        return pageNo -1;
    }

    public int getNextPageNo() {
        if (pageNo >= getTotalPages()) {
            return getTotalPages() == 0 ? 1 : getTotalPages();
        }
        return pageNo + 1;
    }

    public int getBottomPageNo() {
        return getTotalPages() == 0 ? 1 : getTotalPages();
    }

    public int getTotalPages() {
        return (totalRecords + pageSize - 1) / pageSize;
    }
    public int getTotalRecords() {
        return totalRecords;
    }
    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }
    public List getList() {
        return list;
    }
    public void setList(List list) {
        this.list = list;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getPageNo() {
        return pageNo;
    }
    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }
}

在src下创建包 com.ais.cms.util,并创建GenericsUtils类,内容如下:

package com.ais.cms.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericsUtils {

    @SuppressWarnings("rawtypes")
    public static Class getGenericType(Class clazz){
        Type genType = clazz.getGenericSuperclass();
        Type[] types = ((ParameterizedType) genType).getActualTypeArguments();
        if (!(types[0] instanceof Class)) {
            return Object.class;   
        } 
        return (Class) types[0];
    }

    @SuppressWarnings("rawtypes")
    public static String getGenericName(Class clazz){
        return clazz.getSimpleName();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值