视图解析器的最基本功能有:
- 页面的跳转
- 有些时候页面放置的位置存在多级文件夹,在SpringMVC中写跳转路径的时候总是会写很长,这样很不方便。有了SpringMVC的视图解析器就可以定义好页面路径的前缀(文件夹路径)和后缀(页面格式,jsp;html…),在书写路径的时候只需要写对应页面名字就可以了,提高了开发效率。;
- /WEB-INF/目录不对外开放的,外部没办法直接访问到(即不能通过URL访问),只能通过映射来访问,这样可以限制访问,能有效提高安全性。为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下的子目录中,视图解析器能够提供访问方法。
当然视图解析器除了上述基本功能外,还有很多高级功能。作为入门学习,暂时不需学习。
跳转方式代码实现
视图(页面)的相互跳转有两种方式,转发和重定向。这两个概念已在JSP中学过。可参考链接做简要复习。
目录
构建过程
- 创建动态网页工程(Dynamic web project)
- 将所需的jar包复制到lib目录下
- 编写web.xml
- 编写springmvc配置文件
- 编写index.jsp。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试页</title>
</head>
<body>
<a href="one">请点击</a>
</body>
</html>
- 编写视图界面
在WEB-INF下创建view文件夹,在该文件夹下创建1个界面:one.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<h1>One</h1>
</body>
</html>
- 编写controller中的基本方法
package com.edu.tjdz.geng.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping(value = "/one")
public String one() {
return "one";
}
}
- 启动项目,测试基本框架是否有问题
转发
使用场景:在工程中可能会有少部分请求需返回的页面不再是/WEB-INF/view/下的网页,而是其他目录下的网页。针对这种情况,无法使用SpringMVC.xml中配置的视图解析器进行网页路径的拼接。解决方法就是使用转发
例如,现在/one请求需要返回hello.jsp。
- 需要修改controller源码
package com.edu.tjdz.geng.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping(value = "/one")
public String one() {
return "forward:/hello.jsp";
}
}
- 运行测试。
重定向
将转发中的controller源码进行修改
- 需要修改controller源码
package com.edu.tjdz.geng.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping(value = "/one")
public String one() {
return "redirect:/hello.jsp";
}
}
- 运行测试。测试时按F12,打开浏览器的调试功能。查看请求具体有哪些不同,进行比较。
跳转方式的参数传递
向页面传递参数
转发传递参数
- 修改controller
/*1.1、转发,页面获取参数*/
@RequestMapping(value = "/one")
public ModelAndView one(String username, String password) {
System.out.println("username: " + username + " password: " + password);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username", username);
modelAndView.addObject("password", password);
modelAndView.setViewName("forward:/hello.jsp");
return modelAndView;
}
- 修改index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试页</title>
</head>
<body>
<a href="one?username=20180101&password=AAA">请点击</a>
</body>
</html>
- 修改hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<h1>Hello</h1>
<h1>${username}</h1>
<h1>${password}</h1>
</body>
</html>
- 运行项目,输入http://localhost:8080/SpringMVC08,点击网页上的链接
重定向传递参数
可以使用借助session。
- 修改controller
package com.edu.tjdz.geng.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
@SessionAttributes(value = {"username", "password"})
@Controller
public class MyController {
/*2.1、重定向,页面获取参数*/
@RequestMapping(value = "/one")
public ModelAndView one(String username, String password) {
System.out.println("in one request");
System.out.println("username: " + username + " password: " + password);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username", username);
modelAndView.addObject("password", password);
modelAndView.setViewName("redirect:/hello.jsp");
return modelAndView;
}
}
- 运行项目,输入http://localhost:8080/SpringMVC08,点击网页上的链接
向二次请求传递参数
转发传递参数
- 修改controller,将其他方法注释。
转发传递参数可以使用同名,即处理第一次请求的函数参数名称和处理第二次请求的函数参数名称一模一样
/*1.2、转发,第二请求获取参数*/
@RequestMapping(value = "/one")
public String one(String username, String password) {
return "forward:/two";
}
@RequestMapping(value = "/two")
public String two(String username, String password) {
System.out.println("in two request");
System.out.println("username: " + username + " password: " + password);
return "forward:/hello.jsp";
}
- 运行项目,输入http://localhost:8080/SpringMVC08,点击网页上的链接。观察控制台的输出
重定向传递参数
重定向传参时需要引入新的对象
- 修改controller,将其他方法注释。
这里在第一次请求中使用了RedirectAttributes 这个对象,调用它的addFlashAttribute函数,就可以添加要传递的参数名称和参数值了。
在第二次请求中使用注解@ModelAttribute接受传递的参数。
/*2.2.1、重定向,通过addFlashAttribute 和 @ModelAttribute来解析二次请求里的参数*/
@RequestMapping(value = "/one")
public String one(String username, String password, RedirectAttributes redirectAttributes) {
System.out.println("username: " + username + " password: " + password);
redirectAttributes.addFlashAttribute("username", username);
redirectAttributes.addFlashAttribute("password", password);
return "redirect:/two";
}
@RequestMapping(value = "/two")
public String two(@ModelAttribute("username")String username, @ModelAttribute("password")String password) {
System.out.println("in two request");
System.out.println("username: " + username + " password: " + password);
return "one";
}
- 运行项目,输入http://localhost:8080/SpringMVC08,点击网页上的链接。观察控制台的输出