最近再使用SpringMVC进行页面跳转的时候,不知道发生了什么,始终都无法正确跳转。后来问题解决了,发现是对于转发和重定向没有能很好的理解,以此写篇博客,权当做积累了!

声明:本博客的所有代码,均为模拟问题的代码,将问题从复杂的系统中抽取出来,进行分析!

一、基本配置

备注:只截取了几个比较关键的配置点

SpringMVC配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp" />
</bean></span>

web.xml配置

<span style="font-family:KaiTi_GB2312;font-size:18px;">	<display-name>Angel-web</display-name>
<welcome-file-list>
<welcome-file>/ccweb/jsp/haha/Ynna.jsp</welcome-file>
</welcome-file-list></span><pre name="code" class="html"><span style="font-family:KaiTi_GB2312;font-size:18px;"> <!-- springmvc的前端控制器 -->
<servlet>
<servlet-name>Angel-web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Angel-web</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping></span>

系统结构图:需要注意的是,我们平时大多是将JSP文件夹放入WEB-INF文件夹下,然后在SpringMVC的前缀配置中,是配置<property name="prefix" value="/WEB-INF/jsp/"></property>,但是这里不同!

备注:并不建议将jsp页面放入其他位置,但这个根据情况而定,WEB-INF文件并不被默认认为是web文件,用户无法直接访问到这里面的文件源码,增加了一定的安全性!如果将jsp文件或者其他文件植入系统的其他目录,那么用户可能直接越过Struts或者SpringMVC的controller进行访问。

有兴趣的可以查一下,更多了解为什么最好是将文件放入到WEB-INF文件夹下!

二、问题分析

出现的问题是:在controller中,通过常用的如下方式:

<span style="font-family:KaiTi_GB2312;font-size:18px;">@RequestMapping("/test")
public String findYnna() {
return "Ynna";
}</span>

可以访问到这个controller方法,但无法跳转到Ynna这个jsp页面,不仅如此,连直接访问具体路径的:return "ccweb/jsp/Ynna.jsp";  这种方式,也无法打开这个jsp页面。但神奇的是,如果输入http://localhost:8080/ccweb......这种形式,却又可以正常打开这个页面(这也就是为什么建议将文件植入到WEB-INF下面的一个原因,一般来说,用户只能通过访问MVC中的Controller,根据其处理结果调用对应的视图解析器进行视图显示)。

出现这种情况,第一个想到的是,SpringMVC的前缀后缀配置问题,但是如文章第一部分,前缀和后缀都配得很好。问题:(问了一下项目中的实际应用,大都采用return "ccweb/jsp/Ynna.jsp"方式进行页面跳转,我就是想知道,将JSP页面移出了WEB-INF文件夹,通过文件的相对路径直接进行访问页面,既然如此,那配个前缀和后缀是干嘛使的????????谁能告诉我?????????)

然后,检查了SpringMVC配置,发现没问题,第二个想到的是web.xml里面对于Servlet请求拦截的配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><servlet-mapping>
<servlet-name>Angel-web</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping></span>

最终发现,拦截配置的也没有问题,从系统名称后的 / 开始拦截,有时候,会加以特殊的写法,比如在Struts里面,个人就偏向于,拦截 /*.do形式的。可是现在的问题是:页面访问不到,到底是出现了什么问题?????

检查完了这一步,紧接着是检查如果直接在jsp页面,通过window.location.href方法或者说添加<a href="***">标签的形式,通过植入相应jsp页面的具体相对路径,也就是ccweb/jsp/Ynna.jsp这种形式,是否可以正常打开? 结果是:可以!

那么问题就来了,以上验证说明,这个页面是完全可以通过相对路径进行直接访问和跳转的,那么,问题再次被定位到controller在匹配视图解析这个过程!

后来的解决方法是:

<span style="font-family:KaiTi_GB2312;font-size:18px;">return "redirect:ccweb/jsp/Ynna.jsp"; </span>

可以明显的看到这里用了redirect关键字:重定向!(这里只是实现页面的跳转,也可以用forward,根据具体的需求而定,有不了解的,可以参考博客:

[drp 7]转发和重定向的区别

再次分析这个问题:当前页面pageOne——通过触发一个事件——访问controller方法——跳转到另一个页面(重定向)或者在当前页面打开另一个页面(转发),而之前没有使用redirect的时候,是纯粹的打开一个页面!说到这里可能就有点懵,但是,请分析以下现象:

1:做过后台管理系统的人,应该都不陌生,左边一个菜单栏,然后点击一个,在布局的右边位置打开一个页面(可以类比iframe布局或者html5中的header、nav、footer标签什么的)——打开一个页面

2:同样是在布局的右边位置,通过触发一个事件,比如说button的单击事件,再通过后台的处理,最终在右边位置打开另一个页面——打开一个页面

3:1和2同样是打开一个页面,但是,这是不是相同的概念?????

三、总结

虽说问题比较小,但是也还是要总结的。这次的问题暴露,让自己对于SpringMVC的工作原理,以及重定向和转发都有了再一次不同的理解。另外,感激抛给我这个问题的小伙伴,大家一起成长!不过,话说回来,所谓的在项目中成长,其实不是让你去像个machine一样不停的做项目,或者说,你老人家真的该总结发现和思考了!对于原理上的东西不熟悉,真的可以导致你整个人都是蒙的!做machine还是human ,自己选吧!

PS:尤其是那个谁,我都写了篇博客总结,你老人家呢?

【drp 12】再识转发和重定向:SpringMVC无法跳转页面的更多相关文章

  1. SpringMVC 返回 html 视图页面,SpringMVC与Servlet,Servlet重定向与转发

    1. SpringMVC与Servlet的关系 SpringMVC框架是建立在Servlet之上的,提供各种功能,各种封装,各种方便的同时,它一点儿也没有限制Servlet,我们完全可以在Spring ...

  2. SpringMVC 转发、重定向

    转发.重定向到其它业务方法 @org.springframework.stereotype.Controller @RequestMapping("/userController" ...

  3. 【坑】前端使用ajax异步请求以后,springMvc拦截器跳转页面无效

    文章目录 前言 `$.ajaxSetup( )` 后记 前言 本文着重解决前后端分离开发的页面调整问题. 笔者,在做一个需求,需要对访问网站,但是没有登录的用户进行拦截,将他们重定向到首页. 很简单的 ...

  4. [drp 7]转发和重定向的区别

    导读:类似于response.sendRedirect(request.getContextPath()+"/servlet/item/SearchItemServlet");和r ...

  5. springmvc转发与重定向

    摘自http://elf8848.iteye.com/blog/875830 (1)我在后台一个controller跳转到另一个controller,为什么有这种需求呢,是这样的.我有一个列表页面,然 ...

  6. SpringMVC转发和重定向区别!

    在servlet中,转发和重定向是由request和response完成的.两者之间的区别请看我之前的文章.那么在springMVC中是如何完成的呢? /**转发**/ @RequestMapping ...

  7. springMVC之一(页面<--->控制器 互相传值,转发和重定向)

    #页面--->控制器1.request:不建议使用2.使用属性传值(建议使用)@RequestParam("name") String username3.使用Bean对象传 ...

  8. SpringMVC中使用forward和redirect进行转发和重定向以及重定向时如何传参详解

    转自:http://blog.51cto.com/983836259/1877188 2016-11-28 09:45:59   如题所示,在SpringMVC中可以使用forward和redirec ...

  9. SpringMVC框架——转发与重定向

    网上摘取一段大神总结的转发与重定向的区别,如下: 转发(服务端行为) 形式:request.getRequestDispatcher().forward(request,response) 转发在服务 ...

随机推荐

  1. 死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)

    问题 (1)什么是ABA? (2)ABA的危害? (3)ABA的解决方法? (4)AtomicStampedReference是什么? (5)AtomicStampedReference是怎么解决AB ...

  2. this详解,对执行上下文说 Yes

    this 指向多变,很多隐蔽的 bug 都缘于它.与此同时,this 强大灵活,如果能熟练驾驭,就会写出更简洁.优雅的代码. 社区上对于 this 的讲解虽然不少,但缺乏统一梳理. this 相关知识 ...

  3. github入门之分支操作--5

    1.显示分一览表 2.创建.切换分支 2.1.切换到feature-A分支并进行提交 2.1.1.执行下面的命令,创建名为feature-A的分支 实际上,执行以命令也能收到同样的效果,但是我习惯使用 ...

  4. SPM-软件项目管理之感想

    这学期开始选择选修课的时候是需要把每节课都过一遍的.当我上完SPM那节课的时候,我就已经决定要选这门课了,尽管还有其他的课我都还没上过.由于这节课是双语教学-中文老师兼外籍老师,这样的方式感觉很新颖, ...

  5. shell框架

    #!/bin/bash#注释#注释#环境变量相关,如下PATH=/sbin:/bin:/usr/bin:/usr/sbin #引入库函数,如下,类似于c语言的#include "*.h&qu ...

  6. 洛谷 P1181 数列分段Section I(水题日常)

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...

  7. 根据HTML语义化编码

    语义化标签——http://www.html5jscss.com/html5-semantics-section.html 写HTML代码时应注意什么? 尽可能少的使用无语义的标签div和span: ...

  8. Python基础篇 -- 部分练习题

    实现一个整数加法计算器(两个数相加): 如:content = input("请输入内容:") 用户输入:5+9或5+ 9或5 + 9(含空白),然后进行分割转换最终进行整数的计算 ...

  9. POI写入word doc 03 模板的实例

    在使用POI写word doc文件的时候我们必须要先有一个doc文件才行,因为我们在写doc文件的时候是通过HWPFDocument来写的,而HWPFDocument是要依附于一个doc文件的.所以通 ...

  10. Spring Boot -- Idea搭建下搭建web项目

    最近公司准备使用Spring Boot框架,让小瑾先来学习一下,为了表示小瑾的办事效率,小瑾直接先学习用Idea搭建一个Spring Boot项目,哈哈哈,坐等领导夸. 废话不多说了,先来总结一下用I ...