3. SpringMVC 组件解析 - View Resolver - 视图解析器
什么是视图解析器? 先来复习一下吧:
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即 具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
SpringMVC有默认组件配置,视图解析器默认组件都是DispatcherServlet.properties配置文件中配置的,该配置文件地址 org/springframework/web/servlet/DispatcherServlet.properties,该文件中配置了默认的视图解析器,
我们可以在IDEA的lib下去找 然后找到 spring-webmvc-5.0.5.RELEASE.jar 包下的org/springframework/web/servlet/DispatcherServlet.properties ,然后我们直接打开,发现里面有很多我们前面介绍过的解析器,我们这篇文章讲解的是视图解析器:
找到
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
一般在倒数第二行 我们跟踪InternalResourceViewResolver进去:
然后可以看到这个类继承了UrlBasedViewResolver类,然后我们在跟踪进去:
发现这两行代码
public static final String REDIRECT_URL_PREFIX = "redirect:";
public static final String FORWARD_URL_PREFIX = "forward:";
其实呢 这个就是他定义的常量 我用我五毛钱英语可以读出
分别是: 重定向 - url - 前缀 和 转发 - url - 前缀
所以我可以知道 这就是 控制器返回那个字符串的方式! 默认是第二个 转发,所以他隐藏了而已,
所以我们可以去哪里添加 去改变他的方式:
package com.bihu.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(value = {"/aaa"}) public class TestController { @RequestMapping(value = "/go",method = RequestMethod.GET) public String GoUrl(){ System.out.println("您成功访问了 根目录/aaa/go 网页!"); return "redirect:/s1.jsp";
} }
嗯 果然是这样 现在网页不转发了 是直接重定向了【网址变了】
所以 就是说 这个东西默认是 转发 然后你完全可以添加这个进去实现重定向。
还有就是:
我们一般开发 如果视图是 jsp 那么我们一般都把 这个jsp 在webapp这个包下 创建一个文件夹存 jsp ,所以你在控制器返回的网址也是要变的【视图解析器】:
例如这是我的结构图,那么我就要这要返回:
return "/jsp/s1.jsp";
所以如果你觉得麻烦 注意啊 是如果觉得麻烦,你完全可以返回一个 s1 其他的让 Spring帮你配【Spring-MVC 容器中 配置依赖注入】:
注意: 我觉得不要配最好,因为听错报错率挺高 因为 转发 和 重定向的问题?? 还有就是 多层目录 、 不同目录
怎么配?
首先我们得知道原理:
还是这个类:
UrlBasedViewResolver
它里面有两个变量叫:
private String prefix = "";
private String suffix = "";
五毛钱并夕夕翻译的我:
prefix = ""; --视图名称前缀
suffix = ""; --视图名称后缀
所以呢,就是:
return "/jsp/s1.jsp";
/webapp/jsp/ : prefix 为什么是/webapp/jsp/ ? 因为如果你改变人家的父路劲 那么就得重写! 写完整 不然找不到!
.jsp : suffix
所以呢 你会发现他都有set 和 get 方法 ,那么你就可以在spring-mvc 容器上注入一下即可了!!!!
spring-mvc.xml : [重要!]
<?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 http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 这个是配置注解扫描器的 --> <context:component-scan base-package="com.bihu"/> <!-- 下面注入prefix 和 suffix 原本是 = “”【空】 的 --> <!-- 注意: class 地址一定别写错 是 org.springframework.web.servlet.view.InternalResourceViewResolver 报错这里吃过亏! --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 下面的 prefix 和 suffix 谁前谁后要分清 --> <property name="prefix" value="/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
一般都不这样弄 因为弊端貌似挺多的,这里解析一下原理吧
本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14942476.html