[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

springmvc /


   - 配置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 { @Override public Date convert(String date) { SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd”); try { return format.parse(date); } catch (ParseException e) { return null; } } }

```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
          }
          
    • 简单请求和非简单请求

      • 简单请求:标准结构的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标签中允许跨域的标签
        • SpringMVC - 图1:显示远程图片