1. 程式人生 > >基於SpringMVC+Spring+Hibernate+Maven+Bootstrap的簡單Demo

基於SpringMVC+Spring+Hibernate+Maven+Bootstrap的簡單Demo

趁著週末自己複習搭建了一個SpringMVC小demo。有很多不正之處還請指教。有什麼問題可以私信或者下方留言。有關Ioc可以參考Spring Ioc詳細配置與使用,有關AOP可以參考SpringAOP詳細配置與使用

專案用到的技術:
開發環境IDE eclipse Neon
伺服器Tomcat8.0
JDK 1.8 (正在學習1.8所以還沒有使用到新的語法)
資料庫 Mysql5.5
Maven 3.3.9
分頁框架 pager taglib
後臺框架 Spring4.2.4 SpringMVC4.2.4 Hibernate4.3.10
前端框架 Bootstrap3.3.10
日誌採用了 log4j
測試框架 Spring-test + junit4

專案結構:
這裡寫圖片描述
Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

     <!-- 建立Spring的監聽器 -->
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:bean.xml</param-value> </context-param
>
<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>openSessionInViewerFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInViewerFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <!-- 用於實現分頁 --> <filter> <filter-name>PageFilter</filter-name> <filter-class>com.ctc.Common.PageFilter</filter-class> </filter> <filter-mapping> <filter-name>PageFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

SpringMVC-servlet.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:mvc="http://www.springframework.org/schema/mvc"
    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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <context:component-scan base-package="com.ctc.Controller"/>

    <mvc:annotation-driven />

    <mvc:default-servlet-handler/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/user/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="com.ctc.Common.UserException">error</prop>
            </props>
        </property>
    </bean>

</beans>

bean.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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.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"
        >


    <!-- 開啟Spring的Annotation支援 -->
    <context:annotation-config />
    <!-- 設定Spring 去哪些包中找Annotation -->
    <context:component-scan base-package="com.ctc" />


    <!-- 匯入Src目錄下的jdbc.properties檔案 -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="DataSource"/>
        <property name="packagesToScan">
            <list>
                <value>com.ctc.Model</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.format_sql">false</prop>
            </props>
        </property>
    </bean>
    <!-- 開啟HibernateTemplate,並且為其注入SessionFactory
    使用HibernateTemplate不太方便的就是要獲取session得通過getSessionFactory()方法獲取 -->
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!-- 配置Spring的事務處理 -->
    <!-- 建立事務管理器-->
    <bean id="txManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
<!-- 配置AOP,Spring是通過AOP來進行事務管理的 -->
    <aop:config>
    <!-- 設定pointCut表示哪些方法要加入事務處理 -->
    <!-- 以下的事務是宣告在DAO中,但是通常都會在Service來處理多個業務物件邏輯的關係,注入刪除,更新等,此時如果在執行了一個步驟之後丟擲異常
        就會導致資料不完整,所以事務不應該在DAO層處理,而應該在service,這也就是Spring所提供的一個非常方便的工具,宣告式事務 -->
        <aop:pointcut id="allMethods" 
            expression="execution(* com.ctc.ServiceImpl.*.*(..))" />
        <!-- 通過advisor來確定具體要加入事務控制的方法 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
    </aop:config>
<!-- 配置哪些方法要加入事務控制 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
        <!-- 讓所有的方法都加入事務管理,為了提高效率,可以把一些查詢之類的方法設定為只讀的事務 -->
            <tx:method name="*" propagation="REQUIRED" read-only="true"/>
            <!-- 以下方法都是可能設計修改的方法,就無法設定為只讀 -->
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
</beans>

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ctc</groupId>
  <artifactId>SpringMVC</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>SpringMVC Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

            <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.22</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.10.Final</version>
</dependency>

    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.14</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.7.2</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.7.2</version>
</dependency>

<dependency>
    <groupId>jsptags</groupId>
    <artifactId>pager-taglib</artifactId>
    <version>2.0</version>
</dependency>

  </dependencies>
  <build>
    <finalName>SpringMVC</finalName>
        <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-compiler-plugin</artifactId>

        <version>3.1</version>

        <configuration>

          <source>1.8</source>

          <target>1.8</target>

        </configuration>

      </plugin>

    </plugins>
  </build>
</project>

UserController.java:

package com.ctc.Controller;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.ctc.Model.User;
import com.ctc.Service.UserService;

/**
 * 
 * @author Tency
 * 
 * Date 2016/11
 */
@Controller
public class UserController {

    @Resource
    UserService userServiceImpl;


    @RequestMapping(value="/login",method=RequestMethod.GET)
    public String login()
    {
        return "login";
    }

    @RequestMapping(value="/login",method=RequestMethod.POST)
    public String login(@RequestParam("userName") String userName,
                        @RequestParam("passWord") String passWord,
                        HttpSession session,Model model)
    {
        List<User> list=userServiceImpl.checkLogin(userName, passWord);
        boolean flag=list.isEmpty();
        session.setAttribute("flag", flag);
        return !list.isEmpty()?"redirect:/userManage":"redirect:/login";        
    }

    @RequestMapping(value="/addUser",method=RequestMethod.GET)
    public String userAdd()
    {
        return "userAdd";
    }

    @RequestMapping(value="/addUser",method=RequestMethod.POST)
    public String userAdd(@ModelAttribute("user") User user)
    {
        userServiceImpl.addUser(user);
        return "redirect:/login";
    }

    @RequestMapping(value="/userManage",method=RequestMethod.GET)
    public String userManage(Model model)
    {

        model.addAttribute("pagers", userServiceImpl.userList());
        return "userManage";
    }

    @RequestMapping(value="/userShow/{id}",method=RequestMethod.GET)
    public String userShow(@PathVariable int id,Model model)
    {
        User user=userServiceImpl.showUser(id);
        model.addAttribute(user);
        return "userShow";

    }

    @RequestMapping(value="/userUpdate/{id}" ,method=RequestMethod.GET)
    public String userUpdate(@PathVariable int id,Model model)
    {
        User user=userServiceImpl.showUser(id);
        model.addAttribute(user);
        return "userUpdate";

    }

    @RequestMapping(value="/userUpdate", method=RequestMethod.POST)
    public String userUpdate(@ModelAttribute("user") User user,Model model)
    {
        userServiceImpl.updateUser(user);
        return "redirect:/userUpdate/"+user.getId();

    }

    @RequestMapping(value="/userDelete/{id}", method=RequestMethod.GET)
    public String userDelete(@PathVariable int id)
    {
        userServiceImpl.deleteUser(id);
        return "redirect:/userManage";
    }


}

UserDaoImpl:

package com.ctc.DaoImpl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.stereotype.Repository;

import com.ctc.Dao.UserDao;
import com.ctc.Model.Pager;
import com.ctc.Model.PageConstants;
import com.ctc.Model.User;


/**
 * 
 * @author Tency
 * 
 * Date 2016/11
 */
@Repository("userDaoImpl")
public class UserDaoImpl implements UserDao {

    @Resource
    HibernateTemplate hibernateTemplate;

    @Override
    public List<User> retrieve(String userName, String passWord) {
        // TODO Auto-generated method stub

        List<User> list=new ArrayList<>();
        list=(List<User>) hibernateTemplate.find("from User as u where u.userName='"+userName+"' and u.passWord='"+passWord+"'");

        if(list.size()>0 && list!=null)
            return list;
        return Collections.emptyList();
    }

    @Override
    public void add(User user) {

        hibernateTemplate.save(user);

    }

    @Override
    public Pager<User> retrieveAll() {
        // TODO Auto-generated method stub
        int size = PageConstants.getSize();
        int offset = PageConstants.getOffset();
        Query query = this.hibernateTemplate.getSessionFactory().getCurrentSession().createQuery("from User");
        query.setFirstResult(offset).setMaxResults(size);
        List<User> datas = query.list();
        Pager<User> pager = new Pager<User>();
        pager.setDatas(datas);
        pager.setOffset(offset);
        pager.setSize(size);
        long total = (Long)this.hibernateTemplate.getSessionFactory().getCurrentSession()
                    .createQuery("select count(*) from User")
                    .uniqueResult();
        pager.setTotal(total);
        return pager;
    }

    @Override
    public User load(int id) {
        // TODO Auto-generated method stub
        return hibernateTemplate.load(User.class, id);
    }

    @Override
    public void update(User user) {
        // TODO Auto-generated method stub
         hibernateTemplate.update(user);
    }

    @Override
    public void delete(int id) {
        // TODO Auto-generated method stub
        User user=this.load(id);
        hibernateTemplate.delete(user);
    }



}

User.java:

package com.ctc.Model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;


/**
 * 
 * @author Tency
 * 
 * Date 2016/11
 */
@Entity
@Table(name="user")
public class User {

    private int id;
    private String userName;
    private String passWord;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", userName=" + userName + ", passWord=" + passWord + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + ((passWord == null) ? 0 : passWord.hashCode());
        result = prime * result + ((userName == null) ? 0 : userName.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;
        User other = (User) obj;
        if (id != other.id)
            return false;
        if (passWord == null) {
            if (other.passWord != null)
                return false;
        } else if (!passWord.equals(other.passWord))
            return false;
        if (userName == null) {
            if (other.userName != null)
                return false;
        } else if (!userName.equals(other.userName))
            return false;
        return true;
    }


}

UserServiceImpl.java:
package com.ctc.ServiceImpl;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.ctc.Dao.UserDao;
import com.ctc.Model.Pager;
import com.ctc.Model.User;
import com.ctc.Service.UserService;

/**
*
* @author Tency
*
* Date 2016/11
*/
@Service(“userServiceImpl”)
public class UserServiceImpl implements UserService {

@Resource
UserDao userDaoImpl;
HttpSession session;
HttpServletRequest request;
@Override
public List<User> checkLogin(String userName, String passWord) {
    // TODO Auto-generated method stub
    List<User> list= userDaoImpl.retrieve(userName, passWord);
     request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 
     session=request.getSession();
    if(!list.isEmpty())
    {
        session.setAttribute("userName", list.get(0).getUserName());
    }

    return list;
}

@Override
public void addUser(User user) {
    // TODO Auto-generated method stub
    this.userDaoImpl.add(user);
}

@Override
public User showUser(int id) {
    // TODO Auto-generated method stub
    return userDaoImpl.load(id);
}

@Override
public void updateUser(User user) {
    // TODO Auto-generated method stub
    this.userDaoImpl.update(user);
    request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 
    session=request.getSession();
    session.setAttribute("userName", user.getUserName());
}

@Override
public void deleteUser(int id) {
    // TODO Auto-generated method stub
    this.userDaoImpl.delete(id);
}

@Override
public Pager<User> userList() {
    // TODO Auto-generated method stub
    return userDaoImpl.retrieveAll();
}

}

PageFilter.java:

package com.ctc.Common;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import com.ctc.Model.PageConstants;


/**
 * 
 * @author Tency
 * 
 * Date 2016/11
 */
public class PageFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        int offset = 0;
        try {
            offset = Integer.parseInt(req.getParameter("pager.offset"));
        } catch (NumberFormatException e) {
        }
        try {
            PageConstants.setOffset(offset);
            PageConstants.setSize(5);
            chain.doFilter(req, res);
        }finally {
            PageConstants.removeOffset();
            PageConstants.removeSize();
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

    @Override
    public void destroy() {

    }

}

login.jsp:

<%--
  author Tency

  Date 2016/11
--%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>UserManage Login</title>

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

<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
  <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
  <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
  <![endif]-->
</head>
<body>
    <div class="container">
        <h1>UserManage Login</h1>
        <hr />

        <form action="login" method="post">
            <div class="form-group">
                <label for="userName">UserName:</label> <input type="text"
                    class="form-control" id="userName" name="userName"
                    placeholder="Enter UserName" />
            </div>
            <div class="form-group">
                <label for="password">Password:</label> <input type="text"
                    class="form-control" id="password" name="passWord"
                    placeholder="Enter Password:" />
            </div>

            <div class="form-group">
                <button type="submit" class="btn btn-sm btn-success">Sign
                    in</button>
            </div>
            New to Here? <a href="addUser">Create</a> an account.
        </form>
    </div>

    <c:if test="${flag }">
        <div class="alert alert-danger alert-dismissable" role="alert">
            <button class="close" type="button" data-dismiss="alert">&times;</button>
            error userName or passWord . Please try again.
            <%
            session.removeAttribute("flag");
            %>
        </div>