• 说是整合,其实就是Spring把SqlSession给管理了

    WEB-INF下web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
        <display-name>MyBatisPro05</display-name>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file> 
        </welcome-file-list>
    <!--idea版文件头-->
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app>
        <display-name>thzWeb</display-name>
        <!--idea会在webapp下自动生成index.jsp,而且不用声明为欢迎首页,
        自动默认为首页-->
    
        <!-- 编码过滤器 -->
        <filter>
            <filter-name>encodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <async-supported>true</async-supported>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <!-- 配置文件位置,也可以是.properties文件 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value> 
            <!--默认加载路径:/WEB-INF/applicationContext.xml。
            classpath即resources,一般会在resources下建config包,
            则写为classpath:config/applicationContext.xml-->
            <!--连同spring-mvc.xml一起声明了,
            加*主要是当配置比较多的时候可能要拆成很多个配置文件,
            比如单独一个数据源的、spring security的;
            只能像下面这么写,不能拆成两个context-param节点写,会报错
            <param-value>/WEB-INF/spring*.xml
                /WEB-INF/applicationContext*.xml</param-value>
            比如写了一个spring-security.xml,但是不想在这里引入,
            也可以在applicationContext.xml中引入:
            <beans:import resource="spring-security.xml"/>
            -->
        </context-param>
    
        <!-- Spring监听器:启动时会注册一些事件,然后监控系统的请求情况 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!-- SpringMvc DispatcherServlet前端控制器 -->
        <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
            <!--上面配置文件位置用*声明的话就不用该节点了-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
            <async-supported>true</async-supported>
        </servlet>
        <servlet-mapping>
            <servlet-name>springMVC</servlet-name>
            <!--rest风格的url一般都没有后缀了,可以写成:/*或/表示拦截all-->
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    
        <!-- session监听-->
          <listener>
              <listener-class>
                org.springframework.security.web.session.HttpSessionEventPublisher
              </listener-class>
          </listener>
          <!-- session过期时间 -->
          <session-config>
            <session-timeout>1800</session-timeout>
          </session-config>
    </web-app>
    
  • 参考文章

src下配置文件

- applicationContext.xml:整个项目的Spring配置文件。配置要扫描的包、数据源、SqlSession、事务管理和切面等,代替Spring中的bean.xml,因为bean的注入工作交给注解了,但是以上的配置依然不可或缺,所以就搬到这个文件来,但是文件名继续叫bean.xml就不恰当了。applicationContext,顾名思义也就是应用的上下文,像切面啦事务都是穿插在逻辑中的,都像上下文。

    - 其中:<context:component-scan base-package="XX" />
    表示扫描包,可以用通配符*和**,*表示扫描任意包下,**表示扫描任意包下或任意类

    - 比如我在com.thz.各个层下开始写类,那么要扫描到这些类就应该这么写:
    <context:component-scan base-package="com.thz.*.**" />
    也可以再声明一个节点:
    <context:component-scan base-package="com.java1234.dao" /> <!--扫描dao包及子包-->
    <context:component-scan base-package="com.java1234.service" />/>
    - 因为service下可能是impl包或者类



    <!--使用注解的包,包括子集-->
    <context:component-scan base-package="com.thz.controller"/>

    <!-- 引用各模块的spring配置文件,只能是xml文件 -->  
    <import resource="classpath:conf/partner/partner-spring.xml" />

    <!-- 指定Spring加载资源文件;在src下则用calsspath,
    在WEB-INF下则用/WEB-INF/filename -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- 配置数据源 -->
    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--数据源配置齐全版-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
      destroy-method="close">
        <property name="url">
            <value>jdbc:mysql://127.0.0.1:3306/Enterprise</value>
        </property> 
        <property name="username"><value>root</value></property> 
        <property name="password"><value>11111111</value></property>

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="1" />
        <property name="minIdle" value="1" /> 
        <property name="maxActive" value="20" />

        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000" />

        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />

        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />

        <property name="validationQuery" value="SELECT 'x'" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />

        <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="true" />
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

        <!-- 配置监控统计拦截的filters -->
        <property name="filters" value="stat" />
    </bean>    
  • 其中,context:component-scan还有一个属性use-default-filters,默认为true,表示使用默认过滤器,扫描包含@Service、@Component、@Repository、@Controller注解的类;为false则需用子标签include-filter指定扫描哪些类。

    <context:component-scan base-package="com.haien.shirochapter12.web" 
        use-default-filters="false">
        <!--指定只扫描base-package下有@Controller的类-->
        <context:include-filter type="annotation"
            expression="org.springframework.stereotype.Controller"/>
        <!--指定只扫描base-package下有@ControllerAdvice的类-->
        <context:include-filter type="annotation"
            expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>
    
  • type和expression选值如下:
  • 注:regex中./表示.;如:

    //以controller和service结束的类
    <context:include-filter type="regex"     
        expression="com\.sparta\.trans\.[^.]+(Controller|Service)"/>
    
  • 还有一个子标签context:exclude-filter,表示不扫描的类。

  • 参考文章

  • spring-mvc.xml:配置要扫描的controller包和视图解析器,也就是处理接收请求和重定向。视图根目录是webapp,用./、../或classpath都找不到resources目录的,所以页面只能写在webapp下。

    <bean id="defaultViewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--这个不写好像也没事-->
        <property name="viewClass"     
            value="org.springframework.web.servlet.view.JstlView"/>
        <!--默认为此-->
        <property name="contentType" value="text/html"/>
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!--启动SpringMvc注解功能,完成请求和注解Controller层的映射;
    启用Flash属性,发送属性到重定向的页面-->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 配置Fastjson支持,否则controller返回值无法被解析为jsono传回前端 -->
            <bean 
              class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                        <value>WriteMapNullValue</value>
                        <value>QuoteFieldNames</value>
                    </list>
                </property>
            </bean>
    
            <!--如果用的是Jackson的话就换成这个-->
            <bean class="org.springframework.http.converter
                    .json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    
    <mvc:view-controller path="/" view-name="index"/> <!--url映射视图,无需通过控制器-->
    
    <!-- 静态资源:因为在web.xml中拦截所有请求,但静态资源其实不需要被拦截的,
    因此这里使用以下标签指定静态资源路径,凡是到指定路径下的文件,都不会被拦截-->
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
    <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
    <mvc:resources location="/WEB-INF/image/" mapping="/image/**"/>
    
  • mybatis-config.xml:给类起别名,方便映射文件引用实体类
  • log4j.properties:日志配置文件。因为applicationContext.xml中并没有引用此文件,所以在idea中只能放在resources根路径下才能识别到,而不能是根目录下的子目录里面

    #输出级别最低为debug级别,后面为输出器名称
    log4j.rootLogger=DEBUG, Console, Tofile, Exception #看网上命名好像都喜欢大写开头
    
    #Console
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout # 可以灵活地指定布局模式
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n # 灵活指定布局模式
    
    #不是很懂,应该是打印sql语句吧
    log4j.logger.java.sql.ResultSet=INFO
    log4j.logger.org.apache=INFO
    log4j.logger.java.sql.Connection=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
    
    #File
    log4j.appender.Tofile=org.apache.log4j.DailyRollingFileAppender #每天产生一个日志文件
    log4j.appender.Tofile.layout=org.apache.log4j.PatternLayout
    log4j.appender.Tofile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
    log4j.appender.Tofile.File=logFile-%d{yyyy/MM/dd}.txt #路径,不能在前面加/,识别不了的;这么写就表示项目
    
    #还可以单独打印个异常日志出来
    log4j.appender.Exception = org.apache.log4j.DailyRollingFileAppender
    #当前目录的上一级目录,如果此配置文件在resources下,则当前目录为项目
    log4j.appender.Exception.File = ../logs/springmvc-mybatis-demo_error.log 
    log4j.appender.Exception.Append = true
    log4j.appender.Exception.Threshold = ERROR 
    log4j.appender.Exception.layout = org.apache.log4j.PatternLayout
    log4j.appender.Exception.layout.ConversionPattern = [sspringmvc_mybatis_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
    
    • 语法:
log4j.appender.appenderName = fully.qualified.name.of.appender.class 
  log4j.appender.appenderName.option1 = value1 
  … 
  log4j.appender.appenderName.option = valueN 
  其中,Log4j提供的appender有以下几种: 
  org.apache.log4j.ConsoleAppender(控制台), 
  org.apache.log4j.FileAppender(文件), 
  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), 
  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 
  ③配置日志信息的格式(布局),其语法为:
  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
  log4j.appender.appenderName.layout.option1 = value1 
  … 
  log4j.appender.appenderName.layout.option = valueN 
  其中,Log4j提供的layout有以下几种: 
  org.apache.log4j.HTMLLayout(以HTML表格形式布局), 
  org.apache.log4j.PatternLayout(可以灵活地指定布局模式), 
  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), 
  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 
  Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息
  %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
  %r 输出自应用启动到输出该log信息耗费的毫秒数 
  %c 输出所属的类目,通常就是所在类的全名 
  %t 输出产生该日志事件的线程名 
  %n 输出一个回车换行符,Windows平台为“ ”,Unix平台为“ ” 
  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 
  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

src下分包

  • 其中dao层即mappers层,定义数据层接口
  • UserMapper.xml即其实现

    //出现<、&符号都会报错,因为xml会把这两个符号解析回其他信息
    <if test="reportDateTime2!=null">and Report_Date_Time <= #{reportDateTime2}</if>
    //把这种符号加到<![CDATA[ ... ]]>里面,指明不需要解析
    <if test="reportDateTime2!=null">and Report_Date_Time <![CDATA[ <= ]]> #{reportDateTime2}</if>
    
  • service.impl层对service层的实现一般是直接调用dao层定义的方法
  • 代码实例:eclipse/SSM

集成tomcat

  • 添加插件

    <build>
        <finalName>${project.artifactId}</finalName> <!--默认是项目名-版本名-->
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!--指定war文件名,在那么访问就要用这个来访问了;
                    不过不知道为什么这个属性在idea一直飘红-->
                    <warName>${project.build.finalName}</warName>
                    <!-- 用默认的就可以
                    <url>http://localhost:8080/manager/text</url>
                    <port>8080</port>
                    <uriEncoding>UTF-8</uriEncoding>
                    <server>tomcat7</server>
                    -->
                    <path>/${project.build.finalName}</path> <!--一般是项目名称-->
                </configuration>
                <!-- 用默认的就可以
                <executions>
                    <execution>
                        <phase>package</phase>
                    </execution>
                </executions>
                -->
            </plugin>
        </plugins>
    </build>
    
  • 然后就可以使用mvn tomcat7:run运行webapp了
  • 也可以在run config设置运行命令