项目搭建采用技术栈为:Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6

搭建环境文档目录结构说明:

  1. 使用Intellj Idea 搭建项目过程详解
  2. 项目各配置文件讲解及部署
  3. 各层包功能讲解&项目搭建完毕最终效果演示图
  4. 项目中重要代码讲解
  5. webapp文件夹下分层详解
  6. 配置tomcat 运行环境

1. 使用Intellj Idea 搭建项目过程详解


1.1 打开Intellj Idea

 
Intellj idea 截图

1.2 操纵 Intellj Idea 工具栏 新建项目

 
操纵idea 工具栏
 
使用Gradle创建项目
 
完善项目信息
 
设置Gradle
 
确定项目信息
 
选择New Window
 
初始化项目结构截图

需要说明的是,最初创建的项目视图是不完整的,包括webapp文件夹下没有web.xml,以及src包下缺少Java文件夹(放置java源代码文件),Resources文件夹(放置项目配置文件)。
我们继续做以下操作,使得项目的结构符合web 应用项目的层级标准。

 
操纵工具栏为项目添加 web.xml全局配置文件

出现如下视图:

 
新建 web.xml文件
 
设置web.xml文件存储位置

接下来:单击main文件夹按照如下操作:

 
手动创建src中main文件夹下java目录
 
输入java 文件夹名称

点击ok,再按照上图操作操作一遍,输入文件名为resources
最终的结构图如下图所示:

 
项目最终结构图

2. 项目各配置文件讲解及部署


完成了项目的初始化结构创建,接下来我们需要来创建配置文件。
首先是resources文件夹下的配置文件
2.1 resources下资源文件截图:(最终配置的结果)

 
项目所需配置文件最终配置结果

2.2 data-access-applicationContext.xml
主要管理数据库访问组件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd
  9. ">
  10. <!-- 配置自动扫描的包 -->
  11. <context:component-scan base-package="com.fxmms" use-default-filters="false">
  12. <context:include-filter type="regex" expression="com.fxmms.*.*.dao.*"/>
  13. <context:include-filter type="regex" expression="com.fxmms.*.dao.*"/>
  14. </context:component-scan>
  15. <!-- 配置数据源 -->
  16. <context:property-placeholder location="classpath:db.properties"/>
  17. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  18. <property name="driverClassName" value="${jdbc.driverClass}"/>
  19. <property name="url" value="${jdbc.jdbcUrl}"/>
  20. <property name="username" value="${jdbc.user}"/>
  21. <property name="password" value="${jdbc.password}"/>
  22. </bean>
  23. <!--配置hibernate SessionFactory-->
  24. <bean id="sessionFactory"
  25. class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  26. <property name="dataSource" ref="dataSource"></property>
  27. <property name="hibernateProperties">
  28. <props>
  29. <prop key="hibernate.dialect">${dataSource.hibernate.dialect}</prop>
  30. <prop key="hibernate.show_sql">${dataSource.hibernate.show_sql}</prop>
  31. <prop key="hibernate.format_sql">true</prop>
  32. <!--负责自动创建数据表,基本上不能打开注释,否则所有的数据库中表信息都会被删除,重新创建-->
  33. <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> -->
  34. </props>
  35. </property>
  36. <!-- <property name="hibernate.jdbc.batch_size" value="50"></property> -->
  37. <property name="packagesToScan">
  38. <list>
  39. <value>com.fxmms.*.*.domain</value>
  40. <value>com.fxmms.*.domain</value>
  41. </list>
  42. </property>
  43. </bean>
  44. <!--jdbcTemplate start -->
  45. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  46. <property name="dataSource" ref="dataSource"></property>
  47. </bean>
  48. <!--Spring JDBC 中操作 LOB 数据 -->
  49. <bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"
  50. lazy-init="true"></bean>
  51. <!-- 配置JPA部分 -->
  52. <!-- 配置JPA的EntityManagerFactory -->
  53. <!-- <bean id="entityManagerFactory"
  54. class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  55. <property name="dataSource" ref="dataSource"></property>
  56. <property name="jpaVendorAdapter">
  57. <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
  58. </property>
  59. <property name="packagesToScan" value="com.fxmms"></property>
  60. <property name="jpaProperties">
  61. <props>
  62. <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
  63. <prop key="hibernate.hbm2ddl.auto">update</prop>
  64. <prop key="hibernate.show_sql">true</prop>
  65. <prop key="hibernate.format_sql">true</prop>
  66. <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
  67. <prop key="hibernate.cache.use_second_level_cache">true</prop>
  68. <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
  69. </prop>
  70. <prop key="hibernate.cache.use_query_cache">true</prop>
  71. </props>
  72. </property>
  73. <!–使用二級緩存–>
  74. <property name="sharedCacheMode" value="ENABLE_SELECTIVE"></property>
  75. </bean>
  76. <!– 配置事务 –>
  77. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  78. <property name="entityManagerFactory" ref="entityManagerFactory"></property>
  79. </bean>-->
  80. <!-- <!– 配置SpringData部分 –>
  81. <jpa:repositories base-package="com.fxmms"
  82. entity-manager-factory-ref="entityManagerFactory">
  83. </jpa:repositories>-->
  84. </beans>

2.3 service-applicationContext.xml
主要管理业务逻辑组件,包括对数据库访问的事务控制,以及定时任务。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:task="http://www.springframework.org/schema/task"
  7. xmlns:tx="http://www.springframework.org/schema/tx"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop.xsd
  12. http://www.springframework.org/schema/tx
  13. http://www.springframework.org/schema/tx/spring-tx.xsd
  14. http://www.springframework.org/schema/task
  15. http://www.springframework.org/schema/task/spring-task.xsd">
  16. <aop:aspectj-autoproxy/>
  17. <!--设置定时任务-->
  18. <task:annotation-driven/>
  19. <context:component-scan base-package="com.fxmms.www" use-default-filters="false">
  20. <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  21. </context:component-scan>
  22. <!-- enable the configuration of transactional behavior based on annotations -->
  23. <tx:annotation-driven transaction-manager="txManager"/>
  24. <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  25. <property name="sessionFactory" ref="sessionFactory"/>
  26. </bean>
  27. </beans>

2.4 default-servlet.xml
设置springmvc-applicationContext.xml,前端控制器将请求转发到相应的controller层中的处理方法上。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!---->
  13. <mvc:annotation-driven>
  14. <!--json解析-->
  15. <mvc:message-converters>
  16. <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
  17. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
  18. </mvc:message-converters>
  19. </mvc:annotation-driven>
  20. <context:component-scan base-package="com.fxmms.www.controller">
  21. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  22. </context:component-scan>
  23. <!--因为web.xml中defaultDispatcherServlet对所有请求进行了拦截,所以对一些.css .jpg .html .jsp也进行了拦截,所以此配置项
  24. 保证对对静态资源不拦截-->
  25. <mvc:default-servlet-handler/>
  26. <!--视图解析器-->
  27. <bean id="viewResolver"
  28. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  29. <property name="prefix" value="/WEB-INF/views/"/>
  30. <property name="suffix" value=".jsp"/>
  31. </bean>
  32. <!--配置文件上上传-->
  33. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  34. <property name="defaultEncoding" value="utf-8"/>
  35. <property name="maxUploadSize" value="10485760000"/>
  36. <property name="maxInMemorySize" value="40960"/>
  37. </bean>
  38. </beans>

2.5 spring-security.xml
设置spring-security 权限控制配置文件,项目中权限的控制统一在此配置文件中配置,包括从数据库中获取用户的相关信息,以及配置相应pattern的请求过滤规则。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:sec="http://www.springframework.org/schema/security"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/security
  11. http://www.springframework.org/schema/security/spring-security-3.2.xsd">
  12. <!-- <sec:http pattern="/**/*.jpg" security="none"></sec:http>
  13. <sec:http pattern="/**/*.jpeg" security="none"></sec:http>
  14. <sec:http pattern="/**/*.gif" security="none"></sec:http>
  15. <sec:http pattern="/**/*.png" security="none"></sec:http>s
  16. <sec:http pattern="/getCode" security="none" /><!– 不过滤验证码 –>
  17. <sec:http pattern="/test/**" security="none"></sec:http><!– 不过滤测试内容 –>-->
  18. <!--spring security 权限管理配置文件-->
  19. <context:component-scan base-package="com.fxmms.common.security">
  20. </context:component-scan>
  21. <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
  22. <!--权限控制-->
  23. <sec:http auto-config="true" use-expressions="true">
  24. <sec:intercept-url pattern="/superadmin/**" access="hasRole('superadmin')"/>
  25. <sec:intercept-url pattern="/admin/**" access="hasRole('admin')"/>
  26. <sec:intercept-url pattern="/customer/**" access="hasRole('customer')"/>
  27. <!--自定义登陆页面,权限验证失败页面,登录成功页面-->
  28. <sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp" login-processing-url="/j_spring_security_check"
  29. authentication-success-handler-ref="loginSuccessHandler"/>
  30. <!--用户权限不一致出现的权限不可得情况,默认情况下跳转到403页面-->
  31. <sec:access-denied-handler ref="accessDeniedServletHandler" />
  32. <sec:logout logout-success-url="/login.jsp" />
  33. </sec:http>
  34. <sec:authentication-manager>
  35. <sec:authentication-provider>
  36. <!--配置从数据库查询用户权限 and isDelete = 0 and enable = 1-->
  37. <sec:jdbc-user-service data-source-ref="dataSource"
  38. users-by-username-query="select userName,password,enable from mms_admin where userName=? and isDelete = 0 and enable = 1"
  39. authorities-by-username-query="select userName,role from mms_admin where username=?"
  40. ></sec:jdbc-user-service>
  41. </sec:authentication-provider>
  42. </sec:authentication-manager>
  43. </beans>

2.6 db.properties
数据库访问配置文件

  1. jdbc.user=root
  2. jdbc.password=feixun*123
  3. jdbc.driverClass=com.mysql.jdbc.Driver
  4. #jdbc.jdbcUrl=jdbc:mysql://localhost/fxmms?useUnicode=true&characterEncoding=UTF-8
  5. jdbc.jdbcUrl=jdbc:mysql://222.73.156.132:13306/fxmms?useUnicode=true&characterEncoding=UTF-8
  6. jdbc.initPoolSize=5
  7. jdbc.maxPoolSize=20
  8. dataSource.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
  9. #######################
  10. ## local ##
  11. #######################
  12. dataSource.hibernate.show_sql=true

2.7 log4j.properties
配置项目日志文件,日志输出模式为Console

  1. ###########################################################################
  2. # Properties file for the log4j logger system
  3. #
  4. # Note: During the uPortal build, the file at /properties/Logger.properties is copied
  5. # to the log4j standard location /WEB-INF/classes/log4j.properties . This means that editing the file
  6. # at /properties/Logger.properties in a deployed uPortal will have no effect.
  7. #
  8. # Please read the instructions for the Log4J logging system at
  9. # http://jakarta.apache.org/log4j/ if you want to modify this.
  10. ###########################################################################
  11. # You should probably replace the word "debug" with "info" in the
  12. # following line after everything is running. This will turn off
  13. # the tons of debug messages, and leave only INFO, WARN, ERROR, etc.
  14. #
  15. log4j.rootLogger = info,stdout,D,E
  16. #配置stdout
  17. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  18. log4j.appender.stdout.Target=System.out
  19. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  20. log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n
  21. #配置D 保存info debug级别的系统日志信息
  22. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
  23. #/Users/mark/mms/log.log 指定info debug级别日志信息存储位置
  24. log4j.appender.D.File = /Users/mark/mms/log.log
  25. log4j.appender.D.Append = true
  26. log4j.appender.D.Threshold = INFO,DEBUG
  27. log4j.appender.D.layout = org.apache.log4j.PatternLayout
  28. log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n
  29. #配置E 保存系统异常日志
  30. log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
  31. #/Users/mark/mms/error.log 指定info debug级别日志信息存储位置
  32. log4j.appender.E.File = /Users/mark/mms/error.log
  33. log4j.appender.E.Append = true
  34. log4j.appender.E.Threshold = ERROR
  35. log4j.appender.E.layout = org.apache.log4j.PatternLayout
  36. log4j.appender.E.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n
  37. #log4j.logger.org.hibernate=INFO
  38. #
  39. ## Log all JDBC parameters
  40. #log4j.logger.org.hibernate.type=ALL
  41. ##Hibernate begin 打印每次数据访问产生的sql语句至log.log 文件当中##
  42. log4j.logger.org.hibernate=info
  43. #配置SQL打印与输出
  44. log4j.logger.org.hibernate.SQL=DEBG
  45. log4j.logger.org.hibernate.HQL=DEGUG
  46. #log4j.logger.org.hibernate.type=ALL

2.8 web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <!--配置需要加载的spring配置文件,这些文件中的配置的类都是被<context:component-scan>扫描到的,比如@Repository @Component
  7. @Service @Controller等-->
  8. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>classpath:data-access-applicationContext.xml;classpath:spring-security.xml;classpath:service-applicationContext.xml</param-value>
  11. </context-param>
  12. <!--配置日志监听 ,如果配置文件报红,没有关系可以正常运行,这个与idea的验证规则有关-->
  13. <context-param>
  14. <param-name>log4jConfigLocation</param-name>
  15. <param-value>classpath:log4j.properties</param-value>
  16. </context-param>
  17. <listener>
  18. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  19. </listener>
  20. <listener>
  21. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  22. </listener>
  23. <!--配置权限过滤器,注意必须配置在springmvc 之前,因为对用户访问资源的权限判断与控制是在访问特定url之前发生的-->
  24. <filter>
  25. <filter-name>springSecurityFilterChain</filter-name>
  26. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  27. </filter>
  28. <filter-mapping>
  29. <filter-name>springSecurityFilterChain</filter-name>
  30. <url-pattern>/*</url-pattern>
  31. </filter-mapping>
  32. <!-- 配置字符编码过滤器 必须配置在所有过滤器的最前面 -->
  33. <filter>
  34. <filter-name>CharacterEncodingFilter</filter-name>
  35. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  36. <init-param>
  37. <param-name>encoding</param-name>
  38. <param-value>UTF-8</param-value>
  39. </init-param>
  40. <init-param>
  41. <param-name>forceEncoding</param-name>
  42. <param-value>true</param-value>
  43. </init-param>
  44. </filter>
  45. <filter-mapping>
  46. <filter-name>CharacterEncodingFilter</filter-name>
  47. <url-pattern>/*</url-pattern>
  48. </filter-mapping>
  49. <!--超级管理员 -->
  50. <!-- <filter>
  51. <filter-name>superAdminFilter</filter-name>
  52. <filter-class>com.fxmms.filter.SuperAdminFilter</filter-class>
  53. </filter>
  54. <filter-mapping>
  55. <filter-name>superAdminFilter</filter-name>
  56. <url-pattern>/fxmms/superadmin/*</url-pattern>
  57. </filter-mapping>
  58. <filter>
  59. <filter-name>adminFilter</filter-name>
  60. <filter-class>com.fxmms.filter.AdminFilter</filter-class>
  61. </filter>
  62. <filter-mapping>
  63. <filter-name>adminFilter</filter-name>
  64. <url-pattern>/fxmms/admin/*</url-pattern>
  65. </filter-mapping>
  66. <filter>
  67. <filter-name>customerFilter</filter-name>
  68. <filter-class>com.fxmms.filter.CustomerFilter</filter-class>
  69. </filter>
  70. <filter-mapping>
  71. <filter-name>customerFilter</filter-name>
  72. <url-pattern>/fxmms/customer/*</url-pattern>
  73. </filter-mapping>
  74. <servlet>
  75. <servlet-name>LoginServlet</servlet-name>
  76. <servlet-class>com.fxmms.servlet.LoginServlet</servlet-class>
  77. </servlet>
  78. <servlet>
  79. <servlet-name>InvalidateServlet</servlet-name>
  80. <servlet-class>com.fxmms.servlet.InvalidateServlet</servlet-class>
  81. </servlet>-
  82. <servlet-mapping>
  83. <servlet-name>LoginServlet</servlet-name>
  84. <url-pattern>/loginServlet</url-pattern>
  85. </servlet-mapping>
  86. <servlet-mapping>
  87. <servlet-name>InvalidateServlet</servlet-name>
  88. <url-pattern>/invalidateServlet</url-pattern>
  89. </servlet-mapping>-->
  90. <!-- 配置看可以把POST请求转为PUT,DELETE请求的Filter -->
  91. <filter>
  92. <filter-name>HiddenHttpMethodFilter</filter-name>
  93. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  94. </filter>
  95. <filter-mapping>
  96. <filter-name>HiddenHttpMethodFilter</filter-name>
  97. <url-pattern>/*</url-pattern>
  98. </filter-mapping>
  99. <!--配置中央控制器,对所有请求进行拦截并做请求路径,与处理请求桩模块之间的映射-->
  100. <servlet>
  101. <servlet-name>defaultDispatcherServlet</servlet-name>
  102. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  103. <init-param>
  104. <param-name>contextConfigLocation
  105. </param-name>
  106. <param-value>classpath:default-servlet.xml</param-value>
  107. </init-param>
  108. <load-on-startup>1</load-on-startup>
  109. </servlet>
  110. <!--这里是拦截所有-->
  111. <servlet-mapping>
  112. <servlet-name>defaultDispatcherServlet</servlet-name>
  113. <url-pattern>/</url-pattern>
  114. </servlet-mapping>
  115. </web-app>

2.9 build.gradle
项目构建脚本

  1. group 'com.fxmms'
  2. version '1.0-SNAPSHOT'
  3. apply plugin: 'java'
  4. apply plugin: 'idea'
  5. apply plugin: 'war'
  6. sourceCompatibility = 1.8
  7. repositories {
  8. maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
  9. mavenLocal()
  10. jcenter()
  11. maven { url "http://repo.maven.apache.org/maven2/"}
  12. maven { url 'https://repo.spring.io/libs-milestone'}
  13. mavenCentral()
  14. }
  15. dependencies {
  16. testCompile group: 'junit', name: 'junit', version: '4.12'
  17. // servlet-api
  18. compile group: 'javax.servlet', name: 'servlet-api', version: '2.5'
  19. //spring相关
  20. compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.3.RELEASE'
  21. compile group: 'org.springframework', name: 'spring-orm', version: '4.3.3.RELEASE'
  22. compile group: 'org.springframework', name: 'spring-aspects', version: '4.3.3.RELEASE'
  23. compile group: 'org.springframework.security', name: 'spring-security-config', version: '3.2.0.RELEASE'
  24. compile group: 'org.springframework.security', name: 'spring-security-taglibs', version: '3.2.0.RELEASE'
  25. compile 'org.springframework.security:spring-security-web:3.2.0.RELEASE'
  26. //hibernate相关
  27. compile 'org.hibernate:hibernate-core:4.3.6.Final'
  28. //c3p0连接池
  29. compile group: 'org.hibernate', name: 'hibernate-c3p0', version: '4.3.6.Final'
  30. //ehcahe二级缓存
  31. compile group: 'org.hibernate', name: 'hibernate-ehcache', version: '4.3.6.Final'
  32. //mysql
  33. compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.39'
  34. //springData
  35. compile group: 'org.springframework.data', name: 'spring-data-jpa', version: '1.10.3.RELEASE'
  36. // https://mvnrepository.com/artifact/log4j/log4j日志
  37. compile group: 'log4j', name: 'log4j', version: '1.2.17'
  38. //json解析相关
  39. compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.5.4'
  40. compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.5.4'
  41. //迅雷接口有关jar 包
  42. compile 'org.apache.httpcomponents:httpclient:4.4'
  43. compile 'org.json:json:20141113'
  44. compile group: 'org.apache.clerezza.ext', name: 'org.json.simple', version: '0.4'
  45. //https://mvnrepository.com/artifact/org.apache.commons/commons-io 读取文件相关
  46. compile group: 'org.apache.commons', name: 'commons-io', version: '1.3.2'
  47. // https://mvnrepository.com/artifact/org.apache.poi/poi 文件读取相关 apache-poi
  48. compile group: 'org.apache.poi', name: 'poi', version: '3.9'
  49. // https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml 解决execl 版本差异
  50. compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.9'
  51. // https://mvnrepository.com/artifact/commons-io/commons-io 文件上传
  52. compile group: 'commons-io', name: 'commons-io', version: '1.3.1'
  53. // https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
  54. compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.2.2'
  55. }

3. 各层包功能讲解&项目搭建完毕最终效果演示图


3.1 项目中各层包功能讲解
项目中Java源代码层级结构如下图所示:

 
项目中Java源代码层级结构

对于www包中的各分层,我们对照上图重点说明:

controller:用于路由各种HTTP访问,其中可以实现对前台页面参数的对象化绑定,这个功能的实现是依赖于spring mvc中的参数绑定功能,以及返回向前端页面返回数据。也可以实现基于Restful 风格API的编写。
dao:用于实现对数据库的操作,包中的代码继承并实现自common中的dao 层代码,采用的是类的适配器模式实现的,这里的代码值得细细品味,可以说是整个项目的灵魂所在之处,稍后说明。
domain:项目中的所有实体类都存在于这个包中,其中的每个具体实体类与数据库表相对应。
dto:实现了序列化的数据传输层对象,可用于接收前台参数,前台参数被封装成dto 对象传输至后台。同时也负责对从数据库中查询数据的封装。
qo:模糊查询对象所在的包,用于封装QBC动态查询参数。
rowmapper:用于映射jdbcTemplate查询数据库返回对象的数据集,并将数据集依照以此对象为集合的实例进行封装。
schedulejob:定时任务类所在的包,在此包中的类上都要加上@Service注解,因为定时任务注解配置在service-applicationContext.xml中,包扫描组件的规则是只扫描类上有@Service注解的组件类。
service:业务逻辑层,所有的业务逻辑组件Bean都放置在这个保重,其中的类中的业务逻辑方法调用了dao实现类中的方法,并且每个有关于数据库操作的方法上都加上了@Transaction注解,用于实现对数据库操作的事务管理。@Transaction是Spring Framework对AOP 的另一种区别于拦截器的自定义注解实现。

4.项目中重要代码讲解


主要讲解一下Dao层中代码对适配器设计模式的应用:
4.1 首先看下commom层中 BaseDao.java

  1. package com.fxmms.common.dao;
  2. import com.fxmms.common.ro.Dto;
  3. import com.fxmms.common.ro.DtoResultWithPageInfo;
  4. import com.fxmms.common.ro.PageQo;
  5. import org.hibernate.Criteria;
  6. import org.springframework.stereotype.Repository;
  7. import java.io.Serializable;
  8. import java.util.List;
  9. import java.util.Map;
  10. /**
  11. *
  12. * @param <T>
  13. * @usage 数据库公共操作接口
  14. */
  15. @Repository
  16. public interface BaseDao<T> {
  17. /**
  18. *
  19. *
  20. * @param id
  21. * @usage 根据id获取数据库中唯一纪录,封装成java对象并返回
  22. * @return T
  23. */
  24. public T getById(Serializable id);
  25. /**
  26. *
  27. *
  28. * @param id
  29. * @usage 根据id懒加载数据库中唯一纪录,封装成java对象并返回
  30. * @return T
  31. */
  32. public T load(Serializable id);
  33. /**
  34. *
  35. *
  36. * @param columnName
  37. *
  38. * @param value
  39. *
  40. * @usage 根据列名,以及对应的值获取数据库中惟一纪录,封装成Java对象并返回
  41. *
  42. * @return
  43. */
  44. public T getByUniqueKey(String columnName, Object value);
  45. /**
  46. *
  47. *
  48. * @param nameValuePairs
  49. *
  50. * @return T
  51. */
  52. public T getUniqueResult(Map<String, Object> nameValuePairs);
  53. /**
  54. *
  55. *
  56. * @param columnName
  57. *
  58. * @param value
  59. *
  60. * @param sort
  61. *
  62. * @param order
  63. * asc/desc
  64. * @return List<T>
  65. */
  66. public List<T> getListByColumn(String columnName, Object value,
  67. String sort, String order);
  68. public List<T> getListByColumn(String columnName, Object value);
  69. /**
  70. * ͨ
  71. *
  72. * @param nameValuePairs
  73. *
  74. * @param sort
  75. *
  76. * @param order
  77. * asc/desc
  78. * @return List<T>
  79. */
  80. public List<T> getListByColumns(Map<String, Object> nameValuePairs,
  81. String sort, String order);
  82. public List<T> getListByColumns(Map<String, Object> nameValuePairs);
  83. /**
  84. *
  85. *
  86. * @return List<T>
  87. */
  88. public List<T> getAll();
  89. /**
  90. *
  91. *
  92. * @param t
  93. * @return Serializable id
  94. */
  95. public Serializable save(T t);
  96. /**
  97. *
  98. *
  99. * @param t
  100. */
  101. public void update(T t);
  102. /**
  103. *
  104. *
  105. * @param t
  106. */
  107. public void delete(T t);
  108. /**
  109. * QBC
  110. * @return
  111. */
  112. public Criteria createCriteria();
  113. /**
  114. * @param <E>
  115. * @param <D>
  116. * @param criteria
  117. * @param pageNo
  118. * @param pageSize
  119. * @param dtoClazz
  120. * @return
  121. */
  122. public <E, D extends Dto> DtoResultWithPageInfo<D> queryPageListByCriteria(
  123. Criteria criteria, int pageNo, int pageSize, Class<D> dtoClazz);
  124. /**
  125. * @param <E>
  126. * @param <D>
  127. * @param criteria
  128. * @param qo
  129. * @param class1
  130. * @return
  131. */
  132. public <E, D extends Dto> DtoResultWithPageInfo<D> queryPageListByCriteriaWithQo(PageQo qo, Class<D> dtoClazz);
  133. }

其中定义了一些对数据库的抽象公共操作方法,代码中有注释,可以对照理解。

4.2 看下HibernateTemplateDao.java对BaseDao.java的抽象实现

  1. package com.fxmms.common.dao.hib;
  2. import com.fxmms.common.dao.BaseDao;
  3. import com.fxmms.common.ro.Dto;
  4. import com.fxmms.common.ro.DtoResultWithPageInfo;
  5. import com.fxmms.common.ro.PageInfo;
  6. import com.fxmms.common.ro.PageQo;
  7. import org.apache.commons.logging.Log;
  8. import org.apache.commons.logging.LogFactory;
  9. import org.hibernate.Criteria;
  10. import org.hibernate.Session;
  11. import org.hibernate.SessionFactory;
  12. import org.hibernate.criterion.Order;
  13. import org.hibernate.criterion.Projections;
  14. import org.hibernate.criterion.Restrictions;
  15. import org.springframework.beans.BeanUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.beans.factory.annotation.Qualifier;
  18. import org.springframework.stereotype.Repository;
  19. import org.springframework.util.StringUtils;
  20. import java.io.Serializable;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. import java.util.Map;
  24. /**
  25. *
  26. * @param <T>
  27. * @usage 应用数据访问的灵魂,抽象出各种模型类进行数据库访问的公共操作。
  28. * 主要使用到QBC动态查询。主要思想是利用反射。
  29. */
  30. @Repository
  31. public abstract class HibernateTemplateDao<T> implements BaseDao<T> {
  32. protected static final Log log = LogFactory
  33. .getLog(HibernateTemplateDao.class);
  34. //通过反射,可以实现对不同类对应的数据表的操作
  35. protected abstract Class<?> getEntityClass();
  36. protected SessionFactory sessionFactory;
  37. @Autowired
  38. @Qualifier("sessionFactory")
  39. public void setSessionFactory(SessionFactory sessionFactory) {
  40. this.sessionFactory = sessionFactory;
  41. }
  42. public Session getSession() {
  43. return sessionFactory.getCurrentSession();
  44. }
  45. public Session openNewSession() {
  46. return sessionFactory.openSession();
  47. }
  48. @Override
  49. @SuppressWarnings("unchecked")
  50. public T getById(Serializable id) {
  51. return (T) getSession().get(getEntityClass(), id);
  52. }
  53. @Override
  54. @SuppressWarnings("unchecked")
  55. public T getByUniqueKey(String columnName, Object value) {
  56. return (T) getSession().createCriteria(getEntityClass())
  57. .add(Restrictions.eq(columnName, value)).uniqueResult();
  58. }
  59. @Override
  60. @SuppressWarnings("unchecked")
  61. public List<T> getListByColumn(String columnName, Object value,String sort,String order) {
  62. Criteria criteria = getSession().createCriteria(getEntityClass());
  63. criteria.add(Restrictions.eq(columnName, value));
  64. if(StringUtils.hasText(sort) && StringUtils.hasText(order)){
  65. if("asc".equals(order)){
  66. criteria.addOrder(Order.asc(sort));
  67. }else if("desc".equals(order)){
  68. criteria.addOrder(Order.desc(sort));
  69. }
  70. }
  71. List<T> list = criteria.list();
  72. return list;
  73. }
  74. @Override
  75. @SuppressWarnings("unchecked")
  76. public List<T> getListByColumn(String columnName, Object value) {
  77. Criteria criteria = getSession().createCriteria(getEntityClass());
  78. criteria.add(Restrictions.eq(columnName, value));
  79. List<T> list = criteria.list();
  80. return list;
  81. }
  82. @Override
  83. @SuppressWarnings("unchecked")
  84. public List<T> getListByColumns(Map<String, Object> nameValuePairs,String sort,String order){
  85. Criteria criteria = getSession().createCriteria(getEntityClass());
  86. for (Map.Entry<String, Object> entry : nameValuePairs.entrySet()) {
  87. criteria.add(Restrictions.eq(entry.getKey(), entry.getValue()));
  88. }
  89. if(StringUtils.hasText(sort) && StringUtils.hasText(order)){
  90. if("asc".equals(order)){
  91. criteria.addOrder(Order.asc(sort));
  92. }else if("desc".equals(order)){
  93. criteria.addOrder(Order.desc(sort));
  94. }
  95. }
  96. List<T> list = criteria.list();
  97. return list;
  98. }
  99. @Override
  100. @SuppressWarnings("unchecked")
  101. public List<T> getListByColumns(Map<String, Object> nameValuePairs){
  102. Criteria criteria = getSession().createCriteria(getEntityClass());
  103. for (Map.Entry<String, Object> entry : nameValuePairs.entrySet()) {
  104. criteria.add(Restrictions.eq(entry.getKey(), entry.getValue()));
  105. }
  106. List<T> list = criteria.list();
  107. return list;
  108. }
  109. @Override
  110. @SuppressWarnings("unchecked")
  111. public List<T> getAll() {
  112. return getSession().createCriteria(getEntityClass()).list();
  113. }
  114. @Override
  115. @SuppressWarnings("unchecked")
  116. public T getUniqueResult(Map<String, Object> nameValuePairs) {
  117. Criteria criteria = getSession().createCriteria(getEntityClass());
  118. for (Map.Entry<String, Object> entry : nameValuePairs.entrySet()) {
  119. criteria.add(Restrictions.eq(entry.getKey(), entry.getValue()));
  120. }
  121. return (T) criteria.uniqueResult();
  122. }
  123. @Override
  124. @SuppressWarnings("unchecked")
  125. public T load(Serializable id){
  126. return (T) getSession().load(getEntityClass(), id);
  127. }
  128. @Override
  129. public Serializable save(T t) {
  130. return getSession().save(t);
  131. }
  132. @Override
  133. public void update(T t) {
  134. Session session = this.getSession();
  135. session.update(t);
  136. //强制刷新缓存中数据至数据库中,防止大批量数据更新之后出现脏数据
  137. session.flush();
  138. }
  139. @Override
  140. public void delete(T t) {
  141. this.getSession().delete(t);
  142. }
  143. /**
  144. * QO DtoResultWithPageInfo<dtoClazz>list+ҳϢ
  145. *
  146. * @param page
  147. * @param pageSize
  148. * @param qo
  149. * @param dtoClazz
  150. * @return
  151. */
  152. /* public <Q extends QueryObject, D extends Dto> DtoResultWithPageInfo<D> queryPageListByQueryObject(
  153. int page, int pageSize,Q qo, Class<D> dtoClazz){
  154. Criteria criteria = QueryObjectHelper.buildCriteria(qo, getSession());
  155. return queryPageListByCriteria(criteria, page, pageSize, dtoClazz);
  156. }*/
  157. /**
  158. * QO List<dtoClazz>
  159. * @param qo
  160. * @param dtoClazz
  161. * @return
  162. */
  163. /*public <Q extends QueryObject,E, D extends Dto> List<D> queryListByQueryObject(
  164. Q qo, Class<D> dtoClazz){
  165. Criteria criteria = QueryObjectHelper.buildCriteria(qo, getSession());
  166. @SuppressWarnings("unchecked")
  167. List<E> list = criteria.list();
  168. List<D> resultsDtoList = new ArrayList<D>();
  169. for(E entity:list){
  170. try {
  171. D dto = dtoClazz.newInstance();
  172. BeanUtils.copyProperties(entity, dto);
  173. resultsDtoList.add(dto);
  174. } catch (InstantiationException e) {
  175. log.error("dtoʵ쳣ExMsg==>"+e.getMessage());
  176. } catch (IllegalAccessException e) {
  177. log.error("dtoʵ쳣ExMsg==>"+e.getMessage());
  178. }
  179. }
  180. return resultsDtoList;
  181. }*/
  182. /**
  183. * queryPageListByCriteria
  184. *
  185. * ͨcriteria DtoResultWithPageInfo<dtoClazz>list+ҳϢ
  186. *
  187. * @param criteria
  188. * ѯ
  189. * @param pageNo
  190. * ǰҳ
  191. * @param pageSize
  192. * ÿҳʾ
  193. * @param dtoClass
  194. * ݴݶclass
  195. *
  196. */
  197. /*public <E, D extends Dto> DtoResultWithPageInfo<D> queryPageListByCriteria(
  198. Criteria criteria, int pageNo, int pageSize, Class<D> dtoClazz) {
  199. PageInfo pageInfo = getInstancePageInfoWithCriteria(criteria, pageNo,
  200. pageSize);
  201. criteria.setProjection(null);// ͶӰ
  202. criteria.setFirstResult(pageInfo.getFirstResultNum());
  203. criteria.setMaxResults(pageInfo.getPageSize());
  204. @SuppressWarnings("unchecked")
  205. List<E> resultsList = criteria.list();
  206. List<D> resultsDtoList = new ArrayList<D>();
  207. for (E result : resultsList) {
  208. D dto;
  209. try {
  210. dto = dtoClazz.newInstance();
  211. try {
  212. BeanUtils.copyProperties(result, dto);
  213. } catch (Exception e) {
  214. log.error("ҳѯ쳣bean쳣");
  215. e.printStackTrace();
  216. }
  217. } catch (InstantiationException e) {
  218. log.error("ҳѯ쳣dtoʼ쳣");
  219. e.printStackTrace();
  220. dto = null;
  221. } catch (IllegalAccessException e) {
  222. log.error("ҳѯ쳣dtoʼ쳣");
  223. e.printStackTrace();
  224. dto = null;
  225. }
  226. resultsDtoList.add(dto);
  227. }
  228. DtoResultWithPageInfo<D> resultWithPageInfo = new DtoResultWithPageInfo<D>(
  229. resultsDtoList, pageInfo);
  230. return resultWithPageInfo;
  231. }*/
  232. /**
  233. * ͨcriteria List<dtoClazz>
  234. *
  235. * @param criteria
  236. * @param dtoClazz
  237. * @return
  238. */
  239. /*public <E, D extends Dto> List<D> queryListByCriteria(
  240. Criteria criteria,Class<D> dtoClazz) {
  241. @SuppressWarnings("unchecked")
  242. List<E> resultsList = criteria.list();
  243. List<D> resultsDtoList = new ArrayList<D>();
  244. for (E result : resultsList) {
  245. D dto;
  246. try {
  247. dto = dtoClazz.newInstance();
  248. try {
  249. BeanUtils.copyProperties(result, dto);
  250. } catch (Exception e) {
  251. log.error("ҳѯ쳣bean쳣");
  252. e.printStackTrace();
  253. }
  254. } catch (InstantiationException e) {
  255. log.error("ҳѯ쳣dtoʼ쳣");
  256. e.printStackTrace();
  257. dto = null;
  258. } catch (IllegalAccessException e) {
  259. log.error("ҳѯ쳣dtoʼ쳣");
  260. e.printStackTrace();
  261. dto = null;
  262. }
  263. resultsDtoList.add(dto);
  264. }
  265. return resultsDtoList;
  266. }*/
  267. /*public DataTablePageList queryDataTablePageListByCriteria(
  268. Criteria criteria, String displayStart, String displayLength) {
  269. // ܼ¼
  270. long totalRecords = 0L;
  271. criteria.setProjection(Projections.rowCount());
  272. totalRecords = (Long) criteria.uniqueResult();
  273. //
  274. criteria.setProjection(null);
  275. criteria.setFirstResult(Integer.parseInt(displayStart));
  276. criteria.setMaxResults(Integer.parseInt(displayLength));
  277. @SuppressWarnings("rawtypes")
  278. List resultsList = criteria.list();
  279. DataTablePageList dtpl = new DataTablePageList(
  280. String.valueOf((int) totalRecords), resultsList);
  281. return dtpl;
  282. }
  283. */
  284. /**
  285. * ͨѯʼҳϢ
  286. *
  287. * @param criteria
  288. * @param pageNo
  289. * @param pageSize
  290. * @return
  291. *//*
  292. private PageInfo getInstancePageInfoWithCriteria(Criteria criteria,
  293. int pageNo, int pageSize) {
  294. long totalQuantity = 0L;
  295. criteria.setProjection(Projections.rowCount());
  296. totalQuantity = (Long) criteria.uniqueResult();
  297. PageInfo pageInfo = PageInfo.getInstance(pageNo, pageSize,
  298. totalQuantity);
  299. return pageInfo;
  300. }*/
  301. @Override
  302. public Criteria createCriteria() {
  303. // TODO Auto-generated method stub
  304. return getSession().createCriteria(getEntityClass());
  305. }
  306. /**
  307. * queryPageListByCriteria
  308. *
  309. * ͨcriteria DtoResultWithPageInfo<dtoClazz>list+ҳϢ
  310. *
  311. * @param criteria
  312. * ѯ
  313. * @param pageNo
  314. * ǰҳ
  315. * @param pageSize
  316. * ÿҳʾ
  317. * @param dtoClass
  318. * ݴݶclass
  319. * ص DtoResultWithPageInfo
  320. *
  321. * Ϊ queryPageListByCriteria
  322. */
  323. @Override
  324. public <E, D extends Dto> DtoResultWithPageInfo<D> queryPageListByCriteria(
  325. Criteria criteria, int pageNo, int pageSize, Class<D> dtoClazz) {
  326. //˷ĵãpageinfoѾfirstResult maxresult
  327. PageInfo pageInfo = getInstancePageInfoWithCriteria(criteria, pageNo,
  328. pageSize);
  329. criteria.setProjection(null);// ͶӰ
  330. criteria.setFirstResult(pageInfo.getFirstResultNum());
  331. criteria.setMaxResults(pageInfo.getPageSize());
  332. @SuppressWarnings("unchecked")
  333. List<E> resultsList = criteria.list();
  334. List<D> resultsDtoList = new ArrayList<D>();
  335. for (E result : resultsList) {
  336. D dto;
  337. try {
  338. dto = dtoClazz.newInstance();
  339. try {
  340. BeanUtils.copyProperties(result, dto);
  341. } catch (Exception e) {
  342. log.error("ҳѯ쳣bean쳣");
  343. e.printStackTrace();
  344. }
  345. } catch (InstantiationException e) {
  346. log.error("ҳѯ쳣dtoʼ쳣");
  347. e.printStackTrace();
  348. dto = null;
  349. } catch (IllegalAccessException e) {
  350. log.error("ҳѯ쳣dtoʼ쳣");
  351. e.printStackTrace();
  352. dto = null;
  353. }
  354. resultsDtoList.add(dto);
  355. }
  356. DtoResultWithPageInfo<D> resultWithPageInfo = new DtoResultWithPageInfo<D>(
  357. resultsDtoList, pageInfo);
  358. return resultWithPageInfo;
  359. }
  360. /**
  361. * queryPageListByCriteriaWithQo
  362. *
  363. * ͨcriteria DtoResultWithPageInfo<dtoClazz>list+ҳϢ
  364. *
  365. * @param criteria
  366. * ѯ
  367. * @param pageNo
  368. * ǰҳ
  369. * @param pageSize
  370. * ÿҳʾ
  371. * @param dtoClass
  372. * ݴݶclass
  373. * ص DtoResultWithPageInfo
  374. *
  375. * Ϊ queryPageListByCriteria
  376. */
  377. @Override
  378. public <E, D extends Dto> DtoResultWithPageInfo<D> queryPageListByCriteriaWithQo(PageQo qo, Class<D> dtoClazz) {
  379. //˷ĵãpageinfoѾfirstResult maxresult
  380. Criteria criteria = this.createCriteria();
  381. qo.add(criteria);
  382. PageInfo pageInfo = getInstancePageInfoWithCriteria(criteria, qo.getPage(),qo.getRows());
  383. criteria.setProjection(null);// ͶӰ
  384. criteria.setFirstResult(pageInfo.getFirstResultNum());
  385. criteria.setMaxResults(pageInfo.getPageSize());
  386. @SuppressWarnings("unchecked")
  387. List<E> resultsList = criteria.list();
  388. List<D> resultsDtoList = new ArrayList<D>();
  389. for (E result : resultsList) {
  390. D dto;
  391. try {
  392. dto = dtoClazz.newInstance();
  393. try {
  394. BeanUtils.copyProperties(result, dto);
  395. } catch (Exception e) {
  396. log.error("ҳѯ쳣bean쳣");
  397. e.printStackTrace();
  398. }
  399. } catch (InstantiationException e) {
  400. log.error("ҳѯ쳣dtoʼ쳣");
  401. e.printStackTrace();
  402. dto = null;
  403. } catch (IllegalAccessException e) {
  404. log.error("ҳѯ쳣dtoʼ쳣");
  405. e.printStackTrace();
  406. dto = null;
  407. }
  408. resultsDtoList.add(dto);
  409. }
  410. DtoResultWithPageInfo<D> resultWithPageInfo = new DtoResultWithPageInfo<D>(
  411. resultsDtoList, pageInfo);
  412. return resultWithPageInfo;
  413. }
  414. /**
  415. * ͨѯʼҳϢ
  416. *
  417. * @param criteria
  418. * @param pageNo
  419. * @param pageSize
  420. * @return
  421. */
  422. private PageInfo getInstancePageInfoWithCriteria(Criteria criteria,
  423. int pageNo, int pageSize) {
  424. long totalQuantity = 0L;
  425. // ܵtotalQuality
  426. criteria.setProjection(Projections.rowCount());
  427. totalQuantity = (Long) criteria.uniqueResult();
  428. PageInfo pageInfo = PageInfo.getInstance(pageNo, pageSize,
  429. totalQuantity);
  430. return pageInfo;
  431. }
  432. }

这个方法是极为重要的 protected abstract Class<?> getEntityClass();
后续介绍,现在暂时有个印象。
在www中的dao层有与各具体类(数据表)相对应的数据库操作实现:

 
屏幕快照 2016-11-20 下午11.22.30.png

上图声明了三个具体类对应的接口声明:AdminDao、MacDao、TaskDao。
对应三个接口有三个具体的实现类:AdminDaoImpl、MacDaoImpl、TaskDaoImpl。
我们以与Admin类相关的dao层操作为例:
Admin.java

  1. package com.fxmms.www.domain;
  2. import org.hibernate.annotations.GenericGenerator;
  3. import javax.persistence.*;
  4. /**
  5. * Created by mark on 16/11/2.
  6. * @usage 管理员实体类,与数据库中表相对应
  7. */
  8. @Entity
  9. @Table(name = "mms_admin")
  10. public class Admin {
  11. @Id
  12. @GeneratedValue(generator = "increment")
  13. @GenericGenerator(name = "increment", strategy = "increment")
  14. @Column
  15. private int id;
  16. @Column
  17. private String userName;
  18. @Column
  19. private String password;
  20. @Column
  21. private String role;
  22. @Column
  23. private int enable;
  24. @Column
  25. private int isDelete;
  26. public int getId() {
  27. return id;
  28. }
  29. public void setId(int id) {
  30. this.id = id;
  31. }
  32. public String getUserName() {
  33. return userName;
  34. }
  35. public void setUserName(String userName) {
  36. this.userName = userName;
  37. }
  38. public String getPassword() {
  39. return password;
  40. }
  41. public void setPassword(String password) {
  42. this.password = password;
  43. }
  44. public String getRole() {
  45. return role;
  46. }
  47. public void setRole(String role) {
  48. this.role = role;
  49. }
  50. public int getEnable() {
  51. return enable;
  52. }
  53. public void setEnable(int enable) {
  54. this.enable = enable;
  55. }
  56. public int getIsDelete() {
  57. return isDelete;
  58. }
  59. public void setIsDelete(int isDelete) {
  60. this.isDelete = isDelete;
  61. }
  62. }

AdminDao.java

  1. package com.fxmms.www.dao;
  2. import com.fxmms.common.dao.BaseDao;
  3. import com.fxmms.www.domain.Admin;
  4. /**
  5. * Created by mark on 16/10/31.
  6. * @usage 操作管理员数据库访问接口
  7. */
  8. public interface AdminDao extends BaseDao<Admin> {
  9. }

AdminDaoImpl.java

  1. package com.fxmms.www.dao.hib;
  2. import com.fxmms.common.dao.hib.HibernateTemplateDao;
  3. import com.fxmms.www.dao.AdminDao;
  4. import com.fxmms.www.domain.Admin;
  5. /**
  6. * Created by mark on 16/11/2.
  7. * @usage 使用适配器模式,将common层中定义的公共访问数据库方法实现嫁接到Admin类的接口中。
  8. */
  9. public class AdminDaoImpl extends HibernateTemplateDao<Admin> implements AdminDao {
  10. @Override
  11. protected Class<?> getEntityClass() {
  12. // TODO Auto-generated method stub
  13. return Admin.class;
  14. }
  15. }

可以看到,在具体类相关的数据库操作实现类中,我们只需要实现HibernateTemplateDao<T>中抽象方法protected Class<?> getEntityClass();即可。
给我们的感觉就是这个方法的实现是画龙点睛之笔。
回过头去看,在HibernateTemplateDao类中所有与数据库操作有关的方法:
例如:

  1. @Override
  2. @SuppressWarnings("unchecked")
  3. public T getByUniqueKey(String columnName, Object value) {
  4. return (T) getSession().createCriteria(getEntityClass())
  5. .add(Restrictions.eq(columnName, value)).uniqueResult();
  6. }

getEntityClass()方法最终都会被具体的类所实现。这个设计真的是很巧妙。

5.webapp文件夹下分层详解


webapp下有res文件夹,用于存储静态文件,WEB-INF文件夹下有view文件夹用于放置应用中jsp页面。
文件组织结构如下图所示:

 
webapp下静态资源以及前端页面

6.配置tomcat 运行环境


项目搭建已经完毕,接下来需要做的就是配置项目的运行环境了,这里我们采用tomcat来充当应用服务器。
6.1 去官网下载tomcat 8.0http://tomcat.apache.org/download-80.cgi
6.2 配置 tomcat 服务器:
点击Edit Configurations

 
屏幕快照 2016-11-20 下午11.48.58.png

点击+,并选择Tomcat Server中local选项

 
屏幕快照 2016-11-20 下午11.51.03.png

添加启动任务名称,默认为unnamed

 
屏幕快照 2016-11-21 上午9.33.39.png

配置Application Server

 
屏幕快照 2016-11-21 上午9.39.06.png

装载开发版(exploded)应用war包,此步骤有两种方式:
第一种方式:选择Deploy at the server startup下方的+,入下图所示:

 
屏幕快照 2016-11-21 上午9.54.16.png

接下来在Select Artifacts Deploy 弹出框中 选择 exploded 属性的war包

 
屏幕快照 2016-11-21 上午9.54.31.png

接下来选择apply-> ok ,最终的结果是:

 
屏幕快照 2016-11-21 上午10.05.46.png
 
屏幕快照 2016-11-21 上午10.12.55.png

最终点击启动按钮启动应用

 
屏幕快照 2016-11-21 上午10.15.46.png

最终的启动效果如下所示

 
  1.  

Java 本地开发环境搭建(框架采用 Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6)的更多相关文章

  1. (转载)JAVA敏捷开发环境搭建

    整个软件项目分为四个环境 开发本地环境.开发环境.测试环境.IDC环境.和传统C++开发不一样的模式是多了第一个开发本地环境.这是为什么呢,因为目前大部分开发人员还是比较熟悉windows下开发.对于 ...

  2. Java基本开发环境搭建(适合第一次使用)

    Java基本开发环境搭建(适合第一次使用) 编写人:cc 阿爸 2013-10-17 一.开发工具获取 1.开发工具包JDK l  下载地址: 到ORACLE公司官方网站(http://www.ora ...

  3. spark-windows(含eclipse配置)下本地开发环境搭建

    spark-windows(含eclipse配置)下本地开发环境搭建   >>>>>>注意:这里忽略JDK的安装,JDK要求是1.8及以上版本,请通过 java  ...

  4. JAVA WEB开发环境搭建

    JAVA WED开发环境搭建 JDK的安装和配置 到https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21 ...

  5. Java 学习笔记 第一章:Java语言开发环境搭建

    第一章:Java语言开发环境搭建 第二章:常量.变量和数据类型 第三章:数据类型转换.运算符和方法入门 1.Java虚拟机——JVM JVM(Java Virtual Machine ):Java虚拟 ...

  6. 手把手教你 Apache DolphinScheduler 本地开发环境搭建 | 中英文视频教程

    点击上方 蓝字关注我们 最近,一些小伙伴反馈对小海豚的本地开发环境搭建过程不太了解,这不就有活跃的贡献者送来新鲜的视频教程!在此感谢@Tianqi-Dotes 的细致讲解 贡献者还贴心地录制了中英文两 ...

  7. (转)微信公众平台开发之基于百度 BAE3.0 的开发环境搭建(采用 Baidu Eclipse)

    原文传送门(http://blog.csdn.net/bingtianxuelong/article/details/17843111) 版本说明:     V1:         2014-2-13 ...

  8. 【OpenStack】OpenStack系列1之OpenStack本地开发环境搭建&&向社区贡献代码

    加入OpenStack社区 https://launchpad.net/,注册用户(597092663@qq.com/Admin@123) 修改个人信息,配置SSH keys.OpenPGP keys ...

  9. Mac OS X上IntelliJ IDEA 13与Tomcat 8的Java Web开发环境搭建

    这标题实在有点拗口,不知道怎么写好,但看了标题也就明白文本的内容.最近几天在折腾这些玩意儿,所以写写总结.除了环境搭建,本文还是一篇入门级的上手教程. 去下载一些东西 JDK安装 Tomcat安装 T ...

随机推荐

  1. Bootstrap里的文件分别表示什么?都有什么用?

    bootstrap.css 是完整的bootstrap样式表,未经压缩过的,可供开发的时候进行调试用bootstrap.min.css 是经过压缩后的bootstrap样式表,内容和bootstrap ...

  2. C#winform程序安装在默认路径提示权限不足的问题

    这个需要以管理员身份运行即可.在program.cs里面修改即可也可以在别的地方,如:C# 编程中可以使程序自动使用管理员身份运行,也就是我们常常看到一些程序的图标上会冒出个盾牌.方法:在源码的Pro ...

  3. AFNetworking提示3840 Unescaped control character around character XXX

    处理办法:找到AFNetworking包中AFURLResponseSerialization.m文件在第250行修改代码如下: if (data.length > 0 && ! ...

  4. Python中的列表生成器,迭代器的理解

    首先,思考一个问题,比如,我们想生成0-100的列表,我们怎么做? 当然,可以写成 list1=[1,2,3...,100] 可以看出,这种方法不适合生成长的列表,那么Python中就可以利用已有的列 ...

  5. Javascript 数组(Array)相关内容总结

    创建数组 var colors = new Array(); //创建新数组 var num = new Array(3); //创建包含三项的新数组 var names = new Array(&q ...

  6. spring mvc 复杂参数注入

    过了这么久,又重新把博客拾起来了 来上海工作也已经有将近两周的时间了, 今天在整理项目的时候,遇到了一个关于参数注入的问题 背景: 我的开发前台用的是extjs4,在对后台spring mvc提交表单 ...

  7. PHP 静态缓存

    今天来说说PHP页面的静态缓存. 根据个人理解,由于客户端重复的请求某个页面,导致该页面短时间内被重复请求相同的数据,导致给服务端一定的压力,同时用户访问速度也会变慢.此时如果把这个页面缓存起来,客户 ...

  8. wkhtmltopdf

    最近要做一个html转pdf的功能,在网上找了很多内容,itext什么的,都不太满意,最后找到一个wkhtmltopdf,用起来真的很不错,还找到了一篇好文章,我就直接抄过来了,等有时间我再自己理一遍 ...

  9. apply/call/bind的区别与用法

    apply 方法/call 方法 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1, arg2, ...]); 两者作用一致,都是 ...

  10. C++ queue deque

    queue queue 队,一种先进先出的数据结构,c++ stl里也叫容器适配器,它是以deque 或list为基础的一种数据结构 queue的相关操作 queue<int deque< ...