`

Spring+SpringMVC+JPA

 
阅读更多
Spring+SpringMVC+JPA
http://endual.iteye.com/blog/1928295
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";//相对于当前项目根路径
    }
   

}
复制代码
分享到:
评论

相关推荐

    交互修改.rp

    交互修改

    14230-2.pdf

    ISO14230-2标准文档,定义了K线通讯方式和数据格式,对于汽车诊断非常有用

    基于python的求职招聘网站 python+django+vue搭建的求职招聘管理系统 - 毕业设计 - 课程设计.zip

    学习作者过程中,遇到问题可以咨询解决方案前台地址http://job.gitapp.cn后台地址http://job.gitapp.cn/admin后台管理帐号用户名admin123 密码admin123功能介绍平台采用B/S结构,前端采用主流的Python语言进行开发,前端采用主流的V​​ue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括首页、岗位详情页、简历中心、用户设置模块。后台功能包括总览、岗位管理、公司管理、分类管理、标签管理、评论管理、用户管理、运营管理、日志管理、系统信息模块。代码结构服务器目录编号web目录是前端代码部署运行执行步骤(1)安装python 3.8(2) 安装依赖。进入server目录下,执行 pip install -r requests.txt(3)安装mysql 5.7数据库,并创建数据库,创建SQL如下CREATE DATABASE IF NOT EXISTS xxx DEFAULT CHARSET utf8 COLLATE utf8_general_ci(4)恢复

    4602-职业规划设计书PPT护理.pptx

    4602-职业规划设计书PPT护理

    非常好的SqlServer查询性能优化教程资料100%好用.zip

    非常好的SqlServer查询性能优化教程资料100%好用.zip

    基于Springboot+Vue+Python深度神经网络学习算法水质管理预测系统设计毕业源码案例设计.zip

    基于Springboot+Vue+Python深度神经网络学习算法水质管理预测系统设计毕业源码案例设计Springboot_Vue_Python_水质管理_预测基于Springboot+Vue+Python深度神经网络学习算法水质管理预测系统设计毕业源码案例设计程序开发软件Eclipse/Idea + WebStorm/VsCode + Pycharm 数据库mysql 开发技术Springboot + Vue + Python 这个是一个水质管理和预报系统,它是一个全栈Web应用程序,使用机器学习和深度神经网络算法来预测未来的水质。系统一共有2个身份包括管理员和用户。管理员登录后可以查询最新水质检测数据,也可以上报新的水质数据,可以查询管理历史水质数据,查询历史水质趋势图,训练自己的模型参数,选择一个算法模型结果预测下个月的水质信息,管理所有的用户信息用户登录后比管理员就少了个用户管理功能。管理员账号密码 admin/123 用户账号密码user1/123

    微信小程序云开发毕业设计「单词天天斗」,好友,匹配,人机对战,单词本科毕设打字稿原创微信小程序.zip

    单词天天斗 (毕业设计/实战小程序/微信小程序完整项目)介绍该项目基于「微信小程序」原生框架和「微信小程序云开发」实现单词对战类小程序,支持好友对战、随机匹配、人机对战透明不同模式的「对战模式」另外提供「每日对战」词汇」、「生词本」、「排行榜」、「设置」等功能,实现完整的业务闭环。单词库包含从小学、初中、高中、四六级、考研、雅思等常需掌握的词汇,支持自定义词库,支持自定义拓展无限本单词书。技术栈主要为微信小程序、云开发、TypeScript等,从头搭建项目,基于git管理代码版本,使用eslint作为代码格式校验,并对页面进行组件化拆分,前端和云函数均采用TypeScript。实践小程序能力,如用户信息获取、用户登录、全局状态管理、路由、wxs、npm包、播放音频、回复、转发分享、动画、云数据库等。项目提供完整设计稿,项目演示可查看微信小程序「单词天天斗」,扫码体验 ↓这些人毕设参考项目文档齐全、题目合适、技术广度大、业务闭环,包含项目解析文档和教程,这是一个非常适合作为毕设学习的小程序项目。无化部署运营无论你是想通过小程序现变,还是想给自己的「英语课程教材」

    利用ReST与ReAct自改进多步骤推理的大规模语言模型代理

    内容概要:本文提出了结合强化自我训练(ReST)和响应动作链路(ReAct)的方法来构建并改善大规模语言模型代理的性能,尤其是在需要多步骤推理以解决复杂自然语言查询的任务上。文中定义了一个能够在外部工具/ API /环境交互中表现出色的代理,并提出了一种通过迭代训练以前的轨迹来进行连续自我提升和精炼的技术路径。 适合人群:对大型语言模型研究及应用有兴趣的研究人员和工程师。 使用场景及目标:本方法主要适用于处理需要多个信息检索步骤才能完成的问题解决任务,如基于复杂开放性问答系统的发展。具体目标是在减少所需参数量的前提下提高此类系统的准确性、鲁棒性和效率。 其他说明:作者展示了仅经过两轮迭代优化,即可以从一个大的预训练模型蒸馏出性能相当但大小减少两个数量级的小型化模型。此外,在整个过程中没有使用人类标记的数据进行直接监督。

    毕业设计Android,一款水果健康百科app.zip

    毕业设计Android,一款水果健康百科app斯戈利毕业设计Android,一款水果健康百科app

    移动互联网发展和岗位分析.pptx

    移动互联网发展和岗位分析.pptx

    数控加工程序设计.pptx

    数控加工程序设计.pptx

    毕业设计基于STM32的智能停车场设计.zip

    毕业设计基于STM32的智能停车场设计基于STM32的智能停车场设计项目介绍该项目为毕业设计。基于STM32F1平台的智能停车场,板卡划分为主板、控制台指示板及场内红外检测板,支持短信定时报告停车场状态与远程控制、进出场自动电梯停车杆并播报欢迎消息、检测车位和环境温湿度并在屏幕实时显示状态。目前阶段正在进行电路验证设计与打样阶段。预计2月上旬至中旬完成电路设计并进入编码阶段。目前功能概述车辆进场与退场时,语音播报相应的欢迎语句并自动升起停车杆。待车辆完全驶入停车场后,自动降下停车杆。通过红外方式检测车位停车状态,并在门口控制台和相应车位显示停车状态。屏幕显示当前可用车票和当前温湿度每1小时通过短信报告目前停车场车位情况、1小时内车辆进出数量。短信下发控制指令。后续阶段功能车辆停车计费功能。冲卡检测并自动报警功能。加入实时时钟,通过短信安排时间。用户使用场景功能列表模块 功能 商品分类STM32F103VET6 微型系统板 毕业设计使用的开发板 单片机F103VESIM800L模块 支持GPRS短信收发的功能 12864液晶屏

    基于SpringBoot+Vue.js的轻小说在线阅读网站前后端分离全部资料+详细文档.zip

    【资源说明】 基于SpringBoot+Vue.js的轻小说在线阅读网站前后端分离全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    “腾达”游戏分享网站的设计与实现_97c7a2s2.zip

    “腾达”游戏分享网站的设计与实现_97c7a2s2

    大数据与会计 (9).docx

    大数据与会计 (9)

    数学建模matlabppt课件市公开课一等奖百校联赛特等奖课件.pptx

    数学建模matlabppt课件市公开课一等奖百校联赛特等奖课件.pptx

    城市轨道交通通信信号技术_.docx

    城市轨道交通通信信号技术_

    【毕业设计+开题答辩】-基于JAVA_JSP电子书下载系统-【源代码+截图+数据库+论文+视频讲解】

    本文中的项目资源均整理自互联网,若侵犯了您的权益,请及时联系博主,博主会及时处理。 项目资源中使用的技术和系统用处不一定准确和全面,我只是大致的浏览了一下,具体使用技术建议参考代码和视频讲解。 资源中的各内容不一定每一个都非常的完美,可能会有少许错误,建议多看几个,选其中一个自己觉得不错的,用来做毕设或者开题等等。 资源中所列论文可以参考,但是不建议且强烈不建议直接照搬照抄,因为毕竟要查重,避免引起不必要的麻烦。

    压力表计算机软件及应用it计算机专业资料.pptx

    压力表计算机软件及应用it计算机专业资料.pptx

    钢材器材破损铁锈检测69-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    钢材器材破损铁锈检测69-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar钢重用-V4 2024-03-27 5:01 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括1094张图像。 钢元素以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为416x416(拉伸) 应用以下扩展来创建每个源图像的3个版本: *水平翻转的50%概率 *以下90度旋转之一的同等概率:无,顺时针,逆时针方向 * -15%至+15%之间的随机BRIGTHNESS调整 * 0到0.8像素之间的随机高斯模糊

Global site tag (gtag.js) - Google Analytics