在讲 结果跳转方式之前,我们先来 讲一个 大家可能很感兴趣的一个事。就是 我们能不能 在 SpringMVC 程序里面 使用 ServletAPI。
如果可以使用的话!!那么 灵活性就大大提高了。这样的话我们 以前学过的 原生态 Servlet 我们就也可以 用了。
直接 在 方法里面 写两个 参数,一个参数 是 req 另一个是 resp
@GetMapping("/test")
public String test3(HttpServletRequest req, HttpServletResponse resp){
HttpSession session = req.getSession();
System.out.println(session.getId());
return "hello";
}
我们会发现,确实可以 使用。都能拿到 Session 了。那肯定 没问题的。
为什么呢?因为这个 方法 是会被 servlet 程序 调用的,所以 这里面执行的代码,肯定 会有响应。
return "资源文件的路径"
:这个就是转发 它帮你默认写了一个字符串前缀 forward: 所以 实现的 跳转方式 是 转发!
return "forward:资源文件的路径"
:这个也是转发。视图解析器不生效
return "redirect:资源文件的路径"
:这个是重定向。视图解析器不生效 但是重定向的话,可能会暴露资源文件的路径。因为重定向后地址栏就会跳转到 这个 资源文件路径的位置。
切记:视图解析器 只会 在 你没有使用 forward 和 redirect 的时候 生效。
@GetMapping("/hello")
public String test3(HttpServletRequest req, HttpServletResponse resp){
HttpSession session = req.getSession();
System.out.println(session.getId());
return "forward:WEB-INF/jsp/test.jsp";
}
请求的参数,可以 直接从 方法那里的形参拿到。这一点 就很智能。我们不需要 用什么技巧,写什么 代码 去 获取这个参数数据。
package top.muquanyu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(String name,Model model){
// 封装需要传递过去的数据
model.addAttribute("msg","Hello,SpringMVCAnnotation");
System.out.println(name);
return "hello"; // 会被 视图 解析器 处理,也就是 拼接 一个 资源的路径
}
}
给参数 起别名 不让其 进行 暴露 或者是 更加方便传参。
@RequestParam(("username") String name)
这样的话 我们 请求url 写参数的时候 可以写为 username
。
一般情况下,加上了这个东西。就是 显示的 说明 这个参数 就是 从前端 传递过来的数据。我们可能会用到 这个 参数传过来的数据。
model 传递给前端数据
modelMap
:继承了 LinkedHashMap 的所有方法,在操作数据的时候,可能有更加全面的选择。