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

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

一、基本配置

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

SpringMVC配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><beanclass="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:尤其是那个谁,我都写了篇博客总结,你老人家呢?

转载于:https://www.cnblogs.com/hhx626/p/7534628.html

【drp 12】再识转发和重定向:SpringMVC无法跳转页面相关推荐

  1. 【SpringMVC】Servlet转发和重定向的区别

    1. 概述 转发和重定向是Servlet中进行页面跳转的两种方式,下图展示了其工作原理,左图为转发,右图为重定向. 从上图可以看出,二者最大的区别就是:转发是在服务器内部进行的,只有一次请求响应:而重 ...

  2. SpringMVC转发与重定向的区别

    不同点: 转发:转发是服务器内部的跳转,浏览器的地址栏不会发生变化.从一个页面到另一个页面的跳转还是同一个请求,也即是只有一个请求响应.可以通过request域来传递对象. 重定向:是浏览器自动发起对 ...

  3. java 重定向关键字_SpringMVC 转发、重定向

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

  4. Spring MVC的转发和重定向

    1.可以采取servlet+JSP的方式进行转发和重定向 2.MVC提供了返回String类型的方式进行转发(可以配合配置文件为返回的String添加前缀和后缀)MVC默认转发 重定向:需要在返回值前 ...

  5. Javaweb 转发和重定向

    文章目录 导读 转发和重定向的概念 转发和重定向的相同点 转发和重定向的不同点 实现语句的不同 实现方式的不同 请求次数的不同 状态码的不同 能否跨域 是否经过过滤器 何时使用转发 何时使用重定向 导 ...

  6. SpringMVC(二)——转发和重定向、处理前端请求的数据(普通字符串/对象)

    文章目录 1. 转发和重定向 2. 处理前端请求的数据 2.1 普通字符串 2.2 对象 1. 转发和重定向 转发:url不会发生变化 (查询前端固定模板的数据) @RequestMapping(&q ...

  7. SpringMVC转发和重定向

    页面间的跳转分为转发和重定向 但是转发和重定向在springMVC里又分为转发到页面和重定向到页面,转发到处理器方法和重定向到处理器方法 下边是具体实现功能的代码: 转发到页面和重定向到页面 //转发 ...

  8. SpringMVC之——转发与重定向

    与视图解析器的关系 有视图解析器时转发和重定向都可以成功, 无视图解析器时转发需要补全路径才能成功,重定向不能访问WEB-INF下的页面(如图中的test.jsp) 视图解析器配置在web.xml中绑 ...

  9. springmvc重定向到另一个项目_spring mvc的转发与重定向

    转发与重定向 spring mvc底层其实就是一个servlet,因此在spring mvc中也存在转发和重定向的概念.对于转发的页面,可以是在WEB-INF目录下的页面:而重定向的页面,是不能在WE ...

最新文章

  1. 大规模服务设计部署经验谈
  2. matlab中的histc,Matlab histc与矢量箱
  3. POJ2239简单二分匹配
  4. php正则引用不能计算,php正则表达式 后向引用~
  5. webpack 工作方式
  6. 转 CentOS下php安装mcrypt扩展
  7. Android之CSDN 牛人博客索引
  8. 如何用SQLDMO在ASP.NET页面下实现数据库的备份与恢复
  9. mysql数据库开发经历_六年开发经验,整理Mysql数据库技巧笔记,全网最详细的笔记集合!...
  10. python的重点和难点_python知识点汇总-Go语言中文社区
  11. JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
  12. 可以扦插的花有哪些?
  13. clamp.js 的使用---超出省略 (翻译)
  14. 华三模拟器命令(陆续更新)
  15. 你需要的iPhoneX适配
  16. Talk to AI,揭秘背后的语音识别数据
  17. SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛-白色相簿
  18. C语言 深度探究C语言中的函数
  19. java装逼的话_程序员装逼指南(语言篇)
  20. CTF MD5之守株待兔,你需要找到和系统锁匹配的钥匙

热门文章

  1. 阿里巴巴产品实习生N天
  2. JDBC基础学习(三)—处理BLOB类型数据
  3. textarea标签内容为(英文或数字不自动换行)的解决方法
  4. Web网站架构设计(转)
  5. asp.net gridview 72般绝技
  6. echarts怎么控制一个点沿着折线移动_计算机怎么识别图像中的直线?
  7. Flink + Iceberg + 对象存储,构建数据湖方案
  8. 蚂蚁集团网络通信框架 SOFABolt 功能介绍及协议框架解析 | 开源
  9. 盒马鲜生,快而准确的秘密!
  10. 10年后,阿里给千万开源人写了一封信