视图和视图解析器
1.基本介绍
-
在SpringMVC中的目标方法,最终返回的都是一个视图(有各种视图)
注意,这里的视图是一个类对象,不是一个页面!!
-
返回的视图都会由一个视图解析器来处理(视图解析器有很多种)
2.自定义视图
2.1为什么需要自定义视图
-
在默认情况下,我们都是返回默认的视图,然后返回的视图交由 SpringMVC 的
InternalResourcesViewResolver
默认视图解析器来处理的: -
在实际开发中,因为业务需求,我们有时候需要自定义视图解析器
-
视图解析器可以配置多个,按照指定的顺序来对视图进行解析。如果上一个视图解析器不匹配,下一个视图解析器就会去解析视图,以此类推。
2.2应用实例
执行流程:
-
view.jsp,请求到 Handler
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>自定义视图测试</title> </head> <body> <h1>自定义视图测试</h1> <a href="goods/buy">点击到自定义视图</a> </body> </html>
-
GoodsHandler.java
package com.li.web.viewresolver; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author 李 * @version 1.0 */ @RequestMapping(value = "/goods") @Controller public class GoodsHandler { @RequestMapping(value = "/buy") public String buy(){ System.out.println("----------buy()---------"); return "liView";//自定义视图名 } }
-
自定义视图 MyView.java
package com.li.web.viewresolver; import org.springframework.stereotype.Component; import org.springframework.web.servlet.view.AbstractView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; /** * @author 李 * @version 1.0 * 1. MyView 继承了AbstractView,就可以作为了一个视图使用 * 2. @Component(value = "myView") ,该视图会注入到容器中,id为 liView */ @Component(value = "liView") public class MyView extends AbstractView { @Override protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { //1.完成视图渲染 System.out.println("进入到自己的视图..."); //2.并且确定我们要跳转的页面,如 /WEB-INF/pages/my_view.jsp /* * 1.下面就是请求转发到 /WEB-INF/pages/my_view.jsp * 2.该路径会被springmvc解析成 /web工程路径/WEB-INF/pages/my_view.jsp */ request.getRequestDispatcher("/WEB-INF/pages/my_view.jsp") .forward(request, response); } }
-
结果页面 my_view.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>my_view</title> </head> <body> <h1>进入到my_view页面</h1> <p>从自定义视图来的...</p> </body> </html>
-
springDispatcherServlet-servlet.xml 配置自定义视图解析器
<!--1.指定扫描的包--> <context:component-scan base-package="com.li.web"/> <!--2.配置视图解析器[默认的视图解析器]--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置属性 suffix(后缀) 和 prefix(前缀)--> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!--3. 3.1 配置自定义视图解析器 BeanNameViewResolver 3.2 BeanNameViewResolver 可以解析我们自定义的视图 3.3 属性 order 表示视图节解析器执行的顺序,值越小优先级越高 3.4 order 的默认值为最低优先级-LOWEST_PRECEDENCE 3.5 默认的视图解析器就是最低优先级,因此我们的自定义解析器会先执行 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"&g