springmvc 学习(四) 页面跳转和数据处理

视图解析器解析后的跳转的方式:前缀+controller返回值+后缀

试图解析器的bean注册,以及前后缀定义方法如下:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

 

第一种跳转方式 :使用注解,使用了@Controller,方法返回的字符串会直接被前端控制前转发给视图解析器解析

当返回值包含特殊字符串:redirect:和 forward:,会进行特殊处理,如下:直接跳转这两个后面的地址index.jsp,而不通过解析器里的拼接

当没有解析到特殊字符串时,默认走的是转发形式,因为转发可以携带参数

@Controller
public class hellocontroller {
@RequestMapping("/h1")
public String hello(Model model){
model.addAttribute("msg","go!");
return "hello";
}
  @RequestMapping("/h5")
    public String hello5(Model model){
        model.addAttribute("msg","go!go5");
        return "redirect:index.jsp";
    }
    @RequestMapping("/h6")
    public String hello6(Model model){
        model.addAttribute("msg","go!go6");
        return "forward:index.jsp";
    }

第二种方式:实现Controller接口:这时候通过setViewName方法,给modelAndView对象set一个值,并返回modelAndView本身,也会进行视图拼接。如下

public class hellocontroller implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","springmvcCool!");
        modelAndView.setViewName("hello");
        return modelAndView;
    }
}

第三种方式:不通过视图解析器方式,而是使用前面学过的request,response方法,这些参数时前端控制器传过来,可以在方法里使用,如下:

不过这种方法用得少

    @RequestMapping("/h7")
    public void hello7( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("msg", "go!go7");
        req.getRequestDispatcher("WEB-INF/jsp/hello.jsp").forward(req,resp);
    }

 

数据处理:

首先前端数据的获取:

通过方法的参数可以直接获取,如下:

当前端传过来的参数和方式参数不一样时,无法匹配,这时候可以使用 @RequestParam 注解进行指定参数的名字

当使用了这个参数。表明必须要有这个参数,不然会请求会报错,也给出了限制!

 

    @PostMapping("/h9")
    public String hello9(String name,Model model) {
        model.addAttribute("msg",name);
        return "hello";
    }

  @GetMapping("/h9")
  public String hello9(@RequestParam("username") String name,Model model) {
      model.addAttribute("msg",name);
      return "hello";
  }

测试结果如下:

springmvc 学习(四) 页面跳转和数据处理  springmvc 学习(四) 页面跳转和数据处理

 

 

当接受程序的参数是一个对象时,这是spring会自动将前端的参数,和这个对象的属性值进行一一匹对,没有对应的值会为null或者0

 

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

 

测试结果:

springmvc 学习(四) 页面跳转和数据处理

 

后端数据转发前端:

 

第一种 : 通过ModelAndView 如下:通过 modelAndView.addObject

public class hellocontroller implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","springmvcCool!");
        modelAndView.setViewName("hello");
        return modelAndView;
    }
}

第二种 : 通过ModelMap 相当于req.setAttribute("name",name);

    @GetMapping("/h8")
    public String hello8(User user,ModelMap model) {
        System.out.println(user);
        model.addAttribute("msg",user);
        return "hello";
    }

第三种 : 通过Model 相当于req.setAttribute("name",name);

 

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

对比

 

就对于新手而言简单来说使用区别就是:

 

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

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

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

 

 

 

 

 

springmvc 学习(四) 页面跳转和数据处理

上一篇:java流程控制:选择结构


下一篇:MapReduce源码分析总结(转)