SSM:Spring+SpringMVC+Mybatis
使用注解开发步骤
1.配置web.xml
创建spring-mybatis.xml和spring-mvc.xml,在web.xml配置spring-mybatis.xml,spring-mvc.xml的加载
<!--在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法
在ContextLoaderListener中关联了ContextLoader这个类,所以整个加
载配置过程由ContextLoader来完成。
配置监听器为了加载spring-mybatis.xml配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置SpringMVC初始化参数,加载spring-mvc.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- web容器启动时就实例化DispatcherServlet:
初始化SpringMVC -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- /:不拦截jsp
/*:会拦截jsp -->
<url-pattern>/</url-pattern>
</servlet-mapping>
// 使用Rest风格的URI将页面普通的post请求转为指定的delete或者put请求
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<!--对所有请求拦截-->
<url-pattern>/*</url-pattern>
</filter-mapping>
浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不
支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法使得支持GET、POST、PUT与DELETE请求,该过滤器为HiddenHttpMethodFilter
@RequestMapping映射请求中的method参数实现四种请求方式的调用
在Controller中配置:
@RequestMapping(value="/stu",method=RequestMethod.GET)
@RequestMapping(value="/stu",method=RequestMethod.POST)
@RequestMapping(value="/stu",method=RequestMethod.PUT)
@RequestMapping(value="/stu",method=RequestMethod.DELETE)
将POST请求转化为put请求和delele请求的两种方法
一种是通过表单,通过添加一个隐藏域更改类型
<!-- 发送put请求 -->
<form action="/blogs/1" method="post">
<input type="hidden" name="_method" value="put" >
<input type="submit" value="更新">
</form>
另一种方法是ajax传值
$.ajax({
url:"${APP_PATH}/RecordController/record",
type:"POST",
data:{id :id ,
_method:"PUT/DELETE"
},
success:function(result){
alert("update success");
}
});
指定要使用的字符集,一般我们使用UTF-8
<filter>
<filter-name>EncodingFileter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFileter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如何你的DispatcherServlet拦截".do"这样的有后缀的URL,就不存在访问不到静态资源的问题。
如果DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对.js, *.jpg等静态文件的访问也就被拦截了。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
2.配置spring-mybatis.xml
<!--将Service包下类的创建权交给Spring控制,在类加上spring组
件注解,只需再配置下spring的扫描器就可以实现bean的自动载入
base-package指明一个包:表明service包及其子包中,如果某个类的头上带有特定的注解
@Component,@Repository,@Service,@Controller,就会将这个对象作为Bean注入进spring容器。-->
<context:component-scan base-package="service"></context:component-scan>
在spring的配置文件加载(db.properties)数据库连接参数
<context:property-placeholder location=“classpath:db.properties”/>
这里location值为参数配置文件的位置,参数配置文件通常放在src目录下,而参数配置文件的格式跟java通用的参数配置文件相同,即键
值对的形式,例如:
#jdbc配置
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=1234
<context:property-placeholder location="classpath:db.properties"/>
配置数据源
Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0。可以在Spring配置文件中利用这两者中任何一个配置数据源。
<!--DBCP数据源配置:-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--C3P0数据源配置-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value=" ${jdbc.driverClassName} "/>
<property name="jdbcUrl" value=" ${jdbc.url} "/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"></property>
bean>
SqlSessionFactoryBean用来生成SqlSession
Mybatis的所有操作都是基于一个SqlSession的,而SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。但是Mybatis-Spring是基于SqlSessionFactoryBean的。
SqlSessionFactoryBean,在这个bean里面还是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--SqlSessionFactoryBean的时候,dataSource属性是必须指定的,
它表示用于连接数据库的数据源。-->
<property name="dataSource" ref="dataSource"></property>
<!--typeAliasesPackage:它一般对应我们的实体类所在
的包,这个时候会自动对包中的类起别名。如 User--->user
多个package之间可以用逗号或者分号等来进行分隔。-->
<property name="typeAliasesPackage" value="entity"></property>
</bean>
mapperScanner:配置接口映射。
MapperScannerConfigurer是spring和mybatis整合的mybatis-spring jar包中提供的一个类。
如果数据映射接口很多的话,需要在Spring的配置文件中对数据映射接口做配置,相应的配置项会很多了。为了简化配置,在MyBatis-Spring中提供了一个转换器MapperScannerConfig它可以将接口转换为Spring容器中的Bean,在Service中@Autowired的方法直接注入接口实例。在Spring的配置文件中可以采用以下所示的配置将接口转化为Bean。
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--映射mapper包下的所有接口-->
<property name="basePackage" value="mapper"></property>
</bean>
配置事务管理组件
Spring在jdbc中提供了一个事务管理组件:org.springframework.jdbc.datasource.DataSourceTransactionManager
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入DataSource -->
<property name="dataSource" ref="dataSource"></property>
</bean>
3.配置spring-mvc.xml
<!--<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping
与RequestMappingHandlerAdapter两个Bean,这是SpringMVC为@Controller
分发请求所必需的,并且提供了数据绑定支持,-->
<mvc:annotation-driven />
<!--在开发RESTful架构的URI时,我们都会在web.xml中将前端
控制器的映射请求设置为"/"。关于配置成"/",在 Spring的官方文档中这样描述:
大概意思是默认Servlet的RequestDispatcher 必须通过名称而不是路径来检索。
换句话说就是SpringMVC 将接收到的所有请求都看作是一个普通的请求,包括对
于静态资源的请求。这样以来,所有对于静态资源的请求都会被看作是一个普通
的后台控制器请求,导致请求找不到而报404 异常错误。
在SpringMVC中如果拦截了静态资源的请求,那么这个请求交给Servlet处理-->
<mvc:default-servlet-handler />
<context:component-scan base-package="mycontroller"></context:component-scan>
<!-- 配置视图解析器:InternalResourceViewResolver
prefix:前缀;suffix:后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/myjsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传最大字节数 -->
<property name="maxUploadSize" value="10241024"></property>
<!-- 上传文本文件需要指定编码 -->
<property name="defaultEncoding" value="utf8"></property>
</bean>
常用注解:
@RequestMapping:处理请求地址映射的注解
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,
表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性,下面我们把她分成三类进行说明(下面有相应示例)。
1、 value, method;
value: 指定请求的实际地址,指定的地址可以是URI
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
2、consumes,produces
consumes:指定处理请求的提交内容类型(Content-Type)
例如application/json, text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
如:produces="html/text;charset=utf8"
@RequestParam:用于获取传入参数的值
value:参数的名称
required:定义该传入参数是否必须,默认为true
如果数据是Map必须要加此注解
public String requestParams(@RequestParam(value = "name",required = false) String names){
System.out.println("name = "+names);
return "index";
}
@PathViriable:用于定义路径参数值
value:参数的名称
required:定义传入参数是否为必须值
@RequestMapping(value="/{id}" ,method=RequestMethod.GET)
public String toUpdate(@PathVariable("id")Integer avId,Model model){
AV av = avService.findAVById(avId);
model.addAttribute("av", av);
return "updateAV";
}
@ResponseBody:作用于方法上,可以将整个返回结果以某种格式返回,如json或xml格式。
后端如何接收前端的json数据
@RequestBody
public void receiveJSON(@RequestBody AV av,HttpServletResponse response){
//代码
}
注意:
前端向后端发送JSON数据
一定要指定contentType:"application/json;charset=utf8"
后端如何发送json数据到前端
@ResponseBody:
1.把Java对象序列化为JSON
2.response.getWriter().print(data);
@ResponseBody
public AV sendJSON(AV av){
return av;
}
@ModelAttribute:用于把参数保存到model中
可以注解方法或参数,注解在方法上的时候,该方法将在处理器方法执行之前执行,然后把返回的对象存放在 session。