架构之路之spring+springmvc+maven+mongodb的搭建

1.前言

      最近项目开发使用到了spring+springmvc+maven+mongodb,项目中的框架是用springboot进项开发的,对于我们中级开发人员来说,有利有弊,好处呢是springboot开发减少了很多配置文件,同时也使开发更加规范快捷,但是,不好的地方就是长此以往,我们就在码农的道路上越走越远。。。

     所以,为了抵制码农的身份,在工作之余自己亲手由零一点一点搭建了这个框架,当然框架暂时只包含基本的东西,但是千里之行始于足下,良好的开始就是成功的一半,我会在以后的道路上不断进行扩展的,如果有问题,也请大家不吝赐教,我们共同进步!

2.准备环境

    工欲善其事必先利其器,我们先做好前期准备工作,开发工具IntelliJ IDEA14,jdk版本是1.8,对于java环境变量配置,mongodb的安装,maven的这边不做过多说明,网上也有很多详细的说明,大家可以去查询,那么下面我们就开始项目的搭建。

3.项目搭建

3.1创建maven项目

详细步骤 点击这里

3.2 配置文件

3.2.1 maven依赖

 
  1.  
    <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  2.  
    xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3.  
    <modelVersion> 4.0.0</modelVersion>
  4.  
    <groupId>com.tl.project</groupId>
  5.  
    <artifactId>skyLine</artifactId>
  6.  
    <packaging>war</packaging>
  7.  
    <version> 1.0-SNAPSHOT</version>
  8.  
    <name>skyLine Maven Webapp</name>
  9.  
    <url>http: //maven.apache.org</url>
  10.  
     
  11.  
     
  12.  
    <!--建议我所引用包的版本集中放在这里,这样比较直观-->
  13.  
    <properties>
  14.  
    <spring.version> 4.2.5.RELEASE</spring.version>
  15.  
    <aspectj.version> 1.8.9</aspectj.version>
  16.  
    <cglib.version> 3.2.4</cglib.version>
  17.  
    <project.build.sourceEncoding>UTF- 8</project.build.sourceEncoding>
  18.  
    </properties>
  19.  
     
  20.  
     
  21.  
    <dependencies>
  22.  
    <dependency>
  23.  
    <groupId>junit</groupId>
  24.  
    <artifactId>junit</artifactId>
  25.  
    <!--<version> 3.8.1</version>-->
  26.  
    <version> 4.12</version>
  27.  
    <scope>test</scope>
  28.  
    </dependency>
  29.  
     
  30.  
    <dependency>
  31.  
    <groupId>org.springframework</groupId>
  32.  
    <artifactId>spring-web</artifactId>
  33.  
    <version>${spring.version}</version>
  34.  
    </dependency>
  35.  
     
  36.  
    <dependency>
  37.  
    <groupId>org.springframework</groupId>
  38.  
    <artifactId>spring-webmvc</artifactId>
  39.  
    <version>${spring.version}</version>
  40.  
    <scope>compile</scope>
  41.  
    <!--<exclusions>-->
  42.  
    <!--<exclusion>-->
  43.  
    <!--<groupId>commons-logging</groupId>-->
  44.  
    <!--<artifactId>commons-logging</artifactId>-->
  45.  
    <!--</exclusion>-->
  46.  
    <!--</exclusions>-->
  47.  
    </dependency>
  48.  
     
  49.  
    <dependency>
  50.  
    <groupId>commons-logging</groupId>
  51.  
    <artifactId>commons-logging</artifactId>
  52.  
    <version> 1.2</version>
  53.  
    </dependency>
  54.  
     
  55.  
    <dependency>
  56.  
    <groupId>org.springframework</groupId>
  57.  
    <artifactId>spring-jdbc</artifactId>
  58.  
    <version>${spring.version}</version>
  59.  
    </dependency>
  60.  
     
  61.  
    <dependency>
  62.  
    <groupId>org.springframework</groupId>
  63.  
    <artifactId>spring-test</artifactId>
  64.  
    <version>${spring.version}</version>
  65.  
    <scope>test</scope>
  66.  
    </dependency>
  67.  
     
  68.  
    <dependency>
  69.  
    <groupId>org.springframework</groupId>
  70.  
    <artifactId>spring-core</artifactId>
  71.  
    <version>${spring.version}</version>
  72.  
    </dependency>
  73.  
     
  74.  
    <dependency>
  75.  
    <groupId>org.springframework</groupId>
  76.  
    <artifactId>spring-context</artifactId>
  77.  
    <version>${spring.version}</version>
  78.  
    </dependency>
  79.  
     
  80.  
    <dependency>
  81.  
    <groupId>org.springframework</groupId>
  82.  
    <artifactId>spring-context-support</artifactId>
  83.  
    <version>${spring.version}</version>
  84.  
    </dependency>
  85.  
     
  86.  
    <dependency>
  87.  
    <groupId>org.mybatis</groupId>
  88.  
    <artifactId>mybatis</artifactId>
  89.  
    <version> 3.2.7</version>
  90.  
    </dependency>
  91.  
     
  92.  
    <dependency>
  93.  
    <groupId>org.mybatis</groupId>
  94.  
    <artifactId>mybatis-spring</artifactId>
  95.  
    <version> 1.2.2</version>
  96.  
    </dependency>
  97.  
     
  98.  
    <dependency>
  99.  
    <groupId>mysql</groupId>
  100.  
    <artifactId>mysql-connector-java</artifactId>
  101.  
    <version> 5.1.30</version>
  102.  
    </dependency>
  103.  
     
  104.  
    <!-- mongoDB支持jar -->
  105.  
    <dependency>
  106.  
    <groupId>org.springframework.data</groupId>
  107.  
    <artifactId>spring-data-mongodb</artifactId>
  108.  
    <version> 1.8.4.RELEASE</version>
  109.  
    </dependency>
  110.  
     
  111.  
    <dependency>
  112.  
    <groupId>javax.servlet</groupId>
  113.  
    <artifactId>javax.servlet-api</artifactId>
  114.  
    <version> 3.1.0</version>
  115.  
    <scope>provided</scope>
  116.  
    </dependency>
  117.  
     
  118.  
    <dependency>
  119.  
    <groupId>javax.servlet.jsp</groupId>
  120.  
    <artifactId>jsp-api</artifactId>
  121.  
    <version> 2.1</version>
  122.  
    <scope>provided</scope>
  123.  
    </dependency>
  124.  
     
  125.  
    <!--JSP标准标签库(JSTL)-->
  126.  
    <dependency>
  127.  
    <groupId>javax.servlet</groupId>
  128.  
    <artifactId>jstl</artifactId>
  129.  
    <version> 1.2</version>
  130.  
    </dependency>
  131.  
     
  132.  
    <dependency>
  133.  
    <groupId>dom4j</groupId>
  134.  
    <artifactId>dom4j</artifactId>
  135.  
    <version> 1.6.1</version>
  136.  
    </dependency>
  137.  
     
  138.  
    <!--区别slf4j与log4j-->
  139.  
    <dependency>
  140.  
    <groupId>org.slf4j</groupId>
  141.  
    <artifactId>jcl-over-slf4j</artifactId>
  142.  
    <version> 1.7.7</version>
  143.  
    </dependency>
  144.  
    <dependency>
  145.  
    <groupId>org.slf4j</groupId>
  146.  
    <artifactId>slf4j-api</artifactId>
  147.  
    <version> 1.7.7</version>
  148.  
    </dependency>
  149.  
    <dependency>
  150.  
    <groupId>org.slf4j</groupId>
  151.  
    <artifactId>slf4j-nop</artifactId>
  152.  
    <version> 1.7.5</version>
  153.  
    </dependency>
  154.  
    <dependency>
  155.  
    <groupId>log4j</groupId>
  156.  
    <artifactId>log4j</artifactId>
  157.  
    <version> 1.2.17</version>
  158.  
    </dependency>
  159.  
    </dependencies>
  160.  
     
  161.  
    <build>
  162.  
    <finalName>skyLine</finalName>
  163.  
    <plugins>
  164.  
    <!-- 编码和编译和JDK版本 -->
  165.  
    <!--解决 @Override not allowed when implementing interface method报错问题-->
  166.  
    < plugin>
  167.  
    < groupId> org. apache. maven. plugins</ groupId>
  168.  
    < artifactId> maven- compiler- plugin</ artifactId>
  169.  
    < version>2.3.2</ version>
  170.  
    < configuration>
  171.  
    < source>1.8</ source>
  172.  
    < target>1.8</ target>
  173.  
    < encoding> utf8</ encoding>
  174.  
    </ configuration>
  175.  
    </ plugin>
  176.  
    </ plugins>
  177.  
    </ build>
  178.  
    </ project>

3.2.2 spring-context.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.  
    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/aop
  11.  
    http://www.springframework.org/schema/aop/spring-aop.xsd">
  12.  
     
  13.  
    <!--开启注解处理器-->
  14.  
    <!--<context:annotation-config/>-->
  15.  
     
  16.  
    <!-- 自动检测bean,启用spring mvc 注解 @Autowired, @Resource, @Required
  17.  
    <context:annotation-config /> 有了下面扫描配置后该项可以省掉-->
  18.  
    <context:component-scan base- package= "com.tl.skyLine">
  19.  
    <!-- 排除不扫描的,controller放在子容器springmvc的配置文件中 -->
  20.  
    <context:exclude-filter type= "annotation" expression= "org.springframework.stereotype.Controller"/>
  21.  
    </context:component-scan>
  22.  
     
  23.  
     
  24.  
    <!--导入mongodb的配置文件-->
  25.  
    < import resource= "mongodb-context.xml"/>
  26.  
     
  27.  
    <!--仅用来测试springIoc是否成功-->
  28.  
    <bean id= "test" class= "com.tl.skyLine.controller.TestSpringIocController">
  29.  
    </bean>
  30.  
    </beans>

3.2.3 springmvc-servlet.xml

 
  1.  
    <?xml version= "1.0" encoding= "UTF-8"?>
  2.  
    <beans
  3.  
    xmlns= "http://www.springframework.org/schema/beans"
  4.  
    xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  5.  
    xmlns:mvc= "http://www.springframework.org/schema/mvc"
  6.  
    xmlns:context= "http://www.springframework.org/schema/context"
  7.  
    xsi:schemaLocation= "http://www.springframework.org/schema/beans
  8.  
    http://www.springframework.org/schema/beans/spring-beans.xsd
  9.  
    http://www.springframework.org/schema/mvc
  10.  
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
  11.  
    http://www.springframework.org/schema/context
  12.  
    http://www.springframework.org/schema/context/spring-context.xsd">
  13.  
     
  14.  
    <!--只在springmvc容器中配置controller的扫描-->
  15.  
    <context:component-scan base- package= "com.tl.skyLine" use- default-filters= "false">
  16.  
    <context:include-filter type= "annotation" expression= "org.springframework.stereotype.Controller"/>
  17.  
    </context:component-scan>
  18.  
     
  19.  
    <!--这个是SpringMVC必须要配置的,因为它声明了 @RequestMapping@RequestBody@ResponseBody等。并且,该配置默认加载很多的参数绑定方法,比如json转换解析器等。-->
  20.  
    <mvc:annotation-driven/>
  21.  
     
  22.  
    <!-- 将在Controller返回的ModelAndView,加上目录前缀/WEB-INF/views/, 文件名称后缀.jsp -->
  23.  
    <bean id= "viewResolver" class= "org.springframework.web.servlet.view.InternalResourceViewResolver">
  24.  
    <property name= "viewClass" value= "org.springframework.web.servlet.view.JstlView"/>
  25.  
    <!--<beans:property name= "prefix" value= "/WEB-INF/views/"/>-->
  26.  
    <property name= "prefix" value= "/pages/"/>
  27.  
    <property name= "suffix" value= ".jsp"/>
  28.  
    </bean>
  29.  
     
  30.  
    <!-- 对静态资源文件的访问-->
  31.  
    <!--<mvc:resources mapping= "/images/**" location= "/WEB-INF/images/" cache-period= "31556926"/>-->
  32.  
    <!--<mvc:resources mapping= "/js/**" location= "/WEB-INF/js/" cache-period= "31556926"/>-->
  33.  
    <!--<mvc:resources mapping= "/css/**" location= "/WEB-INF/css/" cache-period= "31556926"/>-->
  34.  
     
  35.  
    <!--由于父子容器的关系, @controller注解扫描配置在mvc中,所以启动shiro注解也需要在子容器中引用一次-->
  36.  
    < import resource= "shiro-context.xml"/>
  37.  
     
  38.  
    </beans>

3.2.4 mongodb-context.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:mongo= "http://www.springframework.org/schema/data/mongo"
  6.  
    xsi:schemaLocation= "http://www.springframework.org/schema/context
  7.  
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
  8.  
    http://www.springframework.org/schema/data/mongo
  9.  
    http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
  10.  
    http://www.springframework.org/schema/beans
  11.  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  12.  
    <!-- 加载mongodb的属性配置文件 -->
  13.  
    <context:property-placeholder location= "classpath:config.properties"/>
  14.  
     
  15.  
    <!-- 定义mongo对象,对应的是mongodb官方jar包中的Mongo,replica-set设置集群副本的ip地址和端口 -->
  16.  
    <mongo:mongo id= "mongo" replica-set= "${mongo.hostport}">
  17.  
    <!-- 一些连接属性的设置 -->
  18.  
    <mongo:options
  19.  
    connections-per-host= "${mongo.connectionsPerHost}"
  20.  
    threads-allowed-to-block- for-connection-multiplier= "${mongo.threadsAllowedToBlockForConnectionMultiplier}"
  21.  
    connect-timeout= "${mongo.connectTimeout}"
  22.  
    max-wait-time= "${mongo.maxWaitTime}"
  23.  
    auto-connect-retry= "${mongo.autoConnectRetry}"
  24.  
    socket-keep-alive= "${mongo.socketKeepAlive}"
  25.  
    socket-timeout= "${mongo.socketTimeout}"
  26.  
    slave-ok= "${mongo.slaveOk}"
  27.  
    write-number= "1"
  28.  
    write-timeout= "0"
  29.  
    write-fsync= "true"/>
  30.  
    </mongo:mongo>
  31.  
     
  32.  
    <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
  33.  
    <mongo:db-factory dbname= "skyLine" mongo-ref= "mongo"/>
  34.  
    <bean id= "mongoTemplate" class= "org.springframework.data.mongodb.core.MongoTemplate">
  35.  
    <constructor-arg ref= "mongo"/>
  36.  
    <constructor-arg name= "databaseName" value= "${mongo.database}"/>
  37.  
    </bean>
  38.  
     
  39.  
    <!-- 映射转换器,扫描back- package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 -->
  40.  
    <mongo:mapping-converter base- package= "com.tl.skyLine.model"/>
  41.  
     
  42.  
    <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 -->
  43.  
    <mongo:repositories base- package= "com.tl.skyLine.repository"/>
  44.  
    </beans>

3.2.5 config.properties

 
  1.  
    #mongoDB连接配置
  2.  
    mongo.hostport= 127.0.0.1: 27017
  3.  
    mongo.connectionsPerHost= 8
  4.  
    mongo.threadsAllowedToBlockForConnectionMultiplier= 4
  5.  
    #连接超时时间
  6.  
    mongo.connectTimeout= 1000
  7.  
    #等待时间
  8.  
    mongo.maxWaitTime= 1500
  9.  
    mongo.autoConnectRetry= true
  10.  
    mongo.socketKeepAlive= true
  11.  
    #Socket超时时间
  12.  
    mongo.socketTimeout= 1500
  13.  
    mongo.slaveOk= true
  14.  
    #数据库名称
  15.  
    mongo.database=skyLine

3.2.7 logging.properties

这个主要是为tomcat在控制台增加报错日志信息,方便项目搭建的时候调试用的:

 
  1.  
    handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
  2.  
     
  3.  
    ############################################################
  4.  
    # Handler specific properties.
  5.  
    # Describes specific configuration info for Handlers.
  6.  
    ############################################################
  7.  
     
  8.  
    org.apache.juli.FileHandler.level = FINE
  9.  
    org.apache.juli.FileHandler.directory = ${catalina.base}/logs
  10.  
    org.apache.juli.FileHandler.prefix = error-debug.
  11.  
     
  12.  
    java.util.logging.ConsoleHandler.level = FINE
  13.  
    java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

3.2.8 log4j.properties

这个是项目打印日志信息用的,也可配置打印在控制台,或者打印在硬盘某个路径下的文档里:

 
  1.  
    #rootCategory:默认是对整个工程生效
  2.  
    log4j.rootCategory=INFO, stdout
  3.  
    #日志输出级别,日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG
  4.  
    log4j.rootLogger=info, stdout
  5.  
     
  6.  
    ### stdout ###
  7.  
    #设置stdout的日志输出控制台
  8.  
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  9.  
    #输出日志到控制台的方式,默认为System.out
  10.  
    log4j.appender.stdout.Target=System.out
  11.  
    #设置使用灵活布局
  12.  
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  13.  
    #灵活定义输出格式
  14.  
    log4j.appender.stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %m %n
  15.  
     
  16.  
     
  17.  
    #设置other的日志输出控制台
  18.  
    log4j.appender.other=org.apache.log4j.RollingFileAppender
  19.  
    #设置other的输出日志
  20.  
    log4j.appender.other.File=${webapp.root}/WEB-INF/logs/log.log
  21.  
    #设置other的日志最大限制
  22.  
    log4j.appender.other.MaxFileSize= 1024KB
  23.  
    #最多只保存 20个备份文件
  24.  
    log4j.appender.other.MaxBackupIndex= 1000
  25.  
    #输出INFO级别以上的日志
  26.  
    og4j.appender.other.Threshold=INFO
  27.  
    #设置使用灵活布局
  28.  
    log4j.appender.other.layout=org.apache.log4j.PatternLayout
  29.  
    #灵活定义输出格式
  30.  
    log4j.appender.other.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %t %m %n

      输出格式可以自己定义,我们上面定义的比较多,如果觉得控制台打印内容过于繁琐,可以根据需求修改,比如如果把%l去掉,这样就不会显示日志发生的位置,不会打印类名,方法名了;

 
  1.  
    %m 输出代码中指定的消息
  2.  
      %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  3.  
      %r 输出自应用启动到输出该log信息耗费的毫秒数
  4.  
      %c 输出所属的类目,通常就是所在类的全名
  5.  
      %t 输出产生该日志事件的线程名
  6.  
      %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
  7.  
      %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似: 20021018221028921
  8.  
      %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )

3.2.9 web.xml

 
  1.  
    <?xml version= "1.0" encoding= "UTF-8"?>
  2.  
    <web-app version= "3.0"
  3.  
    xmlns= "http://java.sun.com/xml/ns/javaee"
  4.  
    xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  5.  
    xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee
  6.  
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7.  
     
  8.  
    <!--指定欢迎页面-->
  9.  
    <welcome-file-list>
  10.  
    <welcome-file>index.jsp</welcome-file>
  11.  
    </welcome-file-list>
  12.  
     
  13.  
    <!--真正的加载顺序为:context-param -> listener -> filter -> servlet-->
  14.  
     
  15.  
    <!--<listener>-->
  16.  
    <!--<listener- class> org. springframework. web. context. request. RequestContextListener</ listener- class>-->
  17.  
    <!--</ listener>-->
  18.  
     
  19.  
     
  20.  
    <!--1、在 web. xml配置监听器 ContextLoaderListener-->
  21.  
    <!-- ContextLoaderListener的作用(一句话):初始化 BeanFactory,并将 BeanFactory设置到 application中。-->
  22.  
    < listener>
  23.  
    < listener- class> org. springframework. web. context. ContextLoaderListener</ listener- class>
  24.  
    </ listener>
  25.  
     
  26.  
    <!--2、部署 applicationContextxml文件,默认的路径是"/ WEB- INF/ applicationContext. xml
  27.  
    如果是要自定义文件名可以在 web. xml里加入 contextConfigLocation这个 context参数:
  28.  
    在< param- value> </ param- value>里指定相应的 xml文件名,如果有多个 xml文件,可以写在一起并以“,”号分隔。
  29.  
    也可以这样 applicationContext-*. xml采用通配符,-->
  30.  
    < context- param>
  31.  
    < param- name> contextConfigLocation</ param- name>
  32.  
    < param- value> classpath: spring- context. xml</ param- value>
  33.  
    </ context- param>
  34.  
     
  35.  
    <!-- Spring log4j Config loader-->
  36.  
    < listener>
  37.  
    < listener- class>
  38.  
    org. springframework. web. util. Log4jConfigListener
  39.  
    </ listener- class>
  40.  
    </ listener>
  41.  
     
  42.  
    < context- param>
  43.  
    < param- name> log4jConfigLocation</ param- name>
  44.  
    < param- value> classpath: log4j. properties</ param- value>
  45.  
    </ context- param>
  46.  
     
  47.  
    <!-- 防止 Spring内存溢出监听器 -->
  48.  
    <!--< listener>-->
  49.  
    <!--< listener- class> org. springframework. web. util. IntrospectorCleanupListener</ listener- class>-->
  50.  
    <!--</ listener>-->
  51.  
     
  52.  
    <!--通过 EnvironmentLoaderListener 这个监听器来初始化 SecurityManager-->
  53.  
    <!--< listener>-->
  54.  
    <!--< listener- class> org. apache. shiro. web. env. EnvironmentLoaderListener</ listener- class>-->
  55.  
    <!--</ listener>-->
  56.  
     
  57.  
    <!--使用 Spring MVC,配置 DispatcherServlet是第一步。 DispatcherServlet是一个 Servlet,
  58.  
    所以可以配置多个 DispatcherServlet-->
  59.  
    < servlet>
  60.  
    < servlet- name> springMVC</ servlet- name>
  61.  
    < servlet- class> org. springframework. web. servlet. DispatcherServlet</ servlet- class>
  62.  
    < init- param>
  63.  
    < param- name> contextConfigLocation</ param- name>
  64.  
    < param- value> classpath: springmvc- servlet. xml</ param- value>
  65.  
    </ init- param>
  66.  
    <!--是启动顺序,让这个 ServletServletp容器一起启动。-->
  67.  
    < load- on- startup>1</ load- on- startup>
  68.  
    </ servlet>
  69.  
    < servlet- mapping>
  70.  
    < servlet- name> springMVC</ servlet- name>
  71.  
    < url- pattern>/</ url- pattern>
  72.  
    </ servlet- mapping>
  73.  
     
  74.  
    <!-- 在 Spring框架中是如何解决从页面传来的字符串的编码问题的呢?
  75.  
    下面我们来看看 Spring框架给我们提供过滤器 CharacterEncodingFilter
  76.  
    这个过滤器就是针对于每次浏览器请求进行过滤的,然后再其之上添加了父类没有的功能即处理字符编码。
  77.  
    其中 encoding用来设置编码格式, forceEncoding用来设置是否理会 request. getCharacterEncoding()方法,设置为 true则强制覆盖之前的编码格式。-->
  78.  
    < filter>
  79.  
    < filter- name> encodingFilter</ filter- name>
  80.  
    < filter- class> org. springframework. web. filter. CharacterEncodingFilter</ filter- class>
  81.  
    < init- param>
  82.  
    < param- name> encoding</ param- name>
  83.  
    < param- value> UTF-8</ param- value>
  84.  
    </ init- param>
  85.  
    < init- param>
  86.  
    < param- name> forceEncoding</ param- name>
  87.  
    < param- value> true</ param- value>
  88.  
    </ init- param>
  89.  
    </ filter>
  90.  
    < filter- mapping>
  91.  
    < filter- name> encodingFilter</ filter- name>
  92.  
    < url- pattern>/*</ url- pattern>
  93.  
    </ filter- mapping>
  94.  
     
  95.  
     
  96.  
    < servlet- mapping>
  97.  
    < servlet- name> default</ servlet- name>
  98.  
    < url- pattern>*. html</ url- pattern>
  99.  
    </ servlet- mapping>
  100.  
     
  101.  
    < error- page> <!--当系统出现404错误,跳转到页面 nopage. html-->
  102.  
    < error- code>404</ error- code>
  103.  
    < location>/ noPage. jsp</ location>
  104.  
    </ error- page>
  105.  
     
  106.  
    < session- config><!--会话超时配置,单位分钟-->
  107.  
    < session- timeout>360</ session- timeout>
  108.  
    </ session- config>
  109.  
     
  110.  
    </ web- app>
  111.  
     

3.3 User类

 
  1.  
    package com.tl.skyLine.model;
  2.  
     
  3.  
    import org.springframework.data.annotation.Id;
  4.  
    import org.springframework.data.mongodb.core.mapping.Document;
  5.  
     
  6.  
    /**
  7.  
    * 系统操作人员
  8.  
    */
  9.  
    @Document(collection = "sky.user")
  10.  
    public class User {
  11.  
     
  12.  
    @Id
  13.  
    private String id;
  14.  
     
  15.  
    private String username;
  16.  
     
  17.  
    private String password;
  18.  
     
  19.  
    public String getId() {
  20.  
    return id;
  21.  
    }
  22.  
     
  23.  
    public void setId(String id) {
  24.  
    this.id = id;
  25.  
    }
  26.  
     
  27.  
    public String getUsername() {
  28.  
    return username;
  29.  
    }
  30.  
     
  31.  
    public void setUsername(String username) {
  32.  
    this.username = username;
  33.  
    }
  34.  
     
  35.  
    public String getPassword() {
  36.  
    return password;
  37.  
    }
  38.  
     
  39.  
    public void setPassword(String password) {
  40.  
    this.password = password;
  41.  
    }
  42.  
    }

3.4 数据层操作dao

userDao

 
  1.  
    package com.tl.skyLine.repository;
  2.  
     
  3.  
    import com.tl.skyLine.model.User;
  4.  
     
  5.  
    import java.util.List;
  6.  
     
  7.  
    /**
  8.  
    * UserDao
  9.  
    * Created by tl on 17/2/13.
  10.  
    */
  11.  
    public interface UserDao {
  12.  
     
  13.  
    /**
  14.  
    * 查询所有数据
  15.  
    *
  16.  
    * @return
  17.  
    */
  18.  
    List<User> findAll();
  19.  
     
  20.  
    /**
  21.  
    * 用于分页查询
  22.  
    *
  23.  
    * @param skip(第一个坐标为0)
  24.  
    * @param limit
  25.  
    * @return
  26.  
    */
  27.  
    List<User> findList( int skip, int limit);
  28.  
     
  29.  
    /**
  30.  
    * 保存用户
  31.  
    *
  32.  
    * @param user
  33.  
    */
  34.  
    void store(User user);
  35.  
     
  36.  
    /**
  37.  
    * 根据id查询
  38.  
    *
  39.  
    * @param id
  40.  
    * @return
  41.  
    */
  42.  
    User findOne(String id);
  43.  
     
  44.  
    /**
  45.  
    * 根据用户名查询
  46.  
    *
  47.  
    * @param username
  48.  
    * @return
  49.  
    */
  50.  
    User findOneByUsername(String username);
  51.  
     
  52.  
    /**
  53.  
    * 更新
  54.  
    *
  55.  
    * @param user
  56.  
    */
  57.  
    void updateFirst(User user);
  58.  
     
  59.  
    /**
  60.  
    * 删除
  61.  
    *
  62.  
    * @param ids
  63.  
    */
  64.  
    void delete(String... ids);
  65.  
    }

userDaoImpl

 
  1.  
    package com.tl.skyLine.repository;
  2.  
     
  3.  
    import com.tl.skyLine.model.User;
  4.  
    import org.springframework.beans.factory.annotation.Autowired;
  5.  
    import org.springframework.data.domain.Sort;
  6.  
    import org.springframework.data.domain.Sort.Direction;
  7.  
    import org.springframework.data.domain.Sort.Order;
  8.  
    import org.springframework.data.mongodb.core.MongoTemplate;
  9.  
    import org.springframework.data.mongodb.core.query.Criteria;
  10.  
    import org.springframework.data.mongodb.core.query.Query;
  11.  
    import org.springframework.data.mongodb.core.query.Update;
  12.  
    import org.springframework.stereotype.Service;
  13.  
     
  14.  
    import java.util.List;
  15.  
     
  16.  
    /**
  17.  
    * UserDaoImpl
  18.  
    * Created by tl on 17/2/13.
  19.  
    */
  20.  
    @Service
  21.  
    public class UserDaoImpl implements UserDao {
  22.  
     
  23.  
    //MongoTemplate是数据库和代码之间的接口,对数据库的操作都在它里面
  24.  
    @Autowired
  25.  
    private MongoTemplate mongoTemplate;
  26.  
     
  27.  
    @Override
  28.  
    public List<User> findAll() {
  29.  
    return this.mongoTemplate.find( new Query(), User.class);
  30.  
    }
  31.  
     
  32.  
    @Override
  33.  
    public List<User> findList( int skip, int limit) {
  34.  
    Query query = new Query();
  35.  
    query.with( new Sort( new Order(Direction.ASC, "_id")));
  36.  
    query.skip(skip).limit(limit);
  37.  
    return this.mongoTemplate.find(query, User.class);
  38.  
    }
  39.  
     
  40.  
    @Override
  41.  
    public void store(User user) {
  42.  
    mongoTemplate.save(user);
  43.  
    }
  44.  
     
  45.  
    /**
  46.  
    * Criteria.where("username").is(username)
  47.  
    * 前一个是数据库的字段,后一个是java类的字段
  48.  
    *
  49.  
    * @param username
  50.  
    * @return
  51.  
    */
  52.  
    @Override
  53.  
    public User findOneByUsername(String username) {
  54.  
    Query query = new Query();
  55.  
    Criteria criteria = Criteria.where( "username").is(username);
  56.  
    query.addCriteria(criteria);
  57.  
    return this.mongoTemplate.findOne(query, User.class);
  58.  
    }
  59.  
     
  60.  
    @Override
  61.  
    public User findOne(String id) {
  62.  
    Query query = new Query();
  63.  
    Criteria criteria = Criteria.where( "_id").is(id);
  64.  
    query.addCriteria(criteria);
  65.  
    return this.mongoTemplate.findOne(query, User.class);
  66.  
    }
  67.  
     
  68.  
    @Override
  69.  
    public void updateFirst(User user) {
  70.  
    Update update = new Update();
  71.  
    Query query = new Query();
  72.  
    update.set( "username", user.getUsername());
  73.  
    update.set( "password", user.getPassword());
  74.  
    this.mongoTemplate.updateFirst(query.addCriteria(Criteria.where( "_id").is(user.getId())), update, User.class);
  75.  
    }
  76.  
     
  77.  
    @Override
  78.  
    public void delete(String... ids) {
  79.  
    if (ids == null || ids.length == 0) {
  80.  
    return;
  81.  
    }
  82.  
    for (String id : ids) {
  83.  
    Query query = new Query(Criteria.where( "_id").is(id));
  84.  
    this.mongoTemplate.remove(query, User.class);
  85.  
    }
  86.  
    }
  87.  
    }

3.5单元测试

 
  1.  
    package com.tl.skyLine.controller;
  2.  
     
  3.  
    import com.tl.skyLine.TestSpringIocController;
  4.  
    import com.tl.skyLine.model.User;
  5.  
    import com.tl.skyLine.repository.UserDao;
  6.  
    import org.apache.log4j.Logger;
  7.  
    import org.junit.Test;
  8.  
    import org.junit.runner.RunWith;
  9.  
    import org.springframework.context.ApplicationContext;
  10.  
    import org.springframework.context.support.ClassPathXmlApplicationContext;
  11.  
    import org.springframework.test.context.ContextConfiguration;
  12.  
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  13.  
     
  14.  
    import javax.annotation.Resource;
  15.  
    import java.util.List;
  16.  
     
  17.  
    /**
  18.  
    * 测试springIoc是否成功
  19.  
    * Created by tl on 17/2/11.
  20.  
    * <p/>
  21.  
    * 注解@ContextConfiguration表示将ApplicationContext对象注入进来,就不用像以往那样在测试程序里先new了,直接使用
  22.  
    */
  23.  
    @RunWith(SpringJUnit4ClassRunner.class)
  24.  
    //@ContextConfiguration(locations = "classpath:spring-context.xml")
  25.  
    @ContextConfiguration(locations = { "classpath:spring-context.xml", "classpath:springmvc-servlet.xml"})
  26.  
    public class UserDaoTestController {
  27.  
     
  28.  
    // 在任何需要记录日志的类中
  29.  
    private static Logger logger = Logger.getLogger(UserDaoTestController.class);
  30.  
     
  31.  
    @Resource
  32.  
    private UserDao userDao;
  33.  
     
  34.  
    /**
  35.  
    * 测试Spring IOC的开发环境
  36.  
    */
  37.  
    @Test
  38.  
    public void springIoc() {
  39.  
    ApplicationContext context = new ClassPathXmlApplicationContext( "classpath:spring-context.xml");
  40.  
    TestSpringIocController test = (TestSpringIocController) context.getBean( "test");
  41.  
    test.print();
  42.  
    }
  43.  
     
  44.  
    @Test //测试Spring IOC的开发环境
  45.  
    public void save() {
  46.  
    User user = new User();
  47.  
    user.setUsername( "skyLine2");
  48.  
    user.setPassword( "7777777");
  49.  
    userDao.store(user);
  50.  
     
  51.  
    User user2 = userDao.findOneByUsername( "skyLine2");
  52.  
    logger.info( "-------获取账户密码:-------" + user2.getPassword());
  53.  
    }
  54.  
     
  55.  
    @Test
  56.  
    public void update() {
  57.  
    User user = userDao.findOneByUsername( "skyLine2");
  58.  
    logger.info( "-------更新之前账户密码:-------" + user.getPassword());
  59.  
     
  60.  
    user.setPassword( "9999888");
  61.  
    userDao.updateFirst(user);
  62.  
     
  63.  
    logger.info( "-------更新之后账户密码:-------" + user.getPassword());
  64.  
    }
  65.  
     
  66.  
    @Test //测试Spring IOC的开发环境
  67.  
    public void findAll() {
  68.  
    // List<User> lists = userDao.findAll();
  69.  
    // for (User user : lists) {
  70.  
    // logger.info("-------user遍历:-------" + user.getUsername());
  71.  
    // }
  72.  
     
  73.  
    List<User> lists2= userDao.findList( 1, 2);
  74.  
    for (User user : lists2) {
  75.  
    logger.info( "-------user遍历:-------" + user.getUsername());
  76.  
    }
  77.  
    }
  78.  
     
  79.  
    @Test
  80.  
    public void delete() {
  81.  
    userDao.delete(userDao.findOneByUsername( "skyLine2").getId());
  82.  
    }
  83.  
     
  84.  
    }


    至此,基本的项目骨架就搭成了!

    整个过程有些很多东西也是参考网上的博客,也结合自己的项目搭建起来的,万丈高楼平地起,再大的项目也是一点点的搭建,不断的测试,完善才完成的,在搭建项目的过程中收获了很多,当然这个项目只是第一步,自己会不断的完善!

另附整个项目的结构:

发布了17 篇原创文章 · 获赞 13 · 访问量 7550

猜你喜欢

转载自blog.csdn.net/liyabing1/article/details/80837764
今日推荐