SSM配置文件

SSM配置文件总结

小白一个,最近在整理SSM框架这方面的笔记,发出来一起来交流学习,主要是基础的一些配置,涉及的内容不是很深,比较适合框架这方面的初学者。

一、mybatis配置

1、全局setting配置(可选)

常用设置:

mapUnderscoreToCamelCase 是否开启自动驼峰命名规则(camel case)映射
defaultStatementTimeout 设置超时时间

更多设置

2、别名配置(可选)

单个别名配置

<typeAliases>
    <!-- 针对个别别名定义
    type:类型的路径
    alias:别名
    -->
    <typeAlias type="club.wsttqs.po.User" alias="user"/>
</typeAliases>

批量别名配置

<typeAliases>
    <!-- 批量别名定义
    指定包名:mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
    -->
    <package name="club.wsttqs.bookstore.user.po"/>
</typeAliases>
3、配置mapper(被spring替代)

由于使用spring和mybatis整合包进行mapper扫描,这里就不需要配置了。但是必须遵循:mapper.xml和mapper,java文件同名且在同一目录下。

三、Dao层配置

1、加载配置文件
<context:property-placeholder location="classpath:db.properties"/>

配置文件 db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3366/wsttqs_bookstore?useSSL=false&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123
2、加载数据源
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
3、装载sqlSessionFactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
</bean>
4、mapper批量扫描

这里就是上面在sqlMapConfig中被替代的Mapper扫描。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 如果扫描多个包,每个包中间使用半角逗号分隔 -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <property name="basePackage" value="club.wsttqs.bookstore.mapper"/>
</bean>

需要注意的有以下两点:

  • 使用扫描器后不需要在SqlMapperConfig.xml中批量加载mapper了。但是还需要遵循mapper.java和mapper.xml同名且在同一目录下。自动扫描出来的mapper的bean的id为mapper类名(首字母小写) 。
  • 这里使用 sqlSessionFactoryBeanName 对应 value=“sqlSessionFactory”,而不是sqlSessionFactory 对应 ref=“sqlSessionFactory”,是因为后者会使上面的加载db.properties文件失效,进而导致配置数据源错误。

四、service层配置

这里只需要装载各个service的实现类即可。

<bean id="userService" class="club.wsttqs.bookstore.service.impl.UserServiceImpl"/>
<bean id="categoryService" class="club.wsttqs.bookstore.service.impl.CategoryServiceImpl"/>
<bean id="bookService" class="club.wsttqs.bookstore.service.impl.BookServiceImpl"/>
<bean id="orderService" class="club.wsttqs.bookstore.service.impl.OrderServiceImpl"/>

五、事务处理&aop

这里主要是配置aop的事务操作

1、配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 数据源 -->
    <property name="dataSource" ref="dataSource"/>
</bean>
2、通知配置
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- 传播行为 -->
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="save*" propagation="REQUIRED"/>
	    <tx:method name="delete*" propagation="REQUIRED"/>
	 	<tx:method name="insert*" propagation="REQUIRED"/>
		<tx:method name="update*" propagation="REQUIRED"/>
		<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
		<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
		<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
		</tx:attributes>
</tx:advice>
3、配置aop
<aop:config>
	<aop:advisor advice-ref="txAdvice" pointcut="execution(* club.wsttqs.bookstore.service.impl.*.*(..))"/>
</aop:config>

六、springmvc.xml

1、springmvc前端控制器
<!-- springmvc前端控制器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等)
    如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml)
    -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

关于前端控制器mapping的配置,有以下两种:

  • .action或.do,访问以.action结尾由DispatcherServlet进行解析

    注:.action或.do只是一个后缀而已,从 struts 延续而来的。

  • /,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析

  • 错误方式:/*,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。

附:使用RESTful格式的url时,需要将 url-pattern 配置为 “/” ,但是这种配置与之前的.action方式是可以并存的,即使用/或.action都由DispatcherServlet进行解析。

唯一需要注意的就是解析静态文件,在springmvc配置文件中加入解析静态资源的方法即可:

<!-- 静态资源解析,包括:js、css、img、... -->
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/img/**" location="/img/"/>
2、处理器映射器&处理器适配器(非注解型)

配置处理器映射器可分为注解型配置和非注解型配置两类:

处理器映射器:

org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

BeanNameUrlHandlerMapping 处理器映射器,会根据请求的url与spring容器中定义的处理器bean的name属性值进行匹配,从而在spring容器中找到处理bean的实例,如下所示:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">

<!-- 对UserController进行BeanName映射,url是/login.action -->
<bean name="/login.action" class="club.wsttqs.bookstore.controller.UserController"/>

SimpleUrlHandlerMapping是Spring MVC中适用性最强的Handler Mapping类,允许明确指定URL模式和Handler的映射关系。

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <!-- 对itemsController1进行url映射,url是/queryItems1.action -->
            <prop key="/queryItems1.action">itemsController1</prop>
            <prop key="/queryItems2.action">itemsController1</prop>
        </props>
    </property>
</bean>

<bean id="itemsController1" class="club.wsttqs.bookstore.controller.itemsController1"/>
<bean id="itemsController2" class="club.wsttqs.bookstore.controller.itemsController2"/>

注: 多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。

处理器适配器 :

org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter

要求编写的Handler实现 Controller接口 。

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

要求编写的Handler实现 HttpRequestHandler接口。

两种适配器的区别可以看作是Controller和HttpRequestHandler接口的区别:

  • Controller接口的handleRequest方法返回ModelAndView
  • HttpRequestHandler接口没有返回值

相较而言,用HttpRequestHandler接口编写handler更加原始一点,好处是使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据等。

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
3、处理器映射器&处理器适配器(注解型)
注解映射器
  • spring3.1之前org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
  • spring3.1之后org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
注解适配器
  • spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
  • spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

注:注解的映射器和注解的适配器必须配对使用

固定语句:mvc:annotation-driven(实际开发中使用)

可以代替上面两个注解映射器和注解适配器的配置,默认加载了很多的参数绑定方法,比如json转换解析器就默认加载了,实际开发时使用mvc:annotation-driven 。

在springmvc.xml中加入下面语句即可:

<mvc:annotation-driven></mvc:annotation-driven>

特别注意:

使用注解的方式来配置,因为Handler中使用了@Controller注解之后,要在springmvc.xml的文件中加载Handler,要关注的是,因为采用注解方式的适配器和映射器,Handler是没有实现任何接口和继承任何类的,所以注解后还需要在配置文件中加载Handler。

加载方式也分为两种,一种是一个个Handler加载进去,另一个是直接用包扫描的方式,Spring会自动把包中所有的Handler进行扫描。以下是两种加载的方式:

  • 手动加载Handler,有多少个Handler就要加载多少行
<bean class="club.wsttqs.ssm.controller.ItemsController1"/>
<bean class="club.wsttqs.ssm.controller.ItemsController2"/>
<bean class="club.wsttqs.ssm.controller.ItemsController3"/>
  • 扫描的方式自动加载Handler,指定保存Handler的包,SpringMVC会自动加载包中所有的Handler。(推荐使用)
<context:component-scan base-ackage="cn.itcast.ssm.controller"/>
4、视图解析器

Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现,

常用的是InternalResourceViewResolver,这个视图解析器一般会用来 解析JSP视图。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

需要注意的是该视图解析器默认使用jstl标签,classpath下得有jstl的包。

还有一个常用功能就是可以在该视图解析器中配置jsp文件的缺省前缀和后缀,方便开发。

springmvc.xml

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 配置jsp路径的前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!-- 配置jsp路径的后缀 -->
    <property name="suffix" value=".jsp"/>
</bean>

Controller

modelAndView.setViewName("/WEB-INF/jsp/user.jsp");

//如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
modelAndView.setViewName("user");
5、处理POST乱码

在SpringMVC框架下,解决中文提交乱码的问题,首先要保证页面设定的form的字符编码是UTF-8格式。

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 

对Get方式的乱码问题,由于参数是通过URL传递的,因此这一设定非常有效。

但是Spring MVC的Post请求参数中文时仍然会产生乱码。

Servlet 3.0规范中有关请求数据编码的解释如下:

当前很多浏览器并不发送带Content-Type头部的字符编码标识符,它会把字符编码的决定留在读取HTTP请求的时候。如果客户端没有指明编码,容器用来创建请求读和解析POST数据的默认编码必须是"ISO-8859-1"。然而,为了提示开发者客户端没有成功发送一个字符编码,容器中getCharacterEncoding方法会返回null。 如果客户端没有设置字符编码,并且请求数据使用了不同编码而不是上述的默认编码,程序将会出现中断。为了纠正这种状态,一个新的方法setCharacterEncoding(String enc) 被添加到ServletRequest接口。开发者调用这个方法能重写容器提供的字符编码。这个方法必须在解析request中任何post数据或者读任何输入之前调用。一旦数据已经被读取,调用这个方法不会影响它的编码。

为解决这个问题,当request中的post数据被读取了的情况下,比如controller层,可以采用下面这种方式进行强制解码。

new String(request.getParameter("XXXX").getBytes("iso-8859-1"), "utf-8")

或者在request读取post数据之前,手动设置数据读取的编码格式:request.setCharacterEncoding("utf-8");

当然Spring已经提供了现成的编码过滤器。在Web.xml中增加如下配置(要注意的是它的位置一定要是第一个执行的过滤器,否则可能不会生效)即可:

<filter>
	<filter-name>CharacterEncodingFilter</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>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

六、加载spring容器

主要是用来加载spring的ioc容器

web.xml中配置如下:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

需要注意的是,web.xml 的加载顺序:context-param -> listener -> filter -> servlet,该配置要写在web.xml最上面。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值