飞道的博客

【04】SpringMVC--响应类型

466人阅读  评论(0)

【04】SpringMVC笔记–响应类型

一、响应类型:

  1. String

说明:比如响应了一个字符串“success”。那么MVC框架就会根据配置的视图解析器寻找到对应的jsp文件,然后进行跳转。

这里跳转到了WEB-INF/pages/目录下的"success.jsp"

springmvc.xml配置的视图解析器

<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
</bean>

Controller类

@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 测试返回值为String类型
     * @param model
     * @return
     */
    @RequestMapping("testReturnString")
    public String testReturnString(Model model){

        System.out.println("testReturnString()执行了...");

        //模拟查询用户成功,并返回一个success字符串
        User user = new User();
        user.setAge(12);
        user.setName("Yang99");
        user.setPassword("99001");

        //存到request域中,借用Model对象的方法
        model.addAttribute("user",user);
        return "success";
    }
}
  1. void

无返回类型

  • 会跳转到以该方法名为名的.jsp文件。例如 访问方法testVoid ===>默认响应跳转到testVoid.jsp
  • 或使用原生Servlet api进行
    • 转发
    • 重定向
    • 直接响应输出流
@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 测试无返回值:void
     *      默认:会跳转到以该方法名为名的.jsp文件。例如   访问方法testVoid ===>默认响应跳转到testVoid.jsp
     *      其他:
     *          手动:1. 转发
     *               2. 重定向
     *               3. 直接响应输出流
     */
    @RequestMapping("testReturnVoid")
    public void testReturnVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{

        System.out.println("testReturnVoid()执行了...");

        //转发
        //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);

        //重定向  ---不可访问WEB-INF目录
        response.sendRedirect(request.getContextPath()+"/index.jsp");

        //输出流
        //response.getWriter().write("helloWorld!!!");
    }
}

  1. ModelAndView

ModelAndView对象。是SpringMVC提供的一个对象。里面可以封装需要返回的对象与视图名称

  • addObject()方法,底层是存到了request域中
  • setViewName(),设置跳转视图名称(上面直接返回字符串进行跳转的,底层就是在使用这个方法
@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 测试返回ModelAndView
     * @return
     */
    @RequestMapping("testModelAndView")
    public ModelAndView testModelAndView(){

        System.out.println("testModelAndView()执行了...");

        //创建ModelAndView对象
        ModelAndView mv = new ModelAndView();

        //模拟查询用户成功,并返回一个success字符串
        User user = new User();
        user.setAge(121);
        user.setName("Yang222");
        user.setPassword("111101");

        //存到request域中,使用ModelAndView的方法
        mv.addObject("user",user);

        //设置跳转页面
        mv.setViewName("success");

        //注:手动返回"success",底层也是使用ModelAndView对象 ,也是使用视图解析器
        return mv;
    }
}

二、转发与重定向

SpringMVC提供的方式:根据返回的字符串关键字进行转发,或重定向

  • 转发:"forward:"+跳转页面路径
  • 重定向:"redirect:"+跳转页面路径
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("testForwardOrRedirect")
    public String testForwardOrRedirect(Model model){

        System.out.println("testForwardOrRedirect()执行了...");

        //转发
        //return "forward:/WEB-INF/pages/success.jsp";

        //重定向
        return "redirect:/index.jsp";
    }
    }
}

三、接收与响应json数据

  1. 前端表单异步提交一个json数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>

    <script src="js/jquery.min.js" type="text/javascript"></script>

   <script>
        $(function () {
          	
            //异步提交表单
            $("#login_form").submit(function () {

              	//....
             	//把表单数据转为json
                var formObject = {};
                var formArray =$(this).serializeArray();
                $.each(formArray,function(i,item){
                    formObject[item.name] = item.value;
                });

                $.ajax({
                    url: '${pageContext.request.contextPath}/fore/userLogin',
                    type: 'POST',
                    contentType: 'application/json; charset=UTF-8',
                    async: false,
                    dataType: 'json',
                    data: JSON.stringify(formObject),
                    success: function (info) {
                        if (!info.flag) {
                            $("#check_error").html(info.info);
                        } else {
                            // alert("登录成功");
                            location.href = "${pageContext.request.contextPath}/fore/home";
                        }
                    }
                });

                return false;
            });
        });
    </script>

</head>
<body>

<form action="#" method="post" id="login_form">
         <!-- 表单字段...-->       
</form>

</body>
</html>

  1. 如果提交的键值对的键和某个JavaBean的属性名相同。可以在控制器方法参数提供该Bean对象接收json数据
  2. 如果需要返回的数据也是json,需要在添加相关jar包。(使用的maven工程,所以添加如下依赖
<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>
  1. Controller
/**
     * 模拟异步请求响应
     * 接受的Json数据会被直接封装到User对象中,由于我们引入了json的jar包。
     * mvc框架会自动将对象转换为json返回。
     * 我们只需返回User对象即可。
     */
    @RequestMapping("/testAjax")
    public @ResponseBody
    User testAjax(@RequestBody User user){
        System.out.println("testAjax方法执行了...");
        // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);
        // 做响应,模拟查询数据库
        user.setName("Yangx");
        user.setAge(21);
        // 做响应,spirngMVC框架会自动将其转换为json数据,然后返回给浏览器
        return user;
    }

转载:https://blog.csdn.net/qq_42701294/article/details/104790031
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场