SpringMVC 配置视图解析器prefix和suffix参数后的重定向和转发问题

299 阅读1分钟

配置视图解析器的prefix和suffix参数后如何指定是重定向还是转发

1.先看控制层代码

@Controller
//用于与方法的请求路径拼接
@RequestMapping("/user")
public class UserController {

    @RequestMapping(value = "/quick")
    public String hello(){
        System.out.println("hello running,,,,,");
        return "hello"
    }
    //http://localhost:8080/user/quick
}

2.spring-mvc.xml配置

<!--配置视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--配置虚拟路径前缀   -->
    <property name="prefix" value="/jsp/"></property>
    <!--配置虚拟路径后缀-->
    <property name="suffix" value=".jsp"></property>
    <!--/jsp+ 返回路径名 +.jsp-->
</bean>

3.项目结构

image.png

4.分析

我已经配置好虚拟路径的前缀“/jsp/”,第一个'/'代表找webapp根目录

虚拟路径后缀“.jsp”

此时只需要控制层方法返回jsp文件名即可

在没有配置前后缀的情况下,可以在return语句后的字符串之前指定“forward:”或“redirect:”来指定是转发还是重定向,如下:

// return "redirect:/jsp/hello.jsp";//重定向
// return "forward:/jsp/hello.jsp";//默认是转发

但由于配置了前后缀,代码变为:

 return "hello";

此时若依然在前面加“forward:”或“redirect:”,就访问不到资源

如下:

 return "forward:hello";

image.png

 return "redirect:hello";

image.png

5.解决方案:

无视配置好的前后缀,按照原来没指定之前,把路径写完整 如:

 return "redirect:/jsp/hello.jsp";//重定向

image.png

 return "forward:/jsp/hello.jsp";

image.png

6.总结

如果配置了MVC的视图解析器的前后缀,在默认情况下,return只需写要访问jsp的名字(无需写文件后缀名),且默认为转发。

此时若有部分映射的方法想使用重定向,则直接无视配置好的前后缀,return“redirect:文件位置”(文件位置处,/webapp下一级目录/文件名.后缀)