Spring MVC 3.1

来源:互联网 发布:淘宝服装代销网站 编辑:程序博客网 时间:2024/06/10 16:45
1、搭建景象。

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

antlr-2.7.7.jarbonecp-0.7.1.RELEASE.jarbonecp-provider-0.7.1-rc2.jarbonecp-spring-0.7.1-rc1.jarcom.springsource.net.sf.cglib-2.2.0.jarcom.springsource.org.aopalliance-1.0.0.jarcom.springsource.org.apache.commons.logging-1.1.1.jarcom.springsource.org.aspectj.weaver-1.6.12.RELEASE.jardom4j-1.6.1.jarehcache-core-2.5.2.jarguava-12.0.jarhibernate-commons-annotations-4.0.1.Final.jarhibernate-core-4.1.7.Final.jarhibernate-entitymanager-4.1.7.Final.jarhibernate-jpa-2.0-api-1.0.1.Final.jarjavassist-3.15.0-GA.jarjboss-logging-3.1.0.GA.jarjboss-transaction-api_1.1_spec-1.0.0.Final.jarlog4j-1.2.17.jarmysql-connector-java-5.1.6-bin.jarorg.springframework.aop-3.1.2.RELEASE.jarorg.springframework.asm-3.1.2.RELEASE.jarorg.springframework.aspects-3.1.2.RELEASE.jarorg.springframework.beans-3.1.2.RELEASE.jarorg.springframework.context-3.1.2.RELEASE.jarorg.springframework.context.support-3.1.2.RELEASE.jarorg.springframework.core-3.1.2.RELEASE.jarorg.springframework.expression-3.1.2.RELEASE.jarorg.springframework.instrument-3.1.2.RELEASE.jarorg.springframework.instrument.tomcat-3.1.2.RELEASE.jarorg.springframework.jdbc-3.1.2.RELEASE.jarorg.springframework.jms-3.1.2.RELEASE.jarorg.springframework.orm-3.1.2.RELEASE.jarorg.springframework.oxm-3.1.2.RELEASE.jarorg.springframework.test-3.1.2.RELEASE.jarorg.springframework.transaction-3.1.2.RELEASE.jarorg.springframework.web-3.1.2.RELEASE.jarorg.springframework.web.portlet-3.1.2.RELEASE.jarorg.springframework.web.servlet-3.1.2.RELEASE.jarslf4j-api-1.6.1.jarslf4j-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.outlog4j.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.loglog4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%nlog4j.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"         Check="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.Driverjdbc.url=jdbc:mysql://localhost:3306/spring_springmvc_jpa?useUnicode=true&amp;characterEncoding=UTF-8jdbc.username=rootjdbc.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"                 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">                    <!-- 注解支撑 -->        <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"/>       </bean>              <!-- 事务经管器 -->         <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">             <property name="entityManagerFactory" ref="entityManagerFactory" />         </bean>                <!-- 注解式事务 -->        <tx:annotation-driven transaction-manager="txManager"/>               <!-- 启用缓存注解功能 -->       <cache:annotation-driven cache-manager="cacheManager"/>            <!-- 声明cacheManager -->          <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"                   p:cacheManager-ref="ehcache" />              <!-- cacheManager工厂类,指定ehcache.xml的地位 -->           <bean id="ehcache" 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=falseprivate String account;    //暗码    @Column(length=20,nullable=falseprivate String password;    //姓名    @Column(length=32,nullable=falseprivate 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 */@Repositorypublic 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 */@Repositorypublic 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 org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.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 */@Servicepublic class UserServiceImpl implements UserService{        @Autowired    private UserDao userDao;        @Cacheable(value="userCache")//缓存数据    public <T> T getById(Class<T> clazz, Object id) {        return userDao.getById(clazz, id);    }    @Transactional(propagation=Propagation.REQUIRED)    @CacheEvict(value="userCache",allEntries=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

原创粉丝点击