SpringMVC(二)

SpringMVC(二)

SpringMVC执行原理

  1. DispatcherServlet表示前端控制器,用户发出请求,DispatcherServlet拦截并接收请求
  2. HandlerMapping为处理器映射,由DispatcherServlet调用,根据请求url查找Handler
  3. HandlerExecution表示具体的Handler,根据url查找Controller
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等
  5. HandlerAdapter表示处理器适配器,按照特定的规则取执行Handler
  6. Handler让具体的Controller执行
  7. Controller让具体的执行信息返回给HandlerAdapter,如ModelAndView
  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
  9. DispatcherServlet调用ViewResolver视图解析器来解析HandlerAdapter传递的逻辑视图名
  10. ViewResolver将解析的逻辑视图名传给DispatcherServlet
  11. DispatcherServlet根据ViewResolver解析的视图结果,调用具体的视图
  12. 最终视图呈现给用户

使用注解开发

  • 在Spring配置文件中增加注解驱动
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--自动扫描包,让指定包下的注解生效-->
    <context:component-scan base-package="com.yhr.controller"/>
    <!--让Spring MVC不处理静态资源-->
    <mvc:default-servlet-handler/>
    <!--支持MVC注解驱动,自动完成DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter的注册-->
    <mvc:annotation-driven/>

    <!--添加视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
  • 使用注解开发Controller
//控制器注解
@Controller
@RequestMapping("/hello")
public class HelloController {
    //访问地址:localhost:8080/hello/h1
    @RequestMapping("/h1")
    public String hello(Model model) {
        //封装数据
        model.addAttribute("msg", "HelloSpringMVCAnnotation");
        //返回视图
        return "hello";
    }
}

RESTful风格

  • RESTful是一个资源定位及资源操作的风格,可以让软件更简洁,更有层次,更易于实现缓存等机制

  • 功能:

    • 资源:互联网所有的事物都可以被抽象为资源
    • 资源操作:POST、DELETE、PUT、GET
  • 使用RESTful操作资源,可以通过不同的请求方式来实现不同的效果

简单实现

@Controller
public class RestFulController {
    //原来:http://localhost:8080/add?a=1&b=2
    //RESTful风格:http://localhost:8080/add/a/b
    @RequestMapping("/add/{a}/{b}")
    public String test1(@PathVariable int a, @PathVariable int b, Model model) {
        int res = a + b;
        model.addAttribute("msg", "结果为" + res);
        return "hello";
    }
}

处理不同的请求方式

  • 在@RequestMapping中加参数
@RequestMapping(value = "/add/{a}/{b}", method = RequestMethod.GET)
  • 使用对应的注解:@GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping

结果跳转方式

  • 无需视图解析器:

    • 转发:return "/index.jsp"
    • 显式转发:return "forward:/index.jsp"
    • 重定向:return "redirect:/index.jsp"
  • 有视图解析器:重定向不变,转发按照解析器的规则写

接收请求参数及数据回显

接收参数

  • 提交的域名和处理方法的参数名一致时会自动处理
  • 提交的域名和处理方法的参数名不一致时,使用@RequestParam("name")修饰参数
  • 提交的是对象时,参数为实体类

数据显示

  • Model:简化的存储数据
  • ModelMap:继承了LinkedMap
  • ModelAndView:可以设置返回的逻辑视图,实现控制视图层的跳转

中文乱码

  • 在web.xml中配置SpringMVC的过滤器
<filter>
    <filter-name>encoding</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>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

JSON

  • JSON(JavaScript Object Notation)是一种轻量级的数据交换格式
  • 采用完全独立于编程语言的纯文本格式来存储和表示数据

语法格式

  • 对象表示为键值对,数据由逗号分隔
  • 花括号保存对象,方括号保存数组
{"name": "yhr", "age": "3", "sex": "男"}

JSON和JavaScript对象

var obj = {a: 'Hello', b: 'World'};
var json = '{"a": "Hello", "b": "World"}'
  • JSON转js对象
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
  • js对象转JSON
var json = JSON.stringify({a: 'Hello', b: 'World'});

Controller返回JSON数据

Jackson

  • 导入依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.1</version>
</dependency>
  • 使用ObjectMapper中的writeValueAsString方法
@ResponseBody//不经过视图解析器,直接返回字符串
@RequestMapping(value = "/j1", produces = "application/json;charset=utf-8")
public String json1() throws JsonProcessingException {
    User user = new User("yhr", 3, "男");
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(user);
}
  • 其中@RequestMapping的produces属性可以避免乱码
  • 也可以在Spring中配置来防止乱码
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg value="UTF-8"/>
        </bean>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                    <property name="failOnEmptyBeans" value="false"/>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
  • @ResponseBody也可以和@Controller合并为@RestController来修饰类

FastJson

  • 导入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.75</version>
</dependency>
  • fastjson有三个主要的类:
    • JSONObject代表json对象
    • JSONArray代表json对象数组
    • JSON代表JSONObject和JSONArray的转化
  • 常用方法:
    • JSON.toJSONString:Java对象转JSON字符串
    • JSON.parseObject:JSON字符串转Java对象
    • JSON.toJSON:Java对象转JSON对象
    • JSON.toJavaObject:JSON对象转Java对象
posted @ 2021-02-05 17:40  一天到晚睡觉的鱼  阅读(75)  评论(0)    收藏  举报