SpringMVC–视图和视图解析器
基本介绍
-
在springMVC 中的目标方法最终返回都是一个视图(有各种视图)。
-
返回的视图都会由一个视图解析器来处理(视图解析器有很多种)。
自定义视图
为什么需要自定义视图
在默认情况下,我们都是返回默认的视图, 然后这个返回的视图交由SpringMVC 的InternalResourceViewResolver 视图处理器来处理的。
在实际开发中,我们有时需要自定义视图,这样可以满足更多更复杂的需求。
自定义视图实例-代码实现
配置springDispatcherServlet-servlet.xml , 增加自定义视图解析器
<!--
1. 配置可以解析自定义的视图的解析器
2. BeanNameViewResolver 这个就是可以解析自定义视图的解析器
3. name="order" :表示给这个解析器设置优先级, 默认优先级很低值Integer.MAX_VALUE
4. 一般来说明,我们自己的视图解析优先级高,Order 值越小,优先级越高
-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="99"></property>
</bean>
创建springmvc\src\com\web\viewresolver\MyView.java -自定义视图类
/**
* 1. MyView继承了AbstractView, 就可以作为一个视图使用
* 2. @Component(value = "myView"),该视图会注入到容器中, 名字/id是 myView
*/
@Component(value = "myView")
public class MyView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
//完成视图渲染
//并且可以确定我们要跳转的页面 [请求转发] /WEB-INF/pages/my_view.jsp
System.out.println("进入到自己的视图..");
//1. 下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp
//2. /WEB-INF/pages/my_view.jsp 会被springmvc解析 /springmvc/WEB-INF/pages/my_view.jsp
request.getRequestDispatcher("/WEB-INF/pages/my_view.jsp") .forward(request, response);
}
}
创建springmvc\src\com\web\viewresolver\GoodsHandler.java
@RequestMapping("/goods")
@Controller
public class GoodsHandler {
@RequestMapping(value = "/buy")
public String buy() {
System.out.println("------buy()-----");
return "myView";
}
}
创建springmvc\web\view.jsp 和/WEB-INF/pages/my_view.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>view</title>
</head>
<body>
<h2>测试自定义视图</h2>
<a href="goods/buy">测试自定义视图</a><br/>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>从自己的视图过来的</h1>
<hr/>
welcome!
</body>
</html>
自定义视图工作流程小结
自定义视图-小结
-
自定义视图: 创建一个View 的bean, 该bean 需要继承自AbstractView, 并实现renderMergedOutputModel 方法。
-
并把自定义View 加入到IOC 容器中。
-
自定义视图的视图处理器,使用BeanNameViewResolver, 这个视图处理器也需要配置到ioc 容器。
-
BeanNameViewResolver 的调用优先级需要设置一下,设置order 比Integer.MAX_VAL小的值,
以确保其在InternalResourceViewResolver 之前被调用。
自定义视图-工作流程
-
SpringMVC 调用目标方法, 返回自定义View 在IOC 容器中的id。
-
SpringMVC 调用BeanNameViewResolver 解析视图: 从IOC 容器中获取返回id 值对应的bean, 即自定义的View 的对象。
-
SpringMVC 调用自定义视图的renderMergedOutputModel 方法渲染视图。
-
如果在SpringMVC 调用目标方法, 返回自定义View 在IOC 容器中的id不存在, 则仍然按照默认的视图处理器机制处理。
目标方法直接指定转发或重定向
使用实例
目标方法中指定转发或者重定向。
-
默认返回的方式是请求转发,然后用视图处理器进行处理,比如在目标方法中这样写:
@PostMapping(value = "/buy") public String buy() { System.out.println("购买商品~"); return "success"; }
-
也可以在目标方法直接指定重定向或转发的url 地址
-
如果指定重定向,不能定向到/WEB-INF 目录中
应用实例-代码实现
修改GoodsHandler.java, 增加方法order()文章来源:https://www.toymoban.com/news/detail-604778.html
// 在目标方法直接指定重定向&请求转发
@RequestMapping(value = "/order")
public String order() {
System.out.println("=======order()=====");
//这里直接指定转发到哪个页面
//return "forward:/WEB-INF/pages/my_view.jsp";
//重定向, 如果是重定向,就不能重定向到/WEB-INF 目录中
return "redirect:/login.jsp";
}
修改view.jsp,文章来源地址https://www.toymoban.com/news/detail-604778.html
<h2>测试自定义视图</h2>
<a href="goods/buy">测试自定义视图</a><br/>
<a href="goods/order">测试目标方法直接指定重定向&请求转发</a><br/>
到了这里,关于视图和视图解析器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!