SpringMVC的跳转方式和处理提交数据

449 阅读3分钟

一、在之前的servlet API的跳转

  • 1、通过HttpServletResponse进行输出
    response.getWriter().println(“Hello,Spring BY servlet API”);

  • 2、通过HttpServletResponse实现重定向
    response.sendRedirect("/index.jsp");

  • 3、通过HttpServletResponse实现转发
    request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request,response);

二、SpringMVC的原理使用ModelAndView

设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .

页面 : {视图解析器前缀} + viewName +{视图解析器后缀}

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

public class ControllerTest1 implements Controller {

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       //返回一个模型视图对象
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","ControllerTest1");
       mv.setViewName("test");
       return mv;
  }
}
12345678910

三、SpringMVC注解使用跳转

1、没有设置视图解析器的情况下
在这里插入图片描述

具体应该 返回forward:/WEB-INF/jsp/hello.jsp

return 默认返回是转发,可以省略 forward:

package com.kai.controller;

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

@Controller
public class RedirectController {

    //1.没有视图解析器:
    @RequestMapping("/forward")
    public String forward(Model model){
        model.addAttribute("msg","无视图解析器-转发");
        return "/WEB-INF/jsp/hello.jsp";
    }
}

1234567891011121314151617

2、设置了视图解析器的情况下

重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题。所以有无视图解析器都用以下方式进行跳转。

    //2.有视图解析器:
    @RequestMapping("/forward2")
    public String forward2(Model model){
        model.addAttribute("msg","视图解析器-转发");
        return "hello";
    }

    //3.重定向不会触发视图解析器
    @RequestMapping("/redirect")
    public String redirect(Model model){

        //重定向会直接跳转到web/index.jsp
        return "redirect:/index.jsp";
    }
1234567891011121314

四、处理提交数据

1、第一种方式

访问地址为:http://localhost:8080/Mvc\_annotation/data1?username=kaikai

@RequestParam(“username”)注解就是解决:接收前端传来参数名和自己定义的参数名不一致的问题,username 就是前端传来的参数名。
一般开发过程中看到这个注解就能清楚的知道这个参数是前端传来的

package com.kai.controller;

import com.kai.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

//数据回显到前端
@Controller
public class DataController {
    @GetMapping("/data1")
    public String data1(@RequestParam("username")String name, Model model){
        System.out.println(name);
        model.addAttribute("msg",name);
        return "hello";
    }
}

12345678910111213141516171819

在这里插入图片描述

2、第二种方式

访问地址:http://localhost:8080/Mvc\_annotation/data2?id=1&name=kai&psw=kai

前端传来多个参数时候如 id,name,psw
如果这个请求方法中的参数是一个类(User),它会根据前端传来的参数名(id,name,psw)进行封装成这个类

User类中的属性就是 int id ,String name ,String psw;

    @GetMapping("/data2")
    public String data2(User user, Model model){
        System.out.println(user);
        model.addAttribute("msg",user);
        return "hello";
    }
123456

在这里插入图片描述
3、其他方式

还有两种方式ModelMap 和 ModelAndView :

  • Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

  • ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

  • ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

总结:

感谢大家阅读完本文章,也为大家准备了Java进阶的架构资料,需要的朋友可以关注微信公众号【Java程序员聚集地】获取架构资料。