说是整合,其实就是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设置运行命令