SpringMVC 中有哪些域对象?
如何选择域对象?
准备工作:构建我们的SpringMVC的框架
我们将数据添加到请求域中了,那么我们如何获取数据呢?
在我们原生的 Servlet 中为我们提供了三种操作域中数据的方法:
接下来我们介绍几种向域中添加数据的方式:【如何演示具体操作】
因为我们获取域对象的数据根据域的不同在此处分为三种,我在这里直接给出跳转页面的代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>用作请求匹配成功后的跳转页面</title>
</head>
<body>
<h1>跳转页面成功</h1>
<!--我们在前面将数据添加到了共享域中之后,我们可以在显示页面获取这些共享数据-->
<!--因为我们要获取的是在request中的数据,所以我们直接通过key获取即可,尽管IDEA中会显示报错,但是实际没有问题-->
<p th:text="${testRequestScope}"></p>
<p th:text="${session.testSessionScope}"></p>
<p th:text="${application.testApplicationScope}"></p>
</body>
</html>
编写我们的请求
<a th:href="@{/testRequestByServletAPI}">通过原生ServletAPI向Request请求域添加数据</a><br>
编写我们的控制器方法
// 通过原生的Servlet的API向域中共享数据
@RequestMapping("/testRequestByServletAPI")
public String testRequestByServletAPI(HttpServletRequest request){
request.setAttribute("testRequestScope", "Hello, Request");
return "success";
}
编写我们的请求
<a th:href="@{/testModelAndView}">通过ModelAndView向Request请求域添加数据</a><br>
编写我们的控制器方法
// 通过ModelAndView向域中共享数据
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
/*
我们的ModelAndView包含两个方面:
(1)M 代表模型,用来向请求域共享数据
(2)V 代表视图,用于页面跳转
*/
// 创建我们ModelAndView的对象
ModelAndView mav = new ModelAndView();
// 然后为其添加数据,就是向我们的 request请求域添加数据
mav.addObject("testRequestScope", "Hello, ModelAndView");
// 然后通过这个对象指定视图名称
mav.setViewName("success");
return mav;
}
编写我们的请求
<a th:href="@{/testModel}">通过Model向Request请求域添加数据</a><br>
编写我们的控制器方法
// 通过Model向域中共享数据
@RequestMapping("/testModel")
public String testModel(Model model){
// 添加数据
model.addAttribute("testRequestScope", "Hello, Model");
return "success";
}
编写我们的请求
<a th:href="@{/testMap}">通过Map向Request请求域添加数据</a><br>
编写我们的控制器方法
// 通过Map向域中共享数据
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
// 通过map的put方法添加键值对
map.put("testRequestScope", "Hello, Map");
return "success";
}
编写我们的请求
<a th:href="@{/testSession}">通过ServletAPI向Session请求域对象中添加数据</a><br>
编写我们的控制器方法
// 通过ModelMap向域中共享数据
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
// 通过map的put方法添加键值对
modelMap.addAttribute("testRequestScope", "Hello, ModelMap");
return "success";
}
编写我们的请求
<a th:href="@{/testSession}">通过ServletAPI向Session请求域对象中添加数据</a><br>
编写我们的控制器方法
// 通过ServletAPI向我们的Session请求域中添加共享数据
@RequestMapping("/testSession")
public String testSession(HttpSession session){
session.setAttribute("testSessionScope", "Hello, Session");
return "success";
}
<a th:href="@{/testApplication}">通过ServletAPI向Application请求域对象中添加数据</a>
// 向我们Application请求域中添加数据
@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
// 通过session的getServletContext方法获取我们的application对象
ServletContext application = session.getServletContext();
// 然后调用我们的add~方法向域中添加数据
application.setAttribute("testApplicationScope", "Hello, Application");
// 返回页面
return "success";
}
什么是视图?
视图分为哪些种类?【列举几种常见的】
接下来我们将展开介绍几种常见的视图
我们之前练习的一直都是 Thymeleaf 的视图
@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
return "success";
}
可以看到控制器方法返回时没有任何前缀,我们获得的就是ThymeleafView
如果想进行测试可以在我们的首页写一条超链接,请求地址为
/testThymeleaf
,运行后点击超链接就可以查看效果
在SpringMVC中默认的转发视图为 InternalResourceView 【网络资源视图】
当我们为控制器方法返回的视图名添加 forward: 前缀,得到的就是 InternalResourceView
这种视图不会通过核心配置文件中的视图解析器解析,而是将前缀后面的路径作为最终路径通过转发的方式实现跳转
转发可以转发到一个页面,也可以转发到一个请求上
主页编写发起请求的超链接
<a th:href="@{/testForward}">测试InternalResourceView</a><br>
控制器实现具体的跳转方法,此处我们跳转到/testThymeleafView请求上,因为我们的html页面的位置浏览器访问不到
@RequestMapping("/testForward")
public String testForward(){
return "forward:/testThymeleafView";
}
我们直接重定向到 /testForward 请求上去
@RequestMapping("/testRedirect")
public String testRedirect(){
return "redirect:/testForward";
}
发起请求页要写一个超链接
<a th:href="@{/testRedirect}">测试RedirectView</a>
我们可以在springMVC的核心配置文件中进行声明
<!--尽管此处success报错,但是不影响使用:配置了这个后控制器中的方法就会失效-->
<!--我当前想到的作用就是将上下文路径定位到一个页面-->
<mvc:view-controller path="/success" view-name="success"></mvc:view-controller>
这个标签有两个常用的属性:
当我们设置了这个标签后,控制器里的所有方法都会失效
<mvc:annotation-driven />
在此之前我们一直都是使用的都是html页面进行演示,如果是jsp文件,我们又将如何处理呢?
我们新建一个模块,然后将打包方式设置为 war,然后导入依赖,添加web模块,添加xml文件
在 web.xml 中依旧注册解决乱码问题的过滤器和前端控制器 Dispatcher
对于springMVC的核心配置文件所有变化,我们不在使用之前的视图解析器,而是替换为 InternalResourceViewResolver
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描组件-->
<context:component-scan base-package="com.atguigu.mvc.controller"/>
<!--
在jsp中,不设置任何前缀自身也是一个转发视图,所以直接采用InternalResolver解析器
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--也需要我们指定前缀和后缀-->
<property name="prefix" value="/WEB-INF/templates/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
在 webapp 目录下,我们编写 index.jsp 文件
上面我们了解到当前 jsp 页面就是一个最小的域对象 pageContext
jsp 页面中动态获取上下文路径 pageContext.request.contextPath【使用EL表达式】
那么什么是 EL 表达式呢?
<%--
Created by IntelliJ IDEA.
User: npc
Date: 2022/11/23
Time: 17:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个使用jdp的springMVC模块</title>
</head>
<body>
<h1>首页</h1>
<a href="${pageContext.request.contextPath}/success">点击跳转我们指定的jsp页面</a>
</body>
</html>
编写我们请求跳转后的页面 success.jsp
<%--
Created by IntelliJ IDEA.
User: npc
Date: 2022/11/23
Time: 17:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>成功</h1>
</body>
</html>