美文网首页
126、【JavaEE】【SpringMVC】SpringMVC

126、【JavaEE】【SpringMVC】SpringMVC

作者: yscyber | 来源:发表于2021-10-29 23:45 被阅读0次

    1、响应的本质

    2、Spring MVC 支持的响应的种类

    • 大致上分为两类:一类是“页面”即响应的最终效果(客户端看到的)是“页面跳转”、另一类是“数据”。

    • Spring MVC 中实现响应为“页面(页面跳转)”的方案有:
      1、Controller 中的方法返回值为java.lang.String,返回“逻辑视图名”(请求转发、请求重定向均可)。
      2、使用原生的 Servlet API 实现(请求转发、请求重定向均可)。
      3、Controller 中的方法返回值为org.springframework.web.servlet.ModelAndView,在 ModelAndView 的对象中设置“逻辑视图名”以及需要在视图中渲染的数据(虽然 ModelAndView 也可以支持“请求重定向”,但是因为其可以“携带数据”,所以多数情况下,ModelAndView 为“请求转发”)。

    • Spring MVC 中实现响应为“数据”的方案有:
      1、纯字符串(不常用)
      2、JSON(常用)

    3、页面响应

    3.1、返回字符串(逻辑视图名)

    • 访问http://localhost:8080/web4/jsp/one,响应给客户端的是经过“视图解析器”处理的 JSP 页面。
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    
    
    @Controller
    public class MyRequestController {
    
        @GetMapping("/jsp/one")
        public String pageResponse() {
            return "one"; // 请求转发
        }
    
    }
    
    • 请求转发与请求重定向:
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    
    
    @Controller
    public class MyRequestController {
    
        @GetMapping("/jsp/one")
        public String pageResponse() {
            return "forward:one"; // 请求转发
        }
    
    }
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    
    
    @Controller
    public class MyRequestController {
    
        @GetMapping("/jsp/one")
        public String pageResponse() {
            return "redirect:one"; // 请求重定向
        }
    
    }
    

    3.2、ModelAndView

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    
    @Controller
    public class MyRequestController {
    
        @GetMapping("/jsp/one")
        public ModelAndView pageResponse() {
            ModelAndView modelAndView = new ModelAndView(); // 方法体中 new 一个 ModelAndView 对象
    
            modelAndView.setViewName("one"); // /one.jsp
            modelAndView.addObject("name", "Jack");
    
            return modelAndView;
        }
    
    }
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    
    @Controller
    public class MyRequestController {
    
        @GetMapping("/jsp/one")
        public ModelAndView pageResponse(ModelAndView modelAndView) {
    // 方法参数中的 ModelAndView 类型可以直接使用
            modelAndView.setViewName("one"); // /one.jsp
            modelAndView.addObject("name", "Jack");
    
            return modelAndView;
        }
    
    }
    
    • @SessionAttributes 注解:ModelAndView 中的数据,默认是在 Request 域中,如果希望将放入 ModelAndView 对象中的数据也放入 Session 域中,当然可以使用原生 Servlet API,Spring MVC 提供了@SessionAttributes注解,在将数据放入 ModelAndView 的同时,也放入 Session 域中。
    SpringMVC-10

    4、数据响应

    4.1、JSON

    4.1.1 @ResponseBody
    • 该注解可以使用在 Controller 的类上,也可以使用在其中的方法上。

    • 该注解的含义是,将方法的返回值写入 HTTP 响应报文的报文主体中。

    • 在 Jackson 依赖和在配置文件中配置<mvc:annotation-driven/>,两者配合下,方法的返回值如果是对象的话,会自动转化为 JSON 字符串写入 HTTP 响应报文主体中。

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @ToString
    public class User {
    
        private Integer id;
    
        private String name;
    
    }
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @ResponseBody
    public class MyRequestController {
    
        @GetMapping("/json/data")
        // @ResponseBody
        public User jsonResponse() {
            return new User(1, "张三");
        }
    
    }
    
    SpringMVC-9
    4.1.2、@RestController
    • 该注解相当于 @Controller 与 @ResponseBody 联合,使用在类上。

    相关文章

      网友评论

          本文标题:126、【JavaEE】【SpringMVC】SpringMVC

          本文链接:https://www.haomeiwen.com/subject/kagvaltx.html