[TOC]
springMVC基础知识
- 使用步骤
- Maven中增加spring-webmvc依赖
- web.xml配置DispatcherServlet
- DispatcherServlet是Spring mvc最核心的对象,用于拦截Http请求,并根据请求的URL调用与之对应的Controller方法来完成Http请求处理;
- 注意点:配置load-on-startup为0,表示在Web应用启动时自动创建Spring IOC容器,并初始化DispatcherServlet对象
- 如果忘记配置该配置项,spring ioc容器也可以正常启动和运行,只是启动的时机是web容器启动后的第一个请求到来的时候完成spring ioc容器的启动和初始化工作;
```xml
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:applicationContext.xml 0
- 如果忘记配置该配置项,spring ioc容器也可以正常启动和运行,只是启动的时机是web容器启动后的第一个请求到来的时候完成spring ioc容器的启动和初始化工作;
```xml
- 配置applicationContext.xml的mvc标记
- 常用注解
- [@Controller ](/Controller )
- [@RequestMapping ](/RequestMapping )
- [@PostMapping ](/PostMapping )
- [@GetMapping ](/GetMapping )
- [@RequestParam ](/RequestParam )
- @ResponseBody:直接向响应输出字符串数据,不跳转页面
- 方法接受参数
- 利用属组或List接受请求中的复合参数
- 使用List接收请求参数,一定要在参数前面加上@RequestParam注解,告知springmvc框架请求参数中的复合数据需要被转换成List对象接收,如果不写该参数则会接收失败;
- 利用@RequestParam为参数设置默认值
- 请求参数默认值设置:@RequestParam(value="varName",defaultValue="hello")
- 利用Map对象接收请求参数和注意事项
- Map接收数据的时候,如果接收的数据中有复合数据,则默认接收复合数据的第一个元素。例如:一个表单中存在一个多选按钮的情况,多选按钮对应的值就是一个复合数据,使用Map接收就会存在问题;
- 关联对象赋值
- 关联对象赋值,需要在表单中带上后端**_关联对象变量标识符的前缀_**
```java
class User {
private String name;
private String password;
private IdCard idCard = new IdCard();
// get和set方法省略
}
class IdCard {
private String idNum;
private String area;
private String expaire;
}
/**
* 前端表单书写方式
<input name="name">
<input name="password">
<input name="idCard.idNum">
<input name="idCard.area">
<input name="idCard.expaire">
*/
- 日期对象接收和类型转换
- 在接收请求的controller的参数前加上的注解:@DateTimeFormat(pattern=”yyyy-MM-dd”);
- 如果使用Javabean接收请求参数,则只需要在Javabean对象定义中对应的属性上加上@DateTimeFormat注解即可;
- 如果在代码中有需要多个地方需要设置统一的日期格式,不可能在每一个需要的地方都加上注解配置,此时就可以定义转换器类(convert),springMVC中定义转换器类需要实现com.org.springframework.core.convert.converter.Converter类,覆写convert方法 ```java import com.org.springframework.core.convert.converter.Converter; import java.util.Date
public class MyConverter implements Converter
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.mvc" />
<!-- 启用Spring MVC的注解开发模式 -->
<mvc:annotation-driven conversion-service="conversionService" />
<!-- 将图片、JS、CSS等静态资源排除在外,提高执行效率 -->
<mvc:default-servlet-handler />
<!-- 配置告知springMVC后面转换器类的存在,且日期类型的参数都会使用此转换器转换 -->
<bean id="conversionService" class="org.springframework.format.xxxxxxxx">
<propertype name="converters">
<set>
<bean class="xxx.xxx.xxx(自定义转换类的全限定类名)" />
</set>
</propertype>
</bean>
</beans>
- 注意:如果在项目中既使用了转换器,又使用了@DateTimeFormat注解,则spring的处理逻辑是以转换器的转换规则处理;
- 中文乱码问题
- get请求乱码:在server.xml文件中增加URIEncoding属性(Tomcat8.0以后的版本模式就是utf-8编码);
- post请求乱码:web.xml配置CharacterEncodingFilter;
- response响应乱码:spring配置StringHttpMessageConverter;
- springmvc跳转页面:ModelAndView
- mad.addObject()方法设置的属性默认存放在当前请求中;
- 使用请求转发(forward)至页面;
- 页面重定向:new ModelAndView("redirect:index.jsp")
restful开发风格
- rest:表现层状态转移,资源在网络中以某种表现形式进行状态转移
- restful是基于rest理念的一套开风格,是具体的开发规则
- restful开发规范:
- 使用URL作为用户交互入口;
- 明确的语义规范(GET|POST|HEAD|DELETE);
- 只返回数据(json|xml),不包含任何展现;
注意事项
- @ResponseBody注解告知控制器方法返回不跳转页面,直接以字符串内容输出;如果在开发的每一个restful方法上增加该注解就比较冗余,可以使用简化该操作的注解@RestfulController在类上添加,就可以完成一样的功能;
- 路径参数值获取
- 例如:POST /request/article/1
@PostMapping("request/article/{id}") public String request(@PathVariable("id") Integer id) { // do something }
- 例如:POST /request/article/1
简单请求和非简单请求
- 简单请求:标准结构的HTTP请求,对应POST和GET请求;
- 非简单请求:只复杂要求的HTTP请求,指PUT/DELETE请求、扩展的标准请求;
- 两者最大的区别:非简单请求发送前需要发送预检请求
- 注意:springmvc默认是无法按照POST方式接收PUT/DELETE请求参数,如果要接收,则需要在配置文件中增加filter过滤器;
<filter> <filter-name>formContentFilter</filter-name> <filter-class>org.springframework.web.filter.FormContentFilter</filter-class> </filter> <filter-mapping> <filter-name>formContentFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
浏览器的同源策略
- 同源策略阻止从一个域加载的脚本去获取另一个域上的资源;
- 只要协议、域名、端口有任何一个不同,都被当做是不同的域;
- 浏览器的console中如果出现Access-Control-Allow-Origin就代表跨域了
- 二级域名也是跨域;localhost和127.0.0.1也是跨域访问;
- HTML标签中允许跨域的标签
:显示远程图片