1. 程式人生 > >三大框架整合struts+spring+hibernate

三大框架整合struts+spring+hibernate

action層

package com.action;


import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.DELETE;

import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
import com.po.Page;
import com.po.User;
import com.service.IUserService;

@Controller
public class UserAction implements ModelDriven<User>, ServletRequestAware,
        ServletResponseAware {

    @Autowired
    private IUserService userService;
    // 使用模型驅動自動獲取前臺頁面的值
    private User user;

    @Override
    public User getModel() {
        if(user==null){
            user=new User();
        }
        return user;
    }

    // 獲取request和response物件
    private HttpServletRequest request;
    private HttpServletResponse response;

    @Override
    public void setServletResponse(HttpServletResponse arg0) {
        this.response = arg0;
    }

    @Override
    public void setServletRequest(HttpServletRequest arg0) {
        this.request = arg0;
    }

    public String add() {

        userService.add(user);
        return "add";
    }

    public String delete() {

        userService.delete(user);
        return "delete";
    }

    //修改完成之後,進入查詢所有action,顯示最新資料
    public String update() {
        userService.update(user);
        return "update";

    }
    //根據id查詢物件
    public String findById() {
        User user2=userService.findById(user.getId());
        ActionContext.getContext().getValueStack().push(user2);
        return "findById";

    }

    //多條件模糊查詢
    public String findByUser() {
        //前臺傳遞的id屬性值,會自動被模型驅動獲取,所以直接使用user作為查詢條件
        List<User> ulist = userService.findByUser(user);
        request.setAttribute("user", user);
        request.setAttribute("ulist", ulist);
        return "findByUser";

    }

    //查詢所有使用者
    public String findAll() {
        List<User> ulist = userService.findAll();
        request.setAttribute("ulist", ulist);
        return "findAll";
    }
    
    //分頁查詢
    public String findByPage() {
        //分頁查詢需要提供三個引數:當前頁,每頁顯示的行數,總行數
        Page page=new Page();
        page.setSize(3);
        Integer count=userService.findCount();
        page.setCount(count);
        //第一次進入,沒有當前頁,需要手動提供
        String nowPage = request.getParameter("nowPage");
        if(StringUtils.isBlank(nowPage)){
            //如果從頁面中獲取的nowPage是空,說明是第一次進入,手動設定為1
            nowPage="1";
        }
        page.setNowPage(Integer.parseInt(nowPage));
        List<User> ulist = userService.findByPage(page);
        request.setAttribute("ulist", ulist);
        request.setAttribute("page", page);
        return "findByPage";
    }
    
    
    
    //多條件分頁查詢
    public String findByPU() {
        //分頁查詢需要提供三個引數:當前頁,每頁顯示的行數,總行數
        Page page=new Page();
        page.setSize(3);
        //查詢符合條件的所有資料
        Integer count=userService.findCountByPU(user);
        page.setCount(count);
        //第一次進入,沒有當前頁,需要手動提供
        String nowPage = request.getParameter("nowPage");
        if(StringUtils.isBlank(nowPage)){
            //如果從頁面中獲取的nowPage是空,說明是第一次進入,手動設定為1
            nowPage="1";
        }
        page.setNowPage(Integer.parseInt(nowPage));
        List<User> ulist = userService.findByPU(page, user);
        request.setAttribute("ulist", ulist);
        request.setAttribute("page", page);
        request.setAttribute("user", user);
        return "findByPU";
    }

}

dao層

package com.dao.impl;

import java.sql.SQLException;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.dao.IUserDao;
import com.po.Page;
import com.po.User;


/**
 * 使用spring提供的hibernate模板進行增刪改查,需要注入sessionFactory
 * @author wesley
 *
 */
@Repository
public class UserDaoImpl  extends HibernateDaoSupport implements IUserDao {

    //需要注入sessionfactory,使用任意set方法
    @Resource(name="sessionFactory")
    public  void setDI(SessionFactory sf) {
        this.setSessionFactory(sf);
    }
    
    @Override
    public void add(User user) {
        this.getHibernateTemplate().save(user);
    }

    
    @Override
    public void delete(User user) {
        this.getHibernateTemplate().delete(user);
    }

    @Override
    public void update(User user) {
        this.getHibernateTemplate().update(user);
    }

    @Override
    public List<User> findAll() {
        String hql="from User";
        List<User> ulist = this.getHibernateTemplate().find(hql);
        return ulist;
    }

    /*from User where 1=1
    and id=?
    and name=?
    and pass=?*/
    @Override
    public List<User> findByUser(User user) {
        StringBuffer bf=new StringBuffer();
        bf.append("from User where 1=1");
        if(user.getId()!=null){
            bf.append(" and id="+user.getId());
        }
        if(StringUtils.isNotBlank(user.getName())){
            bf.append(" and name like '%"+user.getName()+"%'");
        }
        if(StringUtils.isNotBlank(user.getPass())){
            bf.append(" and pass like '%"+user.getPass()+"%'");
        }
        String ss = bf.toString();
        List<User> ulist = this.getHibernateTemplate().find(ss);
        return ulist;
    }

    @Override
    public User findById(Integer id) {
        // TODO Auto-generated method stub
        return this.getHibernateTemplate().get(User.class, id);
    }

    //使用回撥session建立query
    @Override
    public List<User> findByPage(final Page page) {
        /*SessionFactory sessionFactory = this.getHibernateTemplate().getSessionFactory();
        Session session = sessionFactory.openSession();
        String hql="from User ";
        Query query = session.createQuery(hql);
        query.setFirstResult(page.getIndex());//開始下標
        query.setMaxResults(page.getSize());//每頁顯示的行數
        List list = query.list();*/
        
        List<User> ulist=this.getHibernateTemplate().execute(new HibernateCallback() {
            @Override
            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                String hql="from User ";
                Query query = session.createQuery(hql);
                //使用query的兩個方法進行分頁查詢
                query.setFirstResult(page.getIndex());//開始下標
                query.setMaxResults(page.getSize());//每頁顯示的行數
                List<User> list = query.list();
                return list;
            }
            
        });
        
        return ulist;
        
    }

    @Override
    public Integer findCount() {
        String hql="from User";
        return this.getHibernateTemplate().find(hql).size();
    }

    /*多條件分頁查詢*/
    @Override
    public List<User> findByPU(final Page page, User user) {
        StringBuffer bf=new StringBuffer();
        bf.append("from User where 1=1");
        if(user.getId()!=null){
            bf.append(" and id="+user.getId());
        }
        if(StringUtils.isNotBlank(user.getName())){
            bf.append(" and name like '%"+user.getName()+"%'");
        }
        if(StringUtils.isNotBlank(user.getPass())){
            bf.append(" and pass like '%"+user.getPass()+"%'");
        }
        final String ss = bf.toString();
        
        List<User> ulist=this.getHibernateTemplate().execute(new HibernateCallback() {
            @Override
            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(ss);
                //使用query的兩個方法進行分頁查詢
                query.setFirstResult(page.getIndex());//開始下標
                query.setMaxResults(page.getSize());//每頁顯示的行數
                List<User> list = query.list();
                return list;
            }
            
        });
        
        return ulist;
    }

    @Override
    public Integer findCountByPU(User user) {
        StringBuffer bf=new StringBuffer();
        bf.append("from User where 1=1");
        if(user.getId()!=null){
            bf.append(" and id="+user.getId());
        }
        if(StringUtils.isNotBlank(user.getName())){
            bf.append(" and name like '%"+user.getName()+"%'");
        }
        if(StringUtils.isNotBlank(user.getPass())){
            bf.append(" and pass like '%"+user.getPass()+"%'");
        }
        String ss = bf.toString();
        List<User> ulist = this.getHibernateTemplate().find(ss);
        return ulist.size();
    }
    
    

}

service層

package com.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dao.IUserDao;
import com.dao.impl.UserDaoImpl;
import com.po.Page;
import com.po.User;
import com.service.IUserService;

@Service
public class UserServiceImpl implements IUserService{

    @Autowired
    private IUserDao userDao;

    @Override
    public void add(User user) {
        userDao.add(user);
    }

    @Override
    public void delete(User user) {
        userDao.delete(user);
    }

    @Override
    public void update(User user) {
        userDao.update(user);
    }

    @Override
    public List<User> findAll() {
        // TODO Auto-generated method stub
        return userDao.findAll();
    }

    @Override
    public List<User> findByUser(User user) {
        // TODO Auto-generated method stub
        return userDao.findByUser(user);
    }

    @Override
    public User findById(Integer id) {
        // TODO Auto-generated method stub
        return userDao.findById(id);
    }

    @Override
    public List<User> findByPage(Page page) {
        // TODO Auto-generated method stub
        return userDao.findByPage(page);
    }

    @Override
    public Integer findCount() {
        // TODO Auto-generated method stub
        return userDao.findCount();
    }

    @Override
    public List<User> findByPU(Page page, User user) {
        // TODO Auto-generated method stub
        return userDao.findByPU(page, user);
    }

    @Override
    public Integer findCountByPU(User user) {
        // TODO Auto-generated method stub
        return userDao.findCountByPU(user);
    }

    
}

struts.hbm.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 新增struts2請求字尾常量 -->
    <!-- <constant name="struts.action.extension" value="action,do"></constant> -->
    <!-- 當struts的配置檔案修改後,系統是否自動重新載入該檔案,預設值為false -->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- 新增常量:struts的action交給spring建立 -->
    <constant name="struts.objectFactory" value="spring"></constant>
    <package name="user" namespace="/" extends="struts-default">
        <action name="userAction_*" class="userAction" method="{1}">
            <result name="findAll">/findAll.jsp</result>
            <result name="findByUser">/findAll.jsp</result>
            <result name="findByPage">/findByPage.jsp</result>
            <result name="findByPU">/findByPU.jsp</result>
            <result name="findById">/update.jsp</result>
            <result name="update" type="redirectAction">
                <param name="actionName">userAction_findAll</param>
            </result>
        </action>
    </package>
</struts>

beanx.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!-- 掃描註解 -->
    <context:component-scan base-package="com"></context:component-scan>
    <!-- aop註解支援 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <!-- 開啟事務註解驅動 -->
    <tx:annotation-driven transaction-manager="tx"/>
    
    <!-- spring建立sessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!-- 引用資料來源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 可選配置 -->
        <property name="hibernateProperties">
            <props>
                <prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="show_sql">true</prop>
                <prop key="format_sql">false</prop>
            </props>
        </property>
        
        <!-- 註冊hbm檔案 -->
        <property name="mappingLocations">
            <value>classpath:com/po/*.hbm.xml</value>
        </property>
    </bean>
 
    <!-- 配置資料來源 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql:///lykj0904"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>

    <!-- 配置事務管理器 -->
    <bean id="tx"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>    
  <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- 新增struts的啟動配置 -->
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 新增spring的啟動配置 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- spring啟動的時候預設是到web-inf下找applicationContext.xml,如果路徑修改,需要在此配置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:beans.xml</param-value>
    </context-param>
 
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>