一、扫描包: 当然不写.*也是可以的
<context:component-scan base-package="com.atguigu.atcrowdfunding.*">
<context:exclude-filter type="anntation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
这里重点说一下<context:exclude-filter和context:include-filter,在配置中,很多时候我们希望把context和springmvc分开进行配置,这个时候我们就需要,对于扫描controller的类,需要包括controller注解
<!-- 扫描@Controller注解 -->
<context:component-scan base-package="com.fq.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 配置扫描注解,不扫描@Controller注解 -->
<context:component-scan base-package="com.fq">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
对于springcontext配置文件,不需要我们的controller注解
二、加载外部配置文件
两种方式
<context:property-placeholder location="classpath:conf/resource.properties" ignore-unresolvable="true" />
或者是
<bean id="Locations" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:config/jdbc.properties"></property>
</bean>
第一种本质也是调用了第二种的类进行加载文件。
三、数据库连接池
c3po连接池
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
druid连接池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="driverClassName" value="${jdbc.driver}" />
<property name="maxActive" value="10" />
<property name="minIdle" value="5" />
</bean>
四.mybatis配置
配置sessionfactory
<bean id="sessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
</bean>
配置mybatis的扫描器
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.tlj.mapper" />
</bean>
地址可以改为cn.tlj.**.mapper表示为中间可以由子包组成
或者是 cn.tlj.mapper,cn.zxk.mapper 指定扫描哪几个包下的内容
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.tlj.**.mapper" />
</bean>
sqlmapconfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置pagehelper(需要先将pagehepler安装到本地仓库) -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
或者 将扫描器配置在sqlsessionFactory classpath*: 表示从依赖的项目打的jar包中进行扫描,加载配置,不加*表示从当前项目类路径进行加载配置文件。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:/mybatis/mybatis-config.xml"></property>
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations">
<list>
<!-- classpath* 表示从依赖的项目打的jar包中进行扫描,加载配置,不加*表示从当前项目类路径进行加载配置文件。 -->
<value>classpath*:/mybatis/mapper-*.xml</value>
</list>
</property>
<property name="typeAliasesPackage" value="com.atguigu.atcrowdfunding.bean"></property>
</bean>
这里讲一下 typeAliasesPackage和typeAliases的用法与区别
typeAliasesPackage用于扫描指定包下的类可以作为返回值类型,比如你在我们的mapper里面resultType就无需使用使用全类名进行书写了,直接写扫描到类的名称即可
typeAliases:数组类型,用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名,前提是该类上没有标注@Alias注解,否则将使用该注解对应的值作为此种类型的别名。(value的值一定要是类的完全限定名)
<property name="typeAliases">
<array>
<value>com.tiantian.mybatis.model.Blog</value>
<value>com.tiantian.mybatis.model.Comment</value>
</array>
</property>
resultType和resultMap
resultType和resultMap都是可以映射我们的接受类的,但是resultType只能根据字段进行简单的映射,而resultMap中的数据,可以使集合或者是对象。这里主要说一下resultMap,
参考:https://blog.csdn.net/qq_42780864/article/details/81429114
五.事务管理器
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<!-- 第一个*表示不限制返回值 ..表示子包以及子包下所有的 *表示类 *表示方法括号中表示参数..为所有参数 -->
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* cn.tlj..*.*(..))" />
</aop:config>
tx:method中可以添加回滚错误方法
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
六.springMVC
<!-- 注解 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 字符串字符编码转换 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
设置扫描包
<context:component-scan base-package="com.atguigu.atcrowdfunding.*" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 如果是jsp那么自动转为JSTL视图 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
默认解析出来就是internalResourceViewResolver视图,加了的话就是Jstl视图
<!-- 异常解析器 -->
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">error/error</prop>
</props>
</property>
</bean>
<!-- 文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8">
<property name="maxUploadSize" value="2097152"/>
<property name="resolveLazily" value="true"/>
</bean>
<!-- 配置不拦截的静态资源 -->
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
<mvc:resources location="/" mapping="/**"></mvc:resources>
七.web.xml配置
配置我们自己写的 系统启动监听器 实现了servletContextListener接口
<listener>
<listener-class>com.atguigu.atcrowdfunding.listener.StartUpSystemListener</listener-class>
</listener>
配置springmvc的控制器
<servlet>
<servlet-name>repairAndInstall</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml,classpath:spring/applicationContext-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>repairAndInstall</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
注意:这里核心控制器是处理了所有的请求,这里可以配置多个url
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.htm</url-pattern> <!-- 表示只调整页面,不调用业务层 -->
<url-pattern>*.do</url-pattern> <!-- 表示调用业务层 -->
</servlet-mapping>
- load-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet,(实例化并调用其init()方法)。
- 它的值必须是一个整数,表示servlet被加载的先后顺序。
- 如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
- 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。
<!-- 字符编码过滤器 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 表示强制将响应字符编码设置与请求字符编码设置保持一致。 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 支持REST风格,可以将POST请求转换为PUT或DELETE请求 servlet-name配置的是核心过滤器的名字-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
<!-- 会话超时时间,默认30分钟 -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>