SpringMVC结果跳转方式

SpringMVC结果跳转方式

上节研究了使用 REST 风格发起请求,这节来研究一下 Controller 如何跳转对对应的视图!还是使用 Spring-05-REST 项目(都是重复配置,还不如多写几个 Controller,反正内容不多)!

1. ModelAndView

刚开始学习时用的方式,仅限研究执行过程使用,一般都不用的啦。

编写 ControllerMAV 类实现 Controller 接口(需要 org.springframework.web.servlet.mvc.Controller 的包,和注解 Controller 的包不是同一个)

public class ControllerMAV implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        // 获取本次会话的 Session
        HttpSession session = httpServletRequest.getSession();
        String id = session.getId();
        // 放信息,设视图
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg",id);
        mv.setViewName("test");

        return mv;
    }
}

通过 ModelAndView 的 setViewName 方法设置返回的视图名字,再返回这个 mv 对象,视图解析器解析其中的视图名字。

使用这种方式不要忘记配置 bean

<bean id="/testmav" class="com.qiyuan.controller.ControllerMAV"/>

运行测试,成功输出 SessionID!不过好麻烦,就当小复习一下了!

2. Model

这就是使用注解后的方式了!

编写 ControllerM 类,添加 @Controller 注解

@Controller
public class ControllerM {
    @RequestMapping("/testm")
    public String TestM(Model model, HttpServletRequest req, HttpServletResponse resp){
        // 获取本次会话的 Session
        HttpSession session = req.getSession();
        String id = session.getId();
        // 放信息
        model.addAttribute("msg",id);
        return "test";
    }
}

这里用到了 req 和 resp,说明它们是存在的!要用的话就当参数传进来就好了;Model 参数不用多说,放信息的嘛。

通过直接返回 String 字符串设置要跳转的视图,这个 String 字符串就是视图名字。

运行测试,也成功输出 SessionID,简单,舒服!

3. ServletAPI

既然有 req 和 resp,那就肯定能用它们的方法,当然也可以用原生 API 进行转发重定向了!这种方式就不需要视图解析器了!

复习一下转发和重定向的区别:

  • 转发是服务器内部行为,用户只发起一次请求
  • 重定向是服务器返回另一请求给用户,用户发起二次请求

编写 ControllerSAPI 类,添加 @Controller 注解

@Controller
public class ControllerSAPI {
    
    @RequestMapping("/testsapi/forward")
    public void TestF(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 用原生 API 当然需要这两个参数了
        req.setAttribute("msg","转发啦");
        req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
    }

    @RequestMapping("/testsapi/redirect")
    public void TestR(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 用原生 API 当然需要这两个参数了
        req.setAttribute("msg","重定向啦");
        // 重定向就访问不了被保护的 WEB-INF 目录了!!!
        // 由客户端发起二次请求,要带上项目路径!!!
        resp.sendRedirect(req.getServletContext().getContextPath()+"/index.jsp");
    }
}

再复习一下,转发会直接在当前项目路径下寻找,而重定向由用户再次发起请求,所以路径要是完整的!

运行测试,跳转都成功!这种方式的跳转就没有经过视图解析器了,完全是 Servlet 实现的(没人会这么干吧)!

4. SpringMVC

用 SpringMVC 的方式实现一下 ServletAPI 做的转发和重定向,也是不需要视图解析器的(直接一步到位了,当然只是演示用)!

编写 ControllerSMVC 类,添加 @Controller 注解

@Controller
public class ControllerSMVC {

    @RequestMapping("/testsmvc/forward")
    public String TestF(Model model){
        model.addAttribute("msg","Qiyuan转发!");
        // 转发
        // 没有视图解析器当然要手动拼接辽
        return "forward:/WEB-INF/jsp/test.jsp";
    }

    @RequestMapping("/testsmvc/redirect")
    public String TestM(Model model){
        model.addAttribute("msg","Qiyuan重定向!");
        // 重定向
        // 这里和直接用 Servlet 不一样!SpringMVC 会自动补上项目路径!
        return "redirect:/index.jsp";
    }
}

运行测试,跳转成功!主要是通过返回的字符串中的 forward 和 redirect 关键字实现的!

转发没什么好说的,重定向比 Servlet 智能多了,会自动加上项目路径!

5. 总结

没什么好总结的,就是盘点一下结果跳转的方式!用的最多的还是3,偶尔用用5!也就这样了??。

SpringMVC结果跳转方式

上一篇:Unity动画系统基础总结


下一篇:Java线程的生命周期