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最上面。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 对于java中的思考的方向,1必须要看前端的页面,对于前端的页面基本的逻辑,如果能理解最好,不理解也要知道几点。 ...
    神尤鲁道夫阅读 813评论 0 0
  • 16. Web MVC 框架 16.1 Spring Web MVC 框架介绍 Spring Web 模型-视图-...
    此鱼不得水阅读 1,039评论 0 4
  • 1.Spring背景 1.1.Spring四大原则: 使用POJO进行轻量级和最侵入式开发; 通过依赖注入和基于借...
    嗷大彬彬阅读 789评论 0 2
  • Based on Java™ Servlet Specification v3.1 [TOC] Servlet和S...
    0x70e8阅读 1,316评论 0 7
  • 这会儿有时间,先来更一篇简书吧。早晨六点半的闹铃,起来洗漱完毕吃完早饭,七点半已经坐在教室里了。昨天看群里...
    64e98dfe9411阅读 220评论 6 0