`
endual
  • 浏览: 3557427 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring+SpringMVC+JPA

 
阅读更多

SpringMVC是越来越火,自己也弄一个Spring+SpringMVC+JPA的简单框架。

  1、搭建环境。

    1)下载Spring3.1.2的发布包;Hibernate4.1.7的发布包(没有使用hibernate的API,只是使用了它对JPA的实现);下载 BoneCP 连接池框架及其依赖的jar,下载缓存框架ehcache,全部所用到的jar包如下:  

antlr-2.7.7.jar
bonecp-0.7.1.RELEASE.jar
bonecp-provider-0.7.1-rc2.jar
bonecp-spring-0.7.1-rc1.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.aspectj.weaver-1.6.12.RELEASE.jar
dom4j-1.6.1.jar
ehcache-core-2.5.2.jar<br>ehcache-spring-annotations-1.2.0.jar
guava-12.0.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.7.Final.jar
hibernate-entitymanager-4.1.7.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
log4j-1.2.17.jar
mysql-connector-java-5.1.6-bin.jar
org.springframework.aop-3.1.2.RELEASE.jar
org.springframework.asm-3.1.2.RELEASE.jar
org.springframework.aspects-3.1.2.RELEASE.jar
org.springframework.beans-3.1.2.RELEASE.jar
org.springframework.context-3.1.2.RELEASE.jar
org.springframework.context.support-3.1.2.RELEASE.jar
org.springframework.core-3.1.2.RELEASE.jar
org.springframework.expression-3.1.2.RELEASE.jar
org.springframework.instrument-3.1.2.RELEASE.jar
org.springframework.instrument.tomcat-3.1.2.RELEASE.jar
org.springframework.jdbc-3.1.2.RELEASE.jar
org.springframework.jms-3.1.2.RELEASE.jar
org.springframework.orm-3.1.2.RELEASE.jar
org.springframework.oxm-3.1.2.RELEASE.jar
org.springframework.test-3.1.2.RELEASE.jar
org.springframework.transaction-3.1.2.RELEASE.jar
org.springframework.web-3.1.2.RELEASE.jar
org.springframework.web.portlet-3.1.2.RELEASE.jar
org.springframework.web.servlet-3.1.2.RELEASE.jar
slf4j-api-1.6.1.jar
slf4j-nop-1.6.1.jar

   2)建立一个Web Project,引入上述jar包

    2.1)web.xml配置如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    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_2_5.xsd">
    
    <!-- 配置Log4j -->
    <context-param>
          <param-name>webAppRootKey</param-name>
          <param-value>spring_springmvc_jpa.root</param-value>
    </context-param>
    <context-param>
          <param-name>log4jConfigLocation</param-name>
          <param-value>classpath:log4j.properties</param-value>
    </context-param>
    <listener>
          <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    
    <!-- 配置编码过滤器 -->
    <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>
    </filter>
    <filter-mapping>
          <filter-name>characterEncodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- 配置Spring监听器 -->
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <!-- Spring 刷新Introspector防止内存泄露 -->
    <listener>
        <listener-class>
            org.springframework.web.util.IntrospectorCleanupListener
        </listener-class>
    </listener>

    
    <!-- SpringMVC核心分发器 -->
    <servlet> 
          <servlet-name>dispatcherServlet</servlet-name> 
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
          <init-param> 
                  <param-name>contextConfigLocation</param-name> 
                  <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> 
          </init-param> 
          <load-on-startup>1</load-on-startup> 
     </servlet> 
     <!-- 映射*.do的请求 -->
     <servlet-mapping> 
             <servlet-name>dispatcherServlet</servlet-name> 
             <url-pattern>*.do</url-pattern> 
     </servlet-mapping> 

    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
复制代码

    2.2)在src目录下建立log4j.properties日志配置文件,内容如下:

复制代码
log4j.rootLogger=INFO,stdout,file

#应用于控制台 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%c]-[%p] %m%n 
#应用于文件 
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.file.File=${spring_springmvc_jpa.root}/app.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n


log4j.logger.org.hibernate.tool.hbm2ddl=debug
复制代码

    2.3)在src目录下建立缓存的配置文件ehcache.xml,内容如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="true" monitoring="autodetect"
         dynamicConfig="true">

   <!--  <diskStore path="java.io.tmpdir"/> -->
   
   <!-- 配置缓存文件存放路径 -->
   <diskStore path="E:/CacheTmpDir" />

   <!--   
        
        1.必须要有的属性:   
        
        name: cache的名字,用来识别不同的cache,必须惟一。   
        
        maxElementsInMemory: 内存管理的缓存元素数量最大限值。   
        
        maxElementsOnDisk: 硬盘管理的缓存元素数量最大限值。默认值为0,就是没有限制。   
        
        eternal: 设定元素是否持久话。若设为true,则缓存元素不会过期。   
        
        overflowToDisk: 设定是否在内存填满的时候把数据转到磁盘上。   
        
        2.下面是一些可选属性:   
        
        timeToIdleSeconds: 设定元素在过期前空闲状态的时间,只对非持久性缓存对象有效。默认值为0,值为0意味着元素可以闲置至无限长时间。   
        
        timeToLiveSeconds: 设定元素从创建到过期的时间。其他与timeToIdleSeconds类似。   
        
        diskPersistent: 设定在虚拟机重启时是否进行磁盘存储,默认为false.(我的直觉,对于安全小型应用,宜设为true)。   
        
        diskExpiryThreadIntervalSeconds: 访问磁盘线程活动时间。   
        
        diskSpoolBufferSizeMB: 存入磁盘时的缓冲区大小,默认30MB,每个缓存都有自己的缓冲区。   
        
        memoryStoreEvictionPolicy: 元素逐出缓存规则。共有三种,Recently Used (LRU)最近最少使用,为默认。
        First In First Out (FIFO),先进先出。Less Frequently Used(specified as LFU)最少使用  
        
    -->
   
  <defaultCache maxElementsInMemory="10000"
                    eternal="false"
                    timeToIdleSeconds="120" 
                    timeToLiveSeconds="120" 
                    overflowToDisk="true"
                    maxElementsOnDisk="10000000" 
                    diskPersistent="false"
                    diskExpiryThreadIntervalSeconds="120" 
                    memoryStoreEvictionPolicy="LRU" />
                    
    <!-- User cache -->
    <cache name="userCache"
          maxElementsInMemory="10000"
          maxElementsOnDisk="1000"
          eternal="false"
          overflowToDisk="true"
          diskSpoolBufferSizeMB="20" 
          timeToIdleSeconds="300"
          timeToLiveSeconds="600" 
          memoryStoreEvictionPolicy="LFU" />
          
</ehcache>
复制代码

    2.4)在src目录下建立数据库连接属性配置文件jdbc.properties,内容如下:

复制代码
#mysql数据库用
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_springmvc_jpa?useUnicode=true&amp;characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root


##===============BoneCP配置==============##

#检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0#
BoneCP.idleConnectionTestPeriod=60

#连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0# 
BoneCP.idleMaxAge=60

#每个分区最大的连接数#  
BoneCP.maxConnectionsPerPartition=5

#每个分区最小的连接数#  
BoneCP.minConnectionsPerPartition=1

#分区数 ,默认值2,最小1,推荐3-4,视应用而定#  
BoneCP.partitionCount=3

#每次去拿数据库连接的时候一次性要拿几个,默认值:2#  
BoneCP.acquireIncrement=2  

#缓存prepared statements的大小,默认值:0#  
BoneCP.statementsCacheSize=0 

#每个分区释放链接助理进程的数量,默认值:3,除非你的一个数据库连接的时间内做了很多工作,不然过多的助理进程会影响你的性能#  
BoneCP.releaseHelperThreads=3 
复制代码

    2.5)在WEB-INF目录下建立Spring的配置文件applicationContext.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:tx="http://www.springframework.org/schema/tx"
               xmlns:context="http://www.springframework.org/schema/context"
               xmlns:p="http://www.springframework.org/schema/p"  
               xmlns:cache="http://www.springframework.org/schema/cache"  
         xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"  
               xsi:schemaLocation="
                    http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                    http://www.springframework.org/schema/tx 
                    http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
                    http://www.springframework.org/schema/aop 
                    http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
                    http://www.springframework.org/schema/context      
                    http://www.springframework.org/schema/context/spring-context-3.1.xsd
                    http://www.springframework.org/schema/cache 
                     http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
            http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring 
            http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">

    

        
        <!-- 注解支持 -->
        <context:annotation-config />
        
        <!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 -->
        <context:component-scan base-package="cn.luxh.app">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
        </context:component-scan> 
    
        <!-- 属性文件位置 -->
        <context:property-placeholder location="classpath:jdbc.properties" /> 
        
        <!-- 数据源 -->
        <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
            <!-- 数据库驱动 -->
            <property name="driverClass" value="${jdbc.driverClassName}" />
            <!-- 相应驱动的jdbcUrl-->
            <property name="jdbcUrl" value="${jdbc.url}" />
            <!-- 数据库的用户名 -->
            <property name="username" value="${jdbc.username}" />
            <!-- 数据库的密码 -->
            <property name="password" value="${jdbc.password}" />
            <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->
            <property name="idleConnectionTestPeriod" value="${BoneCP.idleConnectionTestPeriod}" />
            <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->
            <property name="idleMaxAge" value="${BoneCP.idleMaxAge}" />
            <!-- 每个分区最大的连接数 -->
            <property name="maxConnectionsPerPartition" value="${BoneCP.maxConnectionsPerPartition}" />
            <!-- 每个分区最小的连接数 -->
            <property name="minConnectionsPerPartition" value="${BoneCP.minConnectionsPerPartition}" />
            <!-- 分区数 ,默认值2,最小1,推荐3-4,视应用而定 -->
            <property name="partitionCount" value="${BoneCP.partitionCount}" />
            <!-- 每次去拿数据库连接的时候一次性要拿几个,默认值:2 -->
            <property name="acquireIncrement" value="${BoneCP.acquireIncrement}" />
            <!-- 缓存prepared statements的大小,默认值:0 -->
            <property name="statementsCacheSize" value="${BoneCP.statementsCacheSize}" />
            <!-- 每个分区释放链接助理进程的数量,默认值:3,除非你的一个数据库连接的时间内做了很多工作,不然过多的助理进程会影响你的性能 -->
            <property name="releaseHelperThreads" value="${BoneCP.releaseHelperThreads}" />
       </bean>
       
     <!-- JPA实体管理器工厂 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
           <property name="dataSource" ref="dataSource"/>
           <property name="persistenceProvider" ref="persistenceProvider"/>
           <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>  
      <property name="jpaDialect" ref="jpaDialect"/>  
           
           <property name="packagesToScan" value="cn.luxh.app.entity"/>
           
           <property name="jpaProperties">
            <props>
             <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
             <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
             <prop key="hibernate.max_fetch_depth">3</prop>
             <prop key="hibernate.jdbc.fetch_size">18</prop>
             <prop key="hibernate.jdbc.batch_size">10</prop>
             <prop key="hibernate.hbm2ddl.auto">update</prop>
             <prop key="hibernate.show_sql">true</prop>
             <prop key="hibernate.format_sql">true</prop>
             <prop key="javax.persistence.validation.mode">none</prop>
            </props>
           </property>
       </bean>
       <!-- 用于指定持久化实现厂商类 -->
       <bean id="persistenceProvider" class="org.hibernate.ejb.HibernatePersistence"/>
       <!-- 用于设置JPA实现厂商的特定属性 -->
       <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
     <property name="database" value="MYSQL"/>  
    </bean>  
    <!-- 用于指定一些高级特性 -->
    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>  
              
       <!-- 事务管理器 -->  
       <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
           <property name="entityManagerFactory" ref="entityManagerFactory" />  
       </bean> 
        
       <!-- 注解式事务 --> 
       <tx:annotation-driven transaction-manager="txManager"/>
       
        <!-- 启用缓存注解功能 -->
       <ehcache:annotation-driven cache-manager="ehCacheManager" />  
     
       
       <!-- cacheManager工厂类,指定ehcache.xml的位置 -->    
       <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
              p:configLocation="classpath:/ehcache.xml"/>

</beans>
复制代码

 

    2.6)在WEB-INF目录下建立SpringMVC的配置文件dispatcher-servlet.xml,内容如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
             xmlns:mvc="http://www.springframework.org/schema/mvc" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:context="http://www.springframework.org/schema/context" 
             xsi:schemaLocation=" 
                http://www.springframework.org/schema/beans 
                http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
                http://www.springframework.org/schema/context 
                http://www.springframework.org/schema/context/spring-context-3.1.xsd 
                http://www.springframework.org/schema/mvc 
                http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 

       


        <mvc:annotation-driven/> 
        <context:component-scan base-package="cn.luxh.app.controller"/>

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

</beans> 
复制代码

  2、编写代码

    1)在WEB-INF目录下建立名叫jsp的文件夹,用于放置jsp页面,和SpringMVC配置文件中的<property name="prefix" value="/WEB-INF/jsp/"/>相对应。

    2)创建一个实体。  

复制代码
package cn.luxh.app.entity.privilege;

import java.io.Serializable;

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


/**
 * 用户信息
 * @author Luxh
 */

@Entity
@Table(name="t_user_info")
public class UserInfo implements Serializable{

    private static final long serialVersionUID = -3838732995856086555L;
    
    @Id
    @GeneratedValue
    private Long id;
    
    //账号
    @Column(length=20,nullable=false)
    private String account;
    //密码
    @Column(length=20,nullable=false)
    private String password;
    //姓名
    @Column(length=32,nullable=false)
    private String name;
    
    //getter、setter
    //......
    

}
复制代码

    3)通用DAO,用于其他DAO继承,

      3.1)接口

复制代码
package cn.luxh.app.dao.base;

/**
 * 通用的DAO
 * @author Luxh
 */
public interface BaseDao {
    
    /**
     * 持久化实体
     * @param entity
     */
    void save(Object entity);
    
    /**
     * 根据主键查询实体
     * @param <T>
     * @param clazz  实体类
     * @param id     主键
     * @return
     */
    <T> T getById(Class<T> clazz,Object id);
}
复制代码

      3.2)实现

复制代码
package cn.luxh.app.dao.base;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;

/**
 * 通用DAO实现
 * @author Luxh
 */

@Repository
public class BaseDaoImpl implements BaseDao{
    
    //注入实体管理器
    @PersistenceContext
    protected EntityManager em;
    
    public <T> T getById(Class<T> clazz, Object id) {
        return em.find(clazz, id);
    }
    
    public void save(Object entity) {
        em.persist(entity);
    }
    
}
复制代码

    4)UserDao,继承于通用DAO

      4.1)接口  

复制代码
package cn.luxh.app.dao.privilege;

import cn.luxh.app.dao.base.BaseDao;

/**
 * User Dao Interface
 * @author Luxh
 */
public interface UserDao extends BaseDao{

}
复制代码

      4.2)实现

复制代码
package cn.luxh.app.dao.privilege;

import org.springframework.stereotype.Repository;

import cn.luxh.app.dao.base.BaseDaoImpl;

/**
 * User DAO Implement
 * @author Luxh
 */

@Repository
public class UserDaoImpl extends BaseDaoImpl implements UserDao{

}
复制代码

  5)通用的业务接口

    这里只写一个接口,留给其他Service实现。

复制代码
package cn.luxh.app.service.base;

/**
 * 通用业务接口
 * @author Luxh
 */
public interface BaseService {
    
    /**
     * 保存实体
     * @param entity
     */
    void save(Object entity);
    
    /**
     * 根据主键获取对象
     * @param <T>
     * @param clazz 实体类
     * @param id    主键
     * @return
     */
    <T> T getById(Class<T> clazz,Object id);
}
复制代码

    6)用户业务接口UserService,实现通用业务接口的方法,并加上缓存

      6.1)接口

复制代码
package cn.luxh.app.service.privilege;

import cn.luxh.app.service.base.BaseService;

/**
 * User Service
 * @author Luxh
 */
public interface UserService extends BaseService {
    
}
复制代码

      6.2)实现

复制代码
package cn.luxh.app.service.privilege;

import org.springframework.beans.factory.annotation.Autowired;
import com.googlecode.ehcache.annotations.TriggersRemove;
import com.googlecode.ehcache.annotations.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.luxh.app.dao.privilege.UserDao;

/**
 * User Service Implement
 * @author Luxh
 */

@Service
public class UserServiceImpl implements UserService{
    
    @Autowired
    private UserDao userDao;
    
    @Cacheable(cacheName="userCache")//缓存数据
    public <T> T getById(Class<T> clazz, Object id) {
        return userDao.getById(clazz, id);
    }

    @Transactional(propagation=Propagation.REQUIRED)
    @TriggersRemove(cacheName="userCache",removeAll=true)//清除缓存
    public void save(Object entity) {
        userDao.save(entity);
    }
    
}
复制代码

    7)控制层,暂时还没有写一个公共的Controller用于被继承,就直接写UserController吧

复制代码
package cn.luxh.app.controller.privilege;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import cn.luxh.app.entity.privilege.UserInfo;
import cn.luxh.app.service.privilege.UserService;


/**
 * User Controller
 * @author Luxh
 */

@Controller
@RequestMapping(value="/user")
public class UserController {
    
    private static final Log LOG = LogFactory.getLog(UserController.class);
    
    
    @Autowired
    private UserService userService;//注入业务接口
    
    /**
     * 用户列表
     */
    @RequestMapping(value="/userList.do")
    public String userList(ModelMap modelMap) {
        LOG.info("访问用户列表");
        //打印一句话测试,不查数据库了
        return "user/userList"; //根据SpringMVC配置文件配好的前缀和后缀,自动转为:/WEB-INF/jsp/user/userList.jsp
    }
    
    /**
     * 根据主键查找用户
     */
    @RequestMapping(value="/getUserById.do")
    public String getUserById(@RequestParam long id) {
        LOG.info("id is :"+id);
        UserInfo userInfo = userService.getById(UserInfo.class,id);
        LOG.info("user's name is :"+userInfo.getName());
        return "user/userList";
    }
    
    /**
     * 保存用户
     */
    @RequestMapping(value="/saveUser.do")
    public String saveUser(UserInfo userInfo,RedirectAttributes redirectAttributes) {
        LOG.info("保存用户");
        userService.save(userInfo);
        //重定向后的提示信息,使用RedirectAttributes传递,在JSP页面可以用${message}获取
        //提示信息只出现一次,刷新也不会重复提示,
        redirectAttributes.addFlashAttribute("message", "操作成功");
        
        //重定向,防止表单重复提交
        return "redirect:userList.do";//相对于当前路径  
        //return "redirect:/user/userList.do";//相对于当前项目根路径
    }
    

}
复制代码

   

      访问用户列表就是http://localhost:8080/APP/user/userList.do

      根据主键查找用户:http://localhost:8080/APP/user/getUserById.do?id=1

      保存用户:http://localhost:8080/APP/user/saveUser.do

      APP是我的应用名称。

 

 
 
分享到:
评论
3 楼 ysj570440569 2016-09-12  
Maven多模块spring + springMVC + JPA/MyBatis企业级应用项目基础架构
https://github.com/Jay-Y/yServer
1 楼 lucky_god 2015-07-08  
 

相关推荐

    spring+springMVC+jpa+hibernate框架整合

    在IT领域,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+jpa+hibernate框架整合"就是一个常见的解决方案。这个整合涉及到四个关键的技术栈:Spring框架、SpringMVC、JPA(Java Persistence API)...

    Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA

    在现代Java Web开发中,"Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA"是一个常见的架构组合,被广泛应用于构建企业级应用程序。这个组合通常被称为"SSM",其中"M"代表Maven,"S"代表Spring,包括Spring核心...

    spring+springmvc+jpa零配置注解开发

    总的来说,“spring+springmvc+jpa零配置注解开发”意味着使用Spring框架、Spring MVC以及JPA,通过注解来替代XML配置,实现高效且简洁的Java Web应用开发。这样的开发方式提高了代码的可读性和可维护性,同时也降低...

    spring+springmvc+jpa+jsp 练习demo项目源码

    【标题】:“Spring+SpringMVC+JPA+JSP 练习demo项目源码”是一个结合了四个关键Java技术的实践项目,旨在帮助开发者掌握它们的集成与应用。 【描述】:该项目的核心是通过Spring框架(包括Spring Core和Spring MVC...

    spring+springmvc+jpa(hibernate)框架整合

    Spring、SpringMVC和JPA(Hibernate)是Java开发中常用的三大框架,它们共同构建了一个高效、灵活的企业级应用架构。下面将详细讲解这三大框架的整合及其在实际项目中的运用。 Spring框架是Java企业级应用的核心...

    spring3+springmvc+jpa+hibernate多数据源

    "spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...

    CRM营销系统 spring+springmvc+springdatajpa+jsp+maven

    这个项目采用了Spring、SpringMVC、SpringDataJPA和JSP等技术,结合Maven进行构建和管理依赖。以下将详细介绍这些关键技术及其在CRM系统中的应用。 1. Spring框架:Spring是一个全面的后端开发框架,它提供依赖注入...

    SSM框架-详细整合教程(Spring+SpringMVC+MyBatis).pdf

    SSM框架,即Spring、SpringMVC和...在实际项目中,还可以根据需求添加缓存、安全、国际化的配置,以及对其他服务的集成,如Spring Security、Spring Data JPA等。不断学习和实践,才能更好地掌握SSM框架及其应用。

    spring+SpringMVC+Spring Data JPA+Maven(增删该查功能齐全)

    技术架构:SpringMVC4+Spring4+Spring Data JPA+hibernate4+Maven 声明:查了好多资料,下载了好多代码,发现没有几个能运行起来的,于是写下此代码,希望能够帮助后来者。此程序导入&创建DB,配置好maven便可运行。...

    Spring+SpringMVC+Hibernate+JSP框架搭建

    3. **集成Hibernate**:配置Hibernate SessionFactory,通过Spring的JPA或HibernateTemplate实现对数据库的操作,如增删改查。 4. **创建JSP页面**:设计JSP页面作为用户界面,使用EL(Expression Language)和JSTL...

    Spring+SpringMvc+Maven+Hibernate整合

    在Spring中,可以使用HibernateTemplate或JPA来集成Hibernate,进一步减少数据库操作的复杂性。 整合这四大框架的过程主要包括以下步骤: 1. 创建Maven项目:首先,我们需要创建一个基于Maven的Web项目,定义合适...

    Spring+SpringMVC+SpringDataJPA+Hibernate

    在本文中,我们将深入探讨"Spring+SpringMVC+SpringDataJPA+Hibernate"这个集成框架,这是一个在Java开发中广泛使用的强大组合,用于构建高效、可扩展的企业级应用程序。 首先,Spring是一个全面的Java应用框架,它...

    Spring+SpringMVC+Hibernate的jar包集合

    Spring、SpringMVC和Hibernate是Java开发中三大核心框架,它们各自扮演着不同的...在实际项目中,为了获得更好的性能和安全性,通常会选择更新的版本和更多的现代技术,如Spring Boot、Spring Data JPA和Thymeleaf等。

    spring+springmvc+spring data jpa+mysql

    标题 "spring+springmvc+spring data jpa+mysql" 涉及到的是一个基于Java的Web开发技术栈,主要用于构建高效、灵活的企业级应用程序。这个技术组合包括四个主要组件: 1. **Spring框架**:这是一个全面的企业级应用...

    SpringMVC+Spring+SpringDataJPA+Hibernate整合登录的效果

    这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...

    Spring+SpringMVC +Hibernate 整合

    Spring、SpringMVC和Hibernate是Java开发中三大核心框架,它们的整合是企业级Web应用的常见架构选择。Spring作为基础框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能;SpringMVC则负责处理HTTP请求,实现...

    Spring+SpringMVC+MyBatis的简单搭建

    在实际开发中,SSM框架还可以配合其他组件,如Spring Security进行权限管理,Spring Boot简化配置,Spring Data JPA进行ORM操作等,提供更强大的功能。总的来说,SSM框架以其灵活性、易用性和高效率,深受Java开发者...

    开源框架面试题系列:Spring+SpringMVC+MyBatis

    5. **Spring Data JPA**和**MyBatis**:比较这两者在数据访问层的不同实现,讨论各自的优点和适用场景。 6. **Spring Security**:介绍Spring的安全管理功能,如身份验证、授权和会话管理。 其次,MyBatis是一个...

    用于理解Spring+SpringMVC+Hibernate开发流程的例子

    Spring、SpringMVC和Hibernate是Java企业级应用开发中的三大核心框架,它们分别负责不同的职责。Spring作为基础框架,提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)...

Global site tag (gtag.js) - Google Analytics