SSM系列——SpringMVC组件解析,数据响应day3-2

181 篇文章 3 订阅
24 篇文章 2 订阅

SpringMVC组件解析

执行流程

在这里插入图片描述

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter处理器适配器。
  5. HandlerAdapter经过适配调用具体的处理器(Controller, 也叫后端控制器)
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet.
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet根据View进行渲染视图 (即将模型数据填充至视图中)DispatcherServlet响应用户

默认配置(DispatchServlet)

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
	org.springframework.web.servlet.function.support.RouterFunctionMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
	org.springframework.web.servlet.function.support.HandlerFunctionAdapter


org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

SpringMVC数据响应

页面跳转

1.返回字符串形式

将返回的字符串与视图解析器的前后缀拼接后进行页面跳转
分为:forward(默认)请求转发和 redirect 重定向
在这里插入图片描述

对应关系

在这里插入图片描述

BaseController
package com.example.mvc1.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class BaseController {

    @RequestMapping("/test")
    public String test(){
        System.out.println("first test....");
        return "redirect:test";
    }
}

spring-mvc.xml
<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--    controller的组件扫描-->
    <context:component-scan base-package="com.example.mvc1.controller"></context:component-scan>
    
<!--    <context:component-scan base-package="com">-->
<!--&lt;!&ndash;        包括的过滤器&ndash;&gt;-->
<!--        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
<!--&lt;!&ndash;        不包括的过滤器&ndash;&gt;-->
<!--        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
<!--    </context:component-scan>-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--        设置前缀-->
        <property name="prefix" value="/WEB-INF/html/"></property>
<!--        设置后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

2.ModelAndView,返回模型和视图

方法

在ModelAndView中可以设置模型数据,设置视图名称等

addObject()设置数据

语法

ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject(key,value);
--------------------------------------------------
modelAndView.addObject("user","zhangsan");

然后我们只要在jsp页面中用$表达式进行接收key即可展现对应的value

setViewName()设置页面名称

语法

ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName(页面名称);
-----------------------------------------------
modelAndView.setViewName("page");

当然设置的页面名称是可以结合之前xml中设置的前缀和后缀进行拼合的!

目录

在这里插入图片描述

BaseController

以new对象的方式

package com.example.mvc1.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class BaseController {

    @RequestMapping("/test2")
    public ModelAndView test2(){
        //Model用于封装数据,View用于展示数据
        ModelAndView modelAndView = new ModelAndView();
        //设置视图名称
        modelAndView.setViewName("test2");
        return modelAndView;
    }
}

以容器注入的方式让Spring自动创建

    @RequestMapping("/test3")
    public ModelAndView test3(ModelAndView modelAndView){
        modelAndView.setViewName("test3");
        return modelAndView;
    }
spring-mvc.xml和1中一样
当然你得有test2.jsp这个页面
结果

在这里插入图片描述


回写数据

  1. 通过SpringMVC框架注入的response对象,使用response.getWriter().print( "data" ) 回写数据,此时不需要视图跳转,业务方法返回值为void
  2. 使用@ResponseBody注解,方法使用String型直接回写数据

response对象的回写数据

package com.example.mvc1.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RestController
public class DataController {

    @GetMapping("/data")
    public void test1(HttpServletResponse response) throws IOException {
        response.getWriter().println("data feedback");
    }
}

在这里插入图片描述

以@ResponseBody注解配合String形式直接返回

package com.example.mvc1.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RestController
public class DataController {

    @GetMapping("/data2")
    @ResponseBody
    public String test2(){
        return "data2 feedback" ;
    }
}

在这里插入图片描述

借助Jackson将回写数据转换为json格式

添加pom依赖
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.13.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.13.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.2.2</version>
        </dependency>
DataController
package com.example.mvc1.controller;

import com.example.mvc1.pojo.DataPojo;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;

@RestController
public class DataController {

    @GetMapping("/data3")
    @ResponseBody
    public String test3() throws JsonProcessingException {
        DataPojo dataPojo = new DataPojo();
        dataPojo.setId(1);
        dataPojo.setName("zhangsan");
        ObjectMapper objectMapper = new ObjectMapper();
        String feedback = objectMapper.writeValueAsString(dataPojo);
        return feedback;
    }
}

在这里插入图片描述

配置处理器映射器让SpringMVC直接转成json格式(重要)

spring-mvc.xml
解释

我们需要配置RequestMappingHandlerAdapter
指定setMessageConverters方法中传入的参数list为MappingJackson2HttpMessageConverter即可让sprringMVC帮助我们直接将对象转为json
下面是MessageConverters的set方法

public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        this.messageConverters = messageConverters;
    }
xml
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters" >
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
            </list>
        </property>
    </bean>
DataController
@GetMapping("/data4")
    @ResponseBody
    public DataPojo test4() {
        DataPojo dataPojo = new DataPojo();
        dataPojo.setId(2);
        dataPojo.setName("lisi");
        return dataPojo;
    }

在这里插入图片描述

使用mvc注解驱动改写处理器映射器配置(建议使用,重要!)

简化上方的配置处理器映射器让SpringMVC直接转成json格式中对xml进行的配置
我们可以使用mvc注解驱动的方式进行代替

 <mvc:annotation-driven></mvc:annotation-driven>

在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。

使用mvc:annotation-driven自动加载RequestMappingHandlerMapping (处理映射器)和RequestMappingHandlerAdapter (处理适配器),可用在Spring-xml.xm配置文件中使用mvc:annotation-driven昔代注解处理器和适配器的配置。

同时使用<mvc.annotation- driven>默认底层就会集成ackson进行对象或集合的json格式字符串的转换

加入mvc命名空间

在这里插入图片描述

<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd  http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <!--    controller的组件扫描-->
    <context:component-scan base-package="com.example.mvc1.controller"></context:component-scan>

    <mvc:annotation-driven></mvc:annotation-driven>
    <!--    <context:component-scan base-package="com">-->
</beans>
DataController
package com.example.mvc1.controller;

import com.example.mvc1.pojo.DataPojo;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;

@RestController
public class DataController {

    @GetMapping("/data4")
    @ResponseBody
    public DataPojo test4() {
        DataPojo dataPojo = new DataPojo();
        dataPojo.setId(2);
        dataPojo.setName("lisi");
        return dataPojo;
    }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值