目录
1. 回顾SpringMVC请求转发和重定向
2. WEB-INF资源目录
3. 视图解析器
4. 静态资源放行
1. 回顾SpringMVC请求转发和重定向
- 概念:
- 在一个项目中功能非常多,也就意味着有非常多的Servlet,不同的Servlet的职不 同 ,而用户发起的请求,在服务器端接收到后需要多个Servlet之间的协同处理来共同 完 成!
- 特点:
请求转发: 一次请求,浏览器地址栏地址不改变!
重定向: 两次请求,浏览器地址栏地址为最后一次请求的地址!
- 使用场景:
查询请求: 请求转发,Servlet负责请求数据的处理,转发到Jsp进行页面的拼接,然后 后响应!
增删改请求: 重定向,避免表单的重复提交。
在 Spring MVC 框架中,默认情况下都使用转发进行寻找资源。如下图
等同于下面的写法:
解释:在资源路径前面添加 forward: 表示转发。因为写不写 forward: 都是转发,所以为了代码写起 来简单一些,多省略 forward:
如果希望使用重定向跳转到其他资源,只能在资源路径最前面明确添加 redirect:,下面代码就 是使用重定向方式的写法,不可省略。
2. WEB-INF资源目录
- 在平时学习过程中,我们多会把 JSP 文件直接放入到 webapp 目录中,或在 webapp 下新建一个目录把页面资源放入到目录中,这种情况 JSP 都是可以通过浏览器直接访问的。
- 如果从安全性等方面考虑不希望客户端通过浏览器直接访问对应的资源。 我们就可以把资源放入到 WEB-INF 目录中。 Java Web 项目中规定:WEB-INF 中资源是不允许被客户端直接访问,需要先访问控制器,通过控制器的转发来访问这些资源 。
如下图所示,通过浏览器我们不能直接访问add.jsp页面。
下面通过控制层发出请求去访问,如下图所示,访问成功!
但是现在又有一个麻烦,看到下面很长的路径没有,如果每访问一个页面都要写这样长的路径,又重复又麻烦,这可不是一个高级程序员写的代码,所以下面有了视图解析器。
3. 视图解析器
- Spring MVC 定义了 ViewResolver 和 View 接口,实现在浏览器中呈现模型,而无需绑定到 特定的视图技术。 提供视图名称和实际视图之间的映射。
- DispatcherServlet 在接收到请求后调用单元方法处理请求,然后接收单元方法的返回值后 DispatcherServlet 会将 model 对象和单元方法的返回值封装到 modelAndView 对象中,然后 调用 ViewResolver 视图解析器的实现类对象的 buildView 方法来解析 ModelAndView 对象生 成对用的 View 视图对象,然后再调用 View 对象的 render 方法完成物理视图跳转的准备工作 并跳转真正的物理视图。在这里要注意,我们使用不同的视图技术,需要调用不同的视图解析 器来解析 modelAndView。【了解即可】
使使用:只需在springMVC的配置文件中配置视图解析器即可,如下。
<!--配置视图解析器--><bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/page/"/><property name="suffix" value=".jsp"/></bean>
如下图,然后再在浏览器中访问同样可以到页面 ,这是因为配置视图解析器之后,当请求转发时,会走视图解析器,自动会给你在前面拼接 /WEB-INF/page/ 在后面拼接 .jsp,然后整体的路径就是webapp/WEB-INF/page/add.jsp,因此简洁了很多。
注意:
- 当自定义视图解析器后,返回值前面和后面都会固定拼接字符串(在没有使用其他注解情况 下)。但是如果控制单元执行完,并不希望跳转到视图,而是跳转到控制器,这时需要在返回 值前面明确添加 forward: 或 redirect: ,这样就不走视图解析器了
上面表述可以总结为:
如果单元方法的返回值没有使用forward关键字,则会触发视图解析的二次拼接功能
如果单元方法的返回值使用了forward关键字,则单元方法的返回值就是要请求转发的资源路径!
4. 静态资源放行
- 按照 SpringMVC 的使用流程,在 web.xml 文件中配置 DispatcherServlet 的拦截范围, 而我们配置的拦截范围为 ”/” , 表示拦截除 jsp 请求以外的所有请求。这样 js,css, 图片等静态资源的请求,也会被拦截。
- 因此Spring MVC 支持静态资源配置,当 URL 满足指定路径要求时不再去找控制单元,而是直接转发到特定路径中静态资源。
在SpringMVC.xml中配置如下,但请求css,js等资源时,不会被拦截。
<!--01 配置静态资源放行-->
<!--mapping:当URI是什么样格式时,不再执行控制器,而是寻找静态资源。 ** 是通配符,
表示任意层路径 -->
<!--location:去哪个目录中寻找静态资源。mapping中**的值是什么,就去location目录中
找对应资源-->
<!--例如URL是http://localhost:8080/wollo/js/jquery.js 其中mapping的**就是j
query.js,就会去location的/js/目录中寻找jquery.js -->
<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
<mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
<mvc:resources mapping="/images/**" location="/images/"></mvc:resources
><!--02 配置静态资源放行,将上面的统一放到static中一起放行--><mvc:resources mapping="/static/**" location="/static/"></mvc:resources>
如下图所示,访问my.css正常情况会被拦截,配置之后成功访问。
注意:静态资源放行的目录必须和webpp下的静态资源目录名称一致!!