小白一个,最近在整理SSM框架这方面的笔记,发出来一起来交流学习,主要是基础的一些配置,涉及的内容不是很深,比较适合框架这方面的初学者。
一、mybatis配置
1、全局setting配置(可选)
常用设置:
mapUnderscoreToCamelCase 是否开启自动驼峰命名规则(camel case)映射
defaultStatementTimeout 设置超时时间
更多设置
2、别名配置(可选)
单个别名配置
批量别名配置
3、配置mapper(被spring替代)
由于使用spring和mybatis整合包进行mapper扫描,这里就不需要配置了。但是必须遵循:mapper.xml和mapper,java文件同名且在同一目录下。
三、Dao层配置
1、加载配置文件
配置文件 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、加载数据源
3、装载sqlSessionFactory
4、mapper批量扫描
这里就是上面在sqlMapConfig中被替代的Mapper扫描。
需要注意的有以下两点:
- 使用扫描器后不需要在SqlMapperConfig.xml中批量加载mapper了。但是还需要遵循mapper.java和mapper.xml同名且在同一目录下。自动扫描出来的mapper的bean的id为mapper类名(首字母小写) 。
- 这里使用 sqlSessionFactoryBeanName 对应 value="sqlSessionFactory",而不是sqlSessionFactory 对应 ref="sqlSessionFactory",是因为后者会使上面的加载db.properties文件失效,进而导致配置数据源错误。
四、service层配置
这里只需要装载各个service的实现类即可。
五、事务处理&aop
这里主要是配置aop的事务操作
1、配置事务管理器
2、通知配置
3、配置aop
六、springmvc.xml
1、springmvc前端控制器
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
*.action
关于前端控制器mapping的配置,有以下两种:
-
.action或.do,访问以.action结尾由DispatcherServlet进行解析
注:.action或.do只是一个后缀而已,从 struts 延续而来的。
/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
错误方式:/*,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。
附:使用RESTful格式的url时,需要将 url-pattern 配置为 "/" ,但是这种配置与之前的.action方式是可以并存的,即使用/或.action都由DispatcherServlet进行解析。
唯一需要注意的就是解析静态文件,在springmvc配置文件中加入解析静态资源的方法即可:
2、处理器映射器&处理器适配器(非注解型)
配置处理器映射器可分为注解型配置和非注解型配置两类:
处理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
BeanNameUrlHandlerMapping 处理器映射器,会根据请求的url与spring容器中定义的处理器bean的name属性值进行匹配,从而在spring容器中找到处理bean的实例,如下所示:
SimpleUrlHandlerMapping是Spring MVC中适用性最强的Handler Mapping类,允许明确指定URL模式和Handler的映射关系。
itemsController1
itemsController1
注: 多个映射器可以并存,前端控制器判断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中加入下面语句即可:
特别注意:
使用注解的方式来配置,因为Handler中使用了@Controller注解之后,要在springmvc.xml的文件中加载Handler,要关注的是,因为采用注解方式的适配器和映射器,Handler是没有实现任何接口和继承任何类的,所以注解后还需要在配置文件中加载Handler。
加载方式也分为两种,一种是一个个Handler加载进去,另一个是直接用包扫描的方式,Spring会自动把包中所有的Handler进行扫描。以下是两种加载的方式:
- 手动加载Handler,有多少个Handler就要加载多少行
- 扫描的方式自动加载Handler,指定保存Handler的包,SpringMVC会自动加载包中所有的Handler。(推荐使用)
4、视图解析器
Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现,
常用的是InternalResourceViewResolver,这个视图解析器一般会用来 解析JSP视图。
需要注意的是该视图解析器默认使用jstl标签,classpath下得有jstl的包。
还有一个常用功能就是可以在该视图解析器中配置jsp文件的缺省前缀和后缀,方便开发。
springmvc.xml
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"%>
对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中增加如下配置(要注意的是它的位置一定要是第一个执行的过滤器,否则可能不会生效)即可:
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
六、加载spring容器
主要是用来加载spring的ioc容器
web.xml中配置如下:
contextConfigLocation
classpath:spring/applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener
需要注意的是,web.xml 的加载顺序:context-param -> listener -> filter -> servlet,该配置要写在web.xml最上面。