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>

 

一般都不这样弄 因为弊端貌似挺多的,这里解析一下原理吧

 

posted @ 2021-06-27 22:35  咸瑜  阅读(198)  评论(0编辑  收藏  举报