SpringMVC视图解析器配置导致访问404的问题

最近在学习SpringMVC,先跟着教程demo在类方法上使用RequestMapping()注解,完成了页面的跳转,先上代码吧。

HelloController类:

package com.itcast.zxw.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping(path = "/hello")
    public String sayHello(){
        System.out.println("Hello SpringMVC!");
        return "success";
    }

    /**
     * RequestMapping注解
     * @return
     */
    @RequestMapping(path = "/testRequestMapping")
    public String testRequestMapping(){
        System.out.println("测试RequestMapping注解!");
        return "success";
    }
}

index.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h3>入门程序</h3>

    <a href="hello">入门程序</a><br/>

    <a href="testRequestMapping">RequestMapping注解</a>

</body>
</html>

springmvc的配置文件:springmvc.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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 开起注解扫描 -->
    <context:component-scan base-package="com.itcast.zxw"/>

    <!-- 视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 开起SpringMVC框架注解支持 -->
    <mvc:annotation-driven/>
</beans>

方法跳转成功的success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>入门成功!</h2>
</body>
</html>

所有文件的目录结构如下图:


目录结构.png

这几个文件写好之后,启动TomCat完全没有问题,运行结果如下图:


index.png

success.png

这种情况呢,只是在方法前加@RequestMapping()注解的情况,真正出现问题的是在类前也加上@RequestMapping()的时候,这个时候的访问路径就相当于多了一个文件夹,先看代码,其中,只有index.jsp和Hellocontroller类的代码有变动,其它无变化。

类前加@RequestMapping()注解的Hellocontroller类:

package com.itcast.zxw.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(path = "/test")新加的一个@RequestMapping注解
public class HelloController {

    @RequestMapping(path = "/hello")
    public String sayHello(){
        System.out.println("Hello SpringMVC!");
        return "success";
    }

    /**
     * RequestMapping注解
     * @return
     */
    @RequestMapping(path = "/testRequestMapping")
    public String testRequestMapping(){
        System.out.println("测试RequestMapping注解!");
        return "success";
    }
}

修改后的index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h3>入门程序</h3>

    在访问路径前加了一个刚刚类里面加的test,如果继续直接访问hello,则会报404错误
    <a href="test/hello">入门程序</a><br/>

    <a href="test/testRequestMapping">RequestMapping注解</a>

</body>
</html>

新的index.jsp在访问路径前加了一个刚刚类里面加的test,如果继续直接访问hello,则会报404错误,但是这个404不是我们今天要说的404错误,因为这个不加是很明显的错误,我们要说的是加了之后还报404错误的情况:按照道理来讲,现在这代码也没什么问题了,index.jsp能正常访问,但是点击链接进入success的时候还是会报404错误的(但是控制台的打印没有问题)

index2.png

控制台.png
springmvc报错.png

这是为什么呢???
我们可以先来看一下报错的消息(红线框里的)


springmvc报错.png

从这里我们可以清楚的看到程序去找这个success.jsp的时候,去找了一个test目录下的WEB-INF,然后再依次找pages目录,最后找success.jsp(springmvc_start是项目名称,也就是项目的根目录),然后我们可以看前面的目录结构,WEB-INF的上一层根本就没有test目录,test目录只是我们刚刚在映射注解的时候为那个类加上去的,这个路径有问题,而这个路径是我们在视图解析器配置中配置的,也就是springmvc.xml中配置的

    <!-- 视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

从404的消息中结合配置解析器的prefix属性的value值(value="WEB-INF/pages/")我们可以理解到,自动解析器会在当前同级目录下去寻找设定目录进而寻找跳转的页面,而当前的hello请求的目录是springmvc_start/test/hello,所以它的目录一个是springmvc_start/test下的hello请求,hello请求中又要去寻找一个叫success的文件,这个文件在视图配置器里可以看出来是个jsp文件(配置的后缀),前缀+名字+后缀可以解析出来这个文件的具体位置(WEB-INF/pages/success.jsp);然后我们前面又说到了value="WEB-INF/pages/"这句会在当前目录下去寻找,所以自然就得到了404报错消息中的springmvc_start/test/WEB-INF/pages/success.jsp这一句了,那肯定是找不到的,因为我们的WEB-INF文件夹在webapp下的,也就是说是属于项目文件的,并没有test这一层;所以我们只要把这个路径设置成项目下的WEB-INF就行了,即在value="WEB-INF/pages/"前面加一个/变成(value="/WEB-INF/pages/")
表示视图解析器在项目下的WEB-INF/pages去找对应名字的jsp,改掉之后demo也能正常运行,跟前面的结果一样了。

总结

其实这也是我自己的一个小失误,教程里面配置value的时候其实是有斜杠的,而我自己写的时候没有加,前面能正常运行也就没注意,后面报错了来找原因才发现的,因为一般都是把页面放在WEB-INF目录下的,所以这里设置就这样写(value="/WEB-INF/pages/")加斜杠就好了,表示在项目跟目录的WEB-INF/pages/这个路径。
而(value="WEB-INF/pages/")不加斜杠,就代表在当前路径去找对应的文件,如果类前加了一个@RequestMapping(path)注解的时候,就相当于多了一层路径,所以报错,而如果类前没有加@RequestMapping(path = "/test")注解的话,则表示方法的注解都在项目路径下去找,返回的结果呢找同级自然也是在项目路径下去找(这也是前面没问题的原因)。
但是为了方便肯定是推荐加斜杠,把视图解析的路径确定下来是最好的,也会少很多问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 1.代理多数为兼职美业,也多数为宝妈,时间上匆忙,经常性忙而忘了“开店”(朋友圈分享),早上分享如何运用碎片化时间...
    秀蓉_阅读 312评论 0 0
  • 点击收听音频 快到年关了,今天就聊一下我自己的这一年吧。 一句话:我懂得了日积月累。 一、每天坚持了书法 不是为了...
    韩勇国阅读 263评论 0 3
  • 面对荒凉的侵吞 文/仇润芝 我不敢抬头张望 我家四周无人居住的宅院 向我围剿过来 带着荒草的疯狂 虫蛇的...
    仇潤芝阅读 138评论 0 0
  • 2月13日上午,我和队友们参加了西门塘社区“2018新春敬老系列活动之探访退伍老人”的公益活动,给西门塘...
    弃剑封刀阅读 448评论 1 0
  • A:这鸡蛋真难吃。 B:隔壁的鸡给了你多少钱? A:这鸡蛋真难吃。 B:有本事你下个好吃的蛋来。 A:这鸡蛋真难吃...
    老愚民阅读 538评论 0 0