视图、转发与重定向、静态资源处理

目录

视图

默认视图

视图机制原理

自定义视图

请求转发与重定向

静态资源处理


视图

每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性

可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高

默认是最低优先级,Integer.MAX_VALUE

Controller -> 视图解析器(mvc提供) -> 视图 -> 结果页面

默认视图

默认视图交给InternalResourceViewResolver视图解析器来处理

默认视图解析器一旦执行,就不会执行自定义视图解析器

需要手动配置一下

最后返回的路径直接拼接:"prefix"+name+"suffix"

视图机制原理

设我们SpringMVC中使用了JSP作为视图。

第一步:浏览器发送请求给web服务器

第二步:Spring MVC中的DispatcherServlet接收到请求

第三步:DispatcherServlet根据请求路径分发到对应的Controller 第四步:DispatcherServlet调用Controller的方法

第五步:Controller的方法处理业务并返回一个逻辑视图名给DispatcherServlet

第六步:DispatcherServlet调用InternalResourceViewResolverresolveViewName方法,将逻辑视图名转换为物理视图名,并创建InternalResourceView对象返回给DispatcherServlet

第七步:DispatcherServlet再调用InternalResourceViewrender方法,render方法将模板语言转换为HTML代码,响应给浏览器,完成最终的渲染。

自定义视图

1、BeanNameViewResolver可以去解析自定义的视图

配置优先级,比默认解析器优先级高

XML 复制代码
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"></bean>

2、继承

MyView继承了AbstractView, 就可以作为一个视图使用

@Component(value = "myView"),该视图会注入到容器中, 名字是myView

return "myView"的底层实现:

1、在容器找id=myView

2、是否是View.class类型

3、return getBean("id",View.class),以接口形式返回

4、视图渲染,执行自定义视图的方法,跳转到结果页面

请求转发与重定向

请求转发forward,重定向redirect

如果都不写,默认请求转发, 默认或自定义视图****来处理

访问WEB-INF下面的资源必须请求转发(内部跳转到WEB-INF)

**forward或redirect:/路径,**会在服务器解析,自动拼接上工程路径(比如/mvc)

比如:工程路径:/mvc

return "forward:/WEB-INF/pages/login_ok.jsp"

服务器 解析成 /mvc/login_ok.jsp 给浏览器

第一个 / 又会在浏览器 解析成 http://localhost:8080

变成http://localhost:8080/mvc/login_ok.jsp

forward底层会创建 InternalResourceView视图对象
redirect底层会创建 RedirectView视图对象

静态资源处理

未在web.xml中配置映射,如果在springmvc配置文件中设置<url-pattern>/</url-pattern>,会替代tomcat中的default导致所有的静态资源都给中央控制器来处理,而不是tomcat,前端控制器没有访问静态资源的能力,所以所有静态资源都是404

方法一

在springmvc配置文件加入

mvc:resources和@RequestMapping有一定的冲突

XML 复制代码
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>

开启默认Servlet处理之后,mvc会在容器创建DefaultServletHttpRequestHandler处理器对象,对进入DispatcherServlet的URL进行筛查,如果是静态资源的请求,交给Tomcat的default来处理

方法二

将images、html、js文件夹放入webapp/static目录下

XML 复制代码
<mvc:annotation-driven/>
<mvc:resources mapping="/static/**" location="/static/" />
相关推荐
fouryears_234171 天前
@PathVariable与@RequestParam的区别
java·spring·mvc·springboot
王柏龙2 天前
Asp.net core mvc中TagHelper的GetChildContentAsync和Content区别
mvc·.netcore
hqxstudying2 天前
J2EE模式---业务代表模式
java·前端·python·设计模式·java-ee·mvc
OEC小胖胖2 天前
架构篇(一):告别MVC/MVP,为何“组件化”是现代前端的唯一答案?
前端·架构·mvc
汤姆大聪明2 天前
SSM框架中关于Spring MVC的技术问题
java·spring·mvc
张同学的IT技术日记2 天前
重构 MVC:让经典架构完美适配复杂智能系统的后端业务逻辑层(内附框架示例代码)
c++·后端·重构·架构·mvc·软件开发·工程应用
hqxstudying3 天前
J2EE模式---组合实体模式
java·数据库·spring·oracle·java-ee·mvc
趙卋傑3 天前
Spring MVC
java·开发语言·后端·spring·mvc
fouryears_234173 天前
Spring MVC 统一响应格式:ResponseBodyAdvice 从浅入深
java·spring·mvc·springboot
南清的coding日记3 天前
苍穹外卖DAY11
java·开发语言·spring boot·spring·mvc·mybatis