ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向和转发,以及访问 [打印本页]

作者: 拉不拉稀肚拉稀    时间: 2024-7-14 15:51
标题: Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向和转发,以及访问
1. Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向和转发,以及访问静态资源

@
目次

1.1 Spring MVC视图支持可配置

在Spring MVC中,视图 View 是支持定制的,比方我们之前在 springmvc.xml 文件中进行了如下的配置:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. <mvc:annotation-driven />
  4.    
  5. <mvc:default-servlet-handler><mvc:annotation-driven />
  6.    
  7. <mvc:default-servlet-handler> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. <mvc:annotation-driven />
  9.    
  10. <mvc:default-servlet-handler><mvc:annotation-driven />
  11.    
  12. <mvc:default-servlet-handler> xmlns:context="http://www.springframework.org/schema/context"
  13. <mvc:annotation-driven />
  14.    
  15. <mvc:default-servlet-handler><mvc:annotation-driven />
  16.    
  17. <mvc:default-servlet-handler> 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">
  18. <mvc:annotation-driven />
  19.    
  20. <mvc:default-servlet-handler> <context:component-scan base-package="com.rainbowsea.springmvc.controller"></context:component-scan>
  21. <mvc:annotation-driven />
  22.    
  23. <mvc:default-servlet-handler>
  24. <mvc:annotation-driven />
  25.    
  26. <mvc:default-servlet-handler> <bean id="thymeleafViewResolver" >
  27. <mvc:annotation-driven />
  28.    
  29. <mvc:default-servlet-handler><mvc:annotation-driven />
  30.    
  31. <mvc:default-servlet-handler>  
  32. <mvc:annotation-driven />
  33.    
  34. <mvc:default-servlet-handler><mvc:annotation-driven />
  35.    
  36. <mvc:default-servlet-handler>  <property name="characterEncoding" value="UTF-8"/>
  37. <mvc:annotation-driven />
  38.    
  39. <mvc:default-servlet-handler><mvc:annotation-driven />
  40.    
  41. <mvc:default-servlet-handler>  
  42. <mvc:annotation-driven />
  43.    
  44. <mvc:default-servlet-handler><mvc:annotation-driven />
  45.    
  46. <mvc:default-servlet-handler>  <property name="order" value="1"/>
  47. <mvc:annotation-driven />
  48.    
  49. <mvc:default-servlet-handler><mvc:annotation-driven />
  50.    
  51. <mvc:default-servlet-handler>  
  52. <mvc:annotation-driven />
  53.    
  54. <mvc:default-servlet-handler><mvc:annotation-driven />
  55.    
  56. <mvc:default-servlet-handler>  <property name="templateEngine">
  57. <mvc:annotation-driven />
  58.    
  59. <mvc:default-servlet-handler><mvc:annotation-driven />
  60.    
  61. <mvc:default-servlet-handler><mvc:annotation-driven />
  62.    
  63. <mvc:default-servlet-handler><mvc:annotation-driven />
  64.    
  65. <mvc:default-servlet-handler><bean >
  66. <mvc:annotation-driven />
  67.    
  68. <mvc:default-servlet-handler><mvc:annotation-driven />
  69.    
  70. <mvc:default-servlet-handler><mvc:annotation-driven />
  71.    
  72. <mvc:default-servlet-handler><mvc:annotation-driven />
  73.    
  74. <mvc:default-servlet-handler><mvc:annotation-driven />
  75.    
  76. <mvc:default-servlet-handler>
  77. <mvc:annotation-driven />
  78.    
  79. <mvc:default-servlet-handler><mvc:annotation-driven />
  80.    
  81. <mvc:default-servlet-handler><mvc:annotation-driven />
  82.    
  83. <mvc:default-servlet-handler><mvc:annotation-driven />
  84.    
  85. <mvc:default-servlet-handler><mvc:annotation-driven />
  86.    
  87. <mvc:default-servlet-handler> <property name="templateResolver">
  88. <mvc:annotation-driven />
  89.    
  90. <mvc:default-servlet-handler><mvc:annotation-driven />
  91.    
  92. <mvc:default-servlet-handler><mvc:annotation-driven />
  93.    
  94. <mvc:default-servlet-handler><mvc:annotation-driven />
  95.    
  96. <mvc:default-servlet-handler><mvc:annotation-driven />
  97.    
  98. <mvc:default-servlet-handler><mvc:annotation-driven />
  99.    
  100. <mvc:default-servlet-handler>  <bean >
  101. <mvc:annotation-driven />
  102.    
  103. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  104. <mvc:annotation-driven />
  105.    
  106. <mvc:default-servlet-handler><mvc:annotation-driven />
  107.    
  108. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  109. <mvc:annotation-driven />
  110.    
  111. <mvc:default-servlet-handler><mvc:annotation-driven />
  112.    
  113. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  114. <mvc:annotation-driven />
  115.    
  116. <mvc:default-servlet-handler> </bean>
  117. <mvc:annotation-driven />
  118.    
  119. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  120. <mvc:annotation-driven />
  121.    
  122. <mvc:default-servlet-handler><mvc:annotation-driven />
  123.    
  124. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  125. <mvc:annotation-driven />
  126.    
  127. <mvc:default-servlet-handler><mvc:annotation-driven />
  128.    
  129. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  130. <mvc:annotation-driven />
  131.    
  132. <mvc:default-servlet-handler> </bean><property name="prefix" value="/WEB-INF/templates/"/>
  133. <mvc:annotation-driven />
  134.    
  135. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  136. <mvc:annotation-driven />
  137.    
  138. <mvc:default-servlet-handler><mvc:annotation-driven />
  139.    
  140. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  141. <mvc:annotation-driven />
  142.    
  143. <mvc:default-servlet-handler><mvc:annotation-driven />
  144.    
  145. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  146. <mvc:annotation-driven />
  147.    
  148. <mvc:default-servlet-handler> </bean>
  149. <mvc:annotation-driven />
  150.    
  151. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  152. <mvc:annotation-driven />
  153.    
  154. <mvc:default-servlet-handler><mvc:annotation-driven />
  155.    
  156. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  157. <mvc:annotation-driven />
  158.    
  159. <mvc:default-servlet-handler><mvc:annotation-driven />
  160.    
  161. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  162. <mvc:annotation-driven />
  163.    
  164. <mvc:default-servlet-handler> </bean><property name="suffix" value=".html"/>
  165. <mvc:annotation-driven />
  166.    
  167. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  168. <mvc:annotation-driven />
  169.    
  170. <mvc:default-servlet-handler><mvc:annotation-driven />
  171.    
  172. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  173. <mvc:annotation-driven />
  174.    
  175. <mvc:default-servlet-handler><mvc:annotation-driven />
  176.    
  177. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  178. <mvc:annotation-driven />
  179.    
  180. <mvc:default-servlet-handler> </bean>
  181. <mvc:annotation-driven />
  182.    
  183. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  184. <mvc:annotation-driven />
  185.    
  186. <mvc:default-servlet-handler><mvc:annotation-driven />
  187.    
  188. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  189. <mvc:annotation-driven />
  190.    
  191. <mvc:default-servlet-handler><mvc:annotation-driven />
  192.    
  193. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  194. <mvc:annotation-driven />
  195.    
  196. <mvc:default-servlet-handler> </bean><property name="templateMode" value="HTML"/>
  197. <mvc:annotation-driven />
  198.    
  199. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  200. <mvc:annotation-driven />
  201.    
  202. <mvc:default-servlet-handler><mvc:annotation-driven />
  203.    
  204. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  205. <mvc:annotation-driven />
  206.    
  207. <mvc:default-servlet-handler><mvc:annotation-driven />
  208.    
  209. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  210. <mvc:annotation-driven />
  211.    
  212. <mvc:default-servlet-handler> </bean>
  213. <mvc:annotation-driven />
  214.    
  215. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  216. <mvc:annotation-driven />
  217.    
  218. <mvc:default-servlet-handler><mvc:annotation-driven />
  219.    
  220. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  221. <mvc:annotation-driven />
  222.    
  223. <mvc:default-servlet-handler><mvc:annotation-driven />
  224.    
  225. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  226. <mvc:annotation-driven />
  227.    
  228. <mvc:default-servlet-handler> </bean><property name="characterEncoding" value="UTF-8"/>
  229. <mvc:annotation-driven />
  230.    
  231. <mvc:default-servlet-handler><mvc:annotation-driven />
  232.    
  233. <mvc:default-servlet-handler><mvc:annotation-driven />
  234.    
  235. <mvc:default-servlet-handler><mvc:annotation-driven />
  236.    
  237. <mvc:default-servlet-handler><mvc:annotation-driven />
  238.    
  239. <mvc:default-servlet-handler><mvc:annotation-driven />
  240.    
  241. <mvc:default-servlet-handler>  </bean>
  242. <mvc:annotation-driven />
  243.    
  244. <mvc:default-servlet-handler><mvc:annotation-driven />
  245.    
  246. <mvc:default-servlet-handler><mvc:annotation-driven />
  247.    
  248. <mvc:default-servlet-handler><mvc:annotation-driven />
  249.    
  250. <mvc:default-servlet-handler><mvc:annotation-driven />
  251.    
  252. <mvc:default-servlet-handler> </property>
  253. <mvc:annotation-driven />
  254.    
  255. <mvc:default-servlet-handler><mvc:annotation-driven />
  256.    
  257. <mvc:default-servlet-handler><mvc:annotation-driven />
  258.    
  259. <mvc:default-servlet-handler><mvc:annotation-driven />
  260.    
  261. <mvc:default-servlet-handler></bean>
  262. <mvc:annotation-driven />
  263.    
  264. <mvc:default-servlet-handler><mvc:annotation-driven />
  265.    
  266. <mvc:default-servlet-handler>  </property>
  267. <mvc:annotation-driven />
  268.    
  269. <mvc:default-servlet-handler> </bean>
  270. </beans>
复制代码
以上的配置表明当前 Spring MVC 框架使用的视图 View 是 Thymelea 的。
如果你必要换成其他的视图 View,修改以上的配置即可。这样就可以非常轻松的完成视图  View 的扩展。
这种计划是完成符合 OCP 开闭原则 的。视图 View 和框架是解耦合的,耦合度低扩展能力强。
视图 View 可以通过配置文件进行灵活切换。
1.2 Spring MVC支持的常见视图

Spring MVC支持的常见视图包罗:
1.3 实现视图机制的核心接口

实现视图的核心类与接口包罗:
DispatcherServlet类(前端控制器):

ViewResolver 接口(视图剖析器)

View 接口(视图):

ViewResolverRegistry (视图剖析器注册器):
负责在 web 容器(Tomcat)启动的时间,完成视图剖析器的注册。
如果有多个视图剖析器,会将视图剖析器对象按照 order 的配置放入 List 集合。
总结:
实现视图的核心类和接口包罗:ViewResolverRegistry,DispatcherServlet,ViewResolver,View
如果你想定制自己的视图组件:
如果 Spring MVC 框架中使用 Thymeleaf 作为视图技术。那么相关的类包罗:
1.4 实现视图机制的原理描述

假设我们Spring MVC 中使用了 Thymeleaf 作为视图:
假设我们 Spring MVC 中使用了JSP作为视图:
1.5 逻辑视图名到物理视图名的转换

逻辑视图名最终转换的物理视图名是什么,取决再 springmvc.xml 文件中视图剖析器的配置: 假如视图剖析器配置的是 ThymeleafViewResolver,如下:
  1. <bean id="thymeleafViewResolver" >
  2. <mvc:annotation-driven />
  3.    
  4. <mvc:default-servlet-handler> <property name="characterEncoding" value="UTF-8"/>
  5. <mvc:annotation-driven />
  6.    
  7. <mvc:default-servlet-handler> <property name="order" value="1"/>
  8. <mvc:annotation-driven />
  9.    
  10. <mvc:default-servlet-handler> <property name="templateEngine">
  11. <mvc:annotation-driven />
  12.    
  13. <mvc:default-servlet-handler><mvc:annotation-driven />
  14.    
  15. <mvc:default-servlet-handler>  <bean >
  16. <mvc:annotation-driven />
  17.    
  18. <mvc:default-servlet-handler><mvc:annotation-driven />
  19.    
  20. <mvc:default-servlet-handler><mvc:annotation-driven />
  21.    
  22. <mvc:default-servlet-handler><mvc:annotation-driven />
  23.    
  24. <mvc:default-servlet-handler><property name="templateResolver">
  25. <mvc:annotation-driven />
  26.    
  27. <mvc:default-servlet-handler><mvc:annotation-driven />
  28.    
  29. <mvc:default-servlet-handler><mvc:annotation-driven />
  30.    
  31. <mvc:default-servlet-handler><mvc:annotation-driven />
  32.    
  33. <mvc:default-servlet-handler><mvc:annotation-driven />
  34.    
  35. <mvc:default-servlet-handler> <bean >
  36. <mvc:annotation-driven />
  37.    
  38. <mvc:default-servlet-handler><mvc:annotation-driven />
  39.    
  40. <mvc:default-servlet-handler><mvc:annotation-driven />
  41.    
  42. <mvc:default-servlet-handler><mvc:annotation-driven />
  43.    
  44. <mvc:default-servlet-handler><mvc:annotation-driven />
  45.    
  46. <mvc:default-servlet-handler><mvc:annotation-driven />
  47.    
  48. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/templates/"/>
  49. <mvc:annotation-driven />
  50.    
  51. <mvc:default-servlet-handler><mvc:annotation-driven />
  52.    
  53. <mvc:default-servlet-handler><mvc:annotation-driven />
  54.    
  55. <mvc:default-servlet-handler><mvc:annotation-driven />
  56.    
  57. <mvc:default-servlet-handler><mvc:annotation-driven />
  58.    
  59. <mvc:default-servlet-handler><mvc:annotation-driven />
  60.    
  61. <mvc:default-servlet-handler>  <property name="suffix" value=".html"/>
  62. <mvc:annotation-driven />
  63.    
  64. <mvc:default-servlet-handler><mvc:annotation-driven />
  65.    
  66. <mvc:default-servlet-handler><mvc:annotation-driven />
  67.    
  68. <mvc:default-servlet-handler><mvc:annotation-driven />
  69.    
  70. <mvc:default-servlet-handler><mvc:annotation-driven />
  71.    
  72. <mvc:default-servlet-handler><mvc:annotation-driven />
  73.    
  74. <mvc:default-servlet-handler>  <property name="templateMode" value="HTML"/>
  75. <mvc:annotation-driven />
  76.    
  77. <mvc:default-servlet-handler><mvc:annotation-driven />
  78.    
  79. <mvc:default-servlet-handler><mvc:annotation-driven />
  80.    
  81. <mvc:default-servlet-handler><mvc:annotation-driven />
  82.    
  83. <mvc:default-servlet-handler><mvc:annotation-driven />
  84.    
  85. <mvc:default-servlet-handler><mvc:annotation-driven />
  86.    
  87. <mvc:default-servlet-handler>  <property name="characterEncoding" value="UTF-8"/>
  88. <mvc:annotation-driven />
  89.    
  90. <mvc:default-servlet-handler><mvc:annotation-driven />
  91.    
  92. <mvc:default-servlet-handler><mvc:annotation-driven />
  93.    
  94. <mvc:default-servlet-handler><mvc:annotation-driven />
  95.    
  96. <mvc:default-servlet-handler><mvc:annotation-driven />
  97.    
  98. <mvc:default-servlet-handler> </bean>
  99. <mvc:annotation-driven />
  100.    
  101. <mvc:default-servlet-handler><mvc:annotation-driven />
  102.    
  103. <mvc:default-servlet-handler><mvc:annotation-driven />
  104.    
  105. <mvc:default-servlet-handler><mvc:annotation-driven />
  106.    
  107. <mvc:default-servlet-handler></property>
  108. <mvc:annotation-driven />
  109.    
  110. <mvc:default-servlet-handler><mvc:annotation-driven />
  111.    
  112. <mvc:default-servlet-handler>  </bean>
  113. <mvc:annotation-driven />
  114.    
  115. <mvc:default-servlet-handler> </property>
  116. </bean>
复制代码
以下程序返回逻辑视图名:index
  1. package com.rainbowsea.springmvc.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller  // 交给 Spring IOC 容器管理起来
  5. public class IndexController {
  6. <mvc:annotation-driven />
  7.    
  8. <mvc:default-servlet-handler> @RequestMapping("/")
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler> public String index() {
  12. <mvc:annotation-driven />
  13.    
  14. <mvc:default-servlet-handler><mvc:annotation-driven />
  15.    
  16. <mvc:default-servlet-handler>  return "index";
  17. <mvc:annotation-driven />
  18.    
  19. <mvc:default-servlet-handler> }
  20. }
复制代码
最终逻辑视图名 "index"  转换为物理视图名: /WEB-INF/templates/index.html

假如视图剖析器配置的是 InternalResourceViewResolver,如下:
  1. <mvc:annotation-driven />
  2.    
  3. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  4. <mvc:annotation-driven />
  5.    
  6. <mvc:default-servlet-handler><mvc:annotation-driven />
  7.    
  8. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler><mvc:annotation-driven />
  12.    
  13. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  14. <mvc:annotation-driven />
  15.    
  16. <mvc:default-servlet-handler> </bean>
复制代码
以下程序返回逻辑视图名:index
  1. package com.rainbowsea.springmvc.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller  // 交给 Spring IOC 容器管理起来
  5. public class IndexController {
  6. <mvc:annotation-driven />
  7.    
  8. <mvc:default-servlet-handler> @RequestMapping("/")
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler> public String index() {
  12. <mvc:annotation-driven />
  13.    
  14. <mvc:default-servlet-handler><mvc:annotation-driven />
  15.    
  16. <mvc:default-servlet-handler>  return "index";
  17. <mvc:annotation-driven />
  18.    
  19. <mvc:default-servlet-handler> }
  20. }
复制代码
最终逻辑视图名 "index"  转换为物理视图名:/ WEB-INF/templates/index.jsp

2. Thymeleaf视图

我们在学习前面内容的时间,采用的都是 Thymeleaf视图。我们再来测试一下,看看底层创建的视图对象是不是ThymeleafView
springmvc.xml 配置内容如下:
  1. <bean id="thymeleafViewResolver" >
  2. <mvc:annotation-driven />
  3.    
  4. <mvc:default-servlet-handler> <property name="characterEncoding" value="UTF-8"/>
  5. <mvc:annotation-driven />
  6.    
  7. <mvc:default-servlet-handler> <property name="order" value="1"/>
  8. <mvc:annotation-driven />
  9.    
  10. <mvc:default-servlet-handler> <property name="templateEngine">
  11. <mvc:annotation-driven />
  12.    
  13. <mvc:default-servlet-handler><mvc:annotation-driven />
  14.    
  15. <mvc:default-servlet-handler>  <bean >
  16. <mvc:annotation-driven />
  17.    
  18. <mvc:default-servlet-handler><mvc:annotation-driven />
  19.    
  20. <mvc:default-servlet-handler><mvc:annotation-driven />
  21.    
  22. <mvc:default-servlet-handler><mvc:annotation-driven />
  23.    
  24. <mvc:default-servlet-handler><property name="templateResolver">
  25. <mvc:annotation-driven />
  26.    
  27. <mvc:default-servlet-handler><mvc:annotation-driven />
  28.    
  29. <mvc:default-servlet-handler><mvc:annotation-driven />
  30.    
  31. <mvc:default-servlet-handler><mvc:annotation-driven />
  32.    
  33. <mvc:default-servlet-handler><mvc:annotation-driven />
  34.    
  35. <mvc:default-servlet-handler> <bean >
  36. <mvc:annotation-driven />
  37.    
  38. <mvc:default-servlet-handler><mvc:annotation-driven />
  39.    
  40. <mvc:default-servlet-handler><mvc:annotation-driven />
  41.    
  42. <mvc:default-servlet-handler><mvc:annotation-driven />
  43.    
  44. <mvc:default-servlet-handler><mvc:annotation-driven />
  45.    
  46. <mvc:default-servlet-handler><mvc:annotation-driven />
  47.    
  48. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/templates/"/>
  49. <mvc:annotation-driven />
  50.    
  51. <mvc:default-servlet-handler><mvc:annotation-driven />
  52.    
  53. <mvc:default-servlet-handler><mvc:annotation-driven />
  54.    
  55. <mvc:default-servlet-handler><mvc:annotation-driven />
  56.    
  57. <mvc:default-servlet-handler><mvc:annotation-driven />
  58.    
  59. <mvc:default-servlet-handler><mvc:annotation-driven />
  60.    
  61. <mvc:default-servlet-handler>  <property name="suffix" value=".html"/>
  62. <mvc:annotation-driven />
  63.    
  64. <mvc:default-servlet-handler><mvc:annotation-driven />
  65.    
  66. <mvc:default-servlet-handler><mvc:annotation-driven />
  67.    
  68. <mvc:default-servlet-handler><mvc:annotation-driven />
  69.    
  70. <mvc:default-servlet-handler><mvc:annotation-driven />
  71.    
  72. <mvc:default-servlet-handler><mvc:annotation-driven />
  73.    
  74. <mvc:default-servlet-handler>  <property name="templateMode" value="HTML"/>
  75. <mvc:annotation-driven />
  76.    
  77. <mvc:default-servlet-handler><mvc:annotation-driven />
  78.    
  79. <mvc:default-servlet-handler><mvc:annotation-driven />
  80.    
  81. <mvc:default-servlet-handler><mvc:annotation-driven />
  82.    
  83. <mvc:default-servlet-handler><mvc:annotation-driven />
  84.    
  85. <mvc:default-servlet-handler><mvc:annotation-driven />
  86.    
  87. <mvc:default-servlet-handler>  <property name="characterEncoding" value="UTF-8"/>
  88. <mvc:annotation-driven />
  89.    
  90. <mvc:default-servlet-handler><mvc:annotation-driven />
  91.    
  92. <mvc:default-servlet-handler><mvc:annotation-driven />
  93.    
  94. <mvc:default-servlet-handler><mvc:annotation-driven />
  95.    
  96. <mvc:default-servlet-handler><mvc:annotation-driven />
  97.    
  98. <mvc:default-servlet-handler> </bean>
  99. <mvc:annotation-driven />
  100.    
  101. <mvc:default-servlet-handler><mvc:annotation-driven />
  102.    
  103. <mvc:default-servlet-handler><mvc:annotation-driven />
  104.    
  105. <mvc:default-servlet-handler><mvc:annotation-driven />
  106.    
  107. <mvc:default-servlet-handler></property>
  108. <mvc:annotation-driven />
  109.    
  110. <mvc:default-servlet-handler><mvc:annotation-driven />
  111.    
  112. <mvc:default-servlet-handler>  </bean>
  113. <mvc:annotation-driven />
  114.    
  115. <mvc:default-servlet-handler> </property>
  116. </bean><mvc:annotation-driven />
  117.    
  118. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  119. <mvc:annotation-driven />
  120.    
  121. <mvc:default-servlet-handler><mvc:annotation-driven />
  122.    
  123. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  124. <mvc:annotation-driven />
  125.    
  126. <mvc:default-servlet-handler><mvc:annotation-driven />
  127.    
  128. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  129. <mvc:annotation-driven />
  130.    
  131. <mvc:default-servlet-handler> </bean><mvc:annotation-driven />
  132.    
  133. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  134. <mvc:annotation-driven />
  135.    
  136. <mvc:default-servlet-handler><mvc:annotation-driven />
  137.    
  138. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  139. <mvc:annotation-driven />
  140.    
  141. <mvc:default-servlet-handler><mvc:annotation-driven />
  142.    
  143. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  144. <mvc:annotation-driven />
  145.    
  146. <mvc:default-servlet-handler> </bean><mvc:annotation-driven />
  147.    
  148. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  149. <mvc:annotation-driven />
  150.    
  151. <mvc:default-servlet-handler><mvc:annotation-driven />
  152.    
  153. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  154. <mvc:annotation-driven />
  155.    
  156. <mvc:default-servlet-handler><mvc:annotation-driven />
  157.    
  158. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  159. <mvc:annotation-driven />
  160.    
  161. <mvc:default-servlet-handler> </bean><mvc:annotation-driven />
  162.    
  163. <mvc:default-servlet-handler>
复制代码
Controller代码如下:
  1. package com.rainbowsea.springmvc.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller  // 交给 Spring IOC 容器管理起来
  5. public class IndexController {
  6. <mvc:annotation-driven />
  7.    
  8. <mvc:default-servlet-handler> @RequestMapping("/")
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler> public String index() {
  12. <mvc:annotation-driven />
  13.    
  14. <mvc:default-servlet-handler><mvc:annotation-driven />
  15.    
  16. <mvc:default-servlet-handler>  return "index";
  17. <mvc:annotation-driven />
  18.    
  19. <mvc:default-servlet-handler> }
  20. }
复制代码
视图页面:
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <mvc:annotation-driven />
  5.    
  6. <mvc:default-servlet-handler> <meta charset="UTF-8">
  7. <mvc:annotation-driven />
  8.    
  9. <mvc:default-servlet-handler> <title>index page</title>
  10. </head>
  11. <body>
  12. <h1>index page</h1>
  13. </body>
  14. </html>
复制代码
添加断点:在 DispatcherServlet 的 doDispatch( )方法的下图位置添加断点。

启动Tomcat,在浏览器地址栏上发送请求:http://localhost:8080/springmvc/index

程序走到以上位置,这行代码是调用对应的Controller,并且Controller最终会返回 ModelAndView对象:mv 按照我们之前所讲,返回 mv 之后,接下来就是视图处置惩罚与渲染,接着往下走,走到下图这一行:

这个方法的作用是处置惩罚分发结果,就是在这个方法当中进行了视图的处置惩罚与渲染,进入该方法:

进去之后走到上图位置:这个方法就是用来渲染页面的方法,再进入该方法:

走到上图位置就可以看到底层创建的是 ThymeleafView 对象。
3. JSP视图(了解)

我们再来跟一下源码,看看 JSP 视图底层创建的是不是 InternalResourceView对象。
我们前面说过 InternalResourceView是SpringMVC框架内置的,翻译为内部资源视图,SpringMVC把JSP看做是内部资源。可见JSP在之前的技术栈中有很高的职位。
不外,当下盛行的开辟中JSP使用较少,这里不再详细讲解。只是测试一下。
springmvc.xml配置如下:
  1. <mvc:annotation-driven />
  2.    
  3. <mvc:default-servlet-handler> <bean id="jspViewResolver" >
  4. <mvc:annotation-driven />
  5.    
  6. <mvc:default-servlet-handler><mvc:annotation-driven />
  7.    
  8. <mvc:default-servlet-handler>  <property name="prefix" value="/WEB-INF/jsp/"></property>
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler><mvc:annotation-driven />
  12.    
  13. <mvc:default-servlet-handler>  <property name="suffix" value=".jsp"></property>
  14. <mvc:annotation-driven />
  15.    
  16. <mvc:default-servlet-handler> </bean><mvc:annotation-driven />
  17.    
  18. <mvc:default-servlet-handler><mvc:annotation-driven />
  19.    
  20. <mvc:default-servlet-handler><mvc:annotation-driven />
  21.    
  22. <mvc:default-servlet-handler><mvc:annotation-driven />
  23.    
  24. <mvc:default-servlet-handler>
复制代码
Controller代码如下:
  1. package com.powernode.springmvc.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller
  5. public class IndexController {
  6. <mvc:annotation-driven />
  7.    
  8. <mvc:default-servlet-handler> @RequestMapping("/index")
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler> public String toIndex(){
  12. <mvc:annotation-driven />
  13.    
  14. <mvc:default-servlet-handler><mvc:annotation-driven />
  15.    
  16. <mvc:default-servlet-handler>  return "index";
  17. <mvc:annotation-driven />
  18.    
  19. <mvc:default-servlet-handler> }
  20. }
复制代码
视图页面:
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3.   <head>
  4. <mvc:annotation-driven />
  5.    
  6. <mvc:default-servlet-handler> <title>index jsp</title>
  7.   </head>
  8.   <body>
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler> <h1>index jsp!</h1>
  12.   </body>
  13. </html>
复制代码
启动web容器,添加断点跟踪:

通过测试得知:对于JSP 视图来说,底层创建的视图对象是 InternalResourceView。
4. 转发与重定向

4.1 转发和重定向区别

更多关于 Java Web 转发和重定向的内容,大家可以移步至:✏️✏️✏️ JavaWeb 中 “转发”与 “重定向”的区别_java 重定向与转发-CSDN博客
以上所描述的是使用原生Servlet API来完成转发和重定向。在Spring MVC中是如何转发和重定向的呢?
5. 在 Spring MVC 中 “重定向” 以及 “转发”

5.1 在 Spring MVC 中使用 forward 实现转发

在Spring MVC中默认就是转发的方式,我们之前所写的程序,都是转发的方式。
  1. 在 Spring MVC 中是怎么通过代码完成转发的?
  2. @RequestMapping("/a")
  3. public String toA() {
  4. <mvc:annotation-driven />
  5.    
  6. <mvc:default-servlet-handler> // 返回的是一个逻辑视图名称
  7. <mvc:annotation-driven />
  8.    
  9. <mvc:default-servlet-handler> return "a";  // 转发 ThymeleafView
  10. }
  11. 注意,当 return "a"; 的时候,返回一个逻辑视图名称,这种方式跳转到视图,默认采用的就是 forward 方式跳转过去的
复制代码
只不外都是转发到 Thymeleaf 的模板文件xxx.html上。
那么,在Spring MVC中如何转发到另一个Controller上呢?可以使用Spring MVC的forward
使用格式如下:
  1. return "forward:/b";转发到 /b ,这是一次请求,底层创建的视图对象是:internalResourceView对象
  2. 注意: "forward:/b" 这个已经不是逻辑视图名称了,是以转发的方式跳转,是一个资源路径。
复制代码
  1. package com.rainbowsea.springmvc.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller // 交给 Spring IOC 容器进行管理
  5. public class ForwardController {
  6. <mvc:annotation-driven />
  7.    
  8. <mvc:default-servlet-handler> @RequestMapping("/a")
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler> public String toA() {
  12. <mvc:annotation-driven />
  13.    
  14. <mvc:default-servlet-handler><mvc:annotation-driven />
  15.    
  16. <mvc:default-servlet-handler>  // 返回的是一个逻辑视图名称
  17. <mvc:annotation-driven />
  18.    
  19. <mvc:default-servlet-handler><mvc:annotation-driven />
  20.    
  21. <mvc:default-servlet-handler>  //return "a";
  22. <mvc:annotation-driven />
  23.    
  24. <mvc:default-servlet-handler><mvc:annotation-driven />
  25.    
  26. <mvc:default-servlet-handler>  // 采用SpringMVC的转发方式跳转到 /b
  27. <mvc:annotation-driven />
  28.    
  29. <mvc:default-servlet-handler><mvc:annotation-driven />
  30.    
  31. <mvc:default-servlet-handler>  // 转发的时候,格式有特殊要求,return "forward:下一个资源的路径"
  32. <mvc:annotation-driven />
  33.    
  34. <mvc:default-servlet-handler><mvc:annotation-driven />
  35.    
  36. <mvc:default-servlet-handler>  // 这种方式就不是逻辑视图名称了
  37. <mvc:annotation-driven />
  38.    
  39. <mvc:default-servlet-handler><mvc:annotation-driven />
  40.    
  41. <mvc:default-servlet-handler>  return "forward:/b"; // 创建InternalResourceView对象
  42. <mvc:annotation-driven />
  43.    
  44. <mvc:default-servlet-handler><mvc:annotation-driven />
  45.    
  46. <mvc:default-servlet-handler>  // 这个使用较多,重定向,url 中会显示资源路径
  47. <mvc:annotation-driven />
  48.    
  49. <mvc:default-servlet-handler><mvc:annotation-driven />
  50.    
  51. <mvc:default-servlet-handler>  // return "redirect:/b";
  52. <mvc:annotation-driven />
  53.    
  54. <mvc:default-servlet-handler> }
  55. <mvc:annotation-driven />
  56.    
  57. <mvc:default-servlet-handler> @RequestMapping("/b")
  58. <mvc:annotation-driven />
  59.    
  60. <mvc:default-servlet-handler> public String toB() {
  61. <mvc:annotation-driven />
  62.    
  63. <mvc:default-servlet-handler><mvc:annotation-driven />
  64.    
  65. <mvc:default-servlet-handler>  // 返回的是一个逻辑视图名称
  66. <mvc:annotation-driven />
  67.    
  68. <mvc:default-servlet-handler><mvc:annotation-driven />
  69.    
  70. <mvc:default-servlet-handler>  return "b";
  71. <mvc:annotation-driven />
  72.    
  73. <mvc:default-servlet-handler> }
  74. }
复制代码
视图页面:
A 视图页面编写:
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <mvc:annotation-driven />
  5.    
  6. <mvc:default-servlet-handler> <meta charset="UTF-8">
  7. <mvc:annotation-driven />
  8.    
  9. <mvc:default-servlet-handler> <title>page a </title>
  10. </head>
  11. <body>
  12. <h1>Page A !!!</h1>
  13. </body>
  14. </html>
复制代码
B 视图页面编写:
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <mvc:annotation-driven />
  5.    
  6. <mvc:default-servlet-handler> <meta charset="UTF-8">
  7. <mvc:annotation-driven />
  8.    
  9. <mvc:default-servlet-handler> <title>page b</title>
  10. </head>
  11. <body>
  12. <h1>Page B !!!</h1>
  13. </body>
  14. </html>
复制代码
启动服务器,浏览器地址栏上输入:http://localhost:8080/springmvc/a

通过测试,可以顺利的完成转发,转发是一次请求,可以看到地址栏上的地址没有发生改变。
我们来跟踪一下源码,看看以上程序执行过程中,创建了几个视图对象,分别是什么?

通过源码的跟踪得知:整个请求处置惩罚过程中,一共创建了两个视图对象 ?
这说明转发底层创建的视图对象是:InternalResourceView
思索:  既然会创建 InternalResourceView,应该会对应一个视图剖析器(InternalResourceViewResolver) ? 但是,我们在 springmvc.xml 文件中只配置了 ThymeleafViewResolver ,并没有配置 InternalResourceViewResolver ,这是为什么?
这是因为 forward: 后面的不是 逻辑视图名 ,而是一个 请求路径 ,因此,转发是不必要视图剖析器的。
另外,转发使用的是  InternalResourceView ,也说明了转发是内部资源的跳转,(Internal 是内部的意思,Resource 是资源的意思。)
5.2 在 Spring MVC 中使用 redirect 实现重定向

redirect  是专门完成重定向效果的。和 forward 语法雷同,只必要将之前的 return "forward:/b" 修改为 return "redirect:/b" 即可。

启动服务器,浏览器地址栏上输入:http://localhost:8080/springmvc/a

可见,重定向是两次请求,地址栏上的地址发生了改变。
可以看一下源码,在重定向的时间,Spring MVC创建哪个视图对象?

通过断点调试可以看出,当重定向的时间,SpringMVC会创建一个重定向视图对象:RedirectView。这个视图对象也是SpringMVC框架内置的。
另外可以看出重定向之后的第二次请求创建的视图对象就是ThymeleafView了。
注意:从springmvc应用重定向到springmvc2应用(跨域),语法是:
  1. @RequestMapping("/a")
  2. public String a(){
  3. <mvc:annotation-driven />
  4.    
  5. <mvc:default-servlet-handler> return "redirect:http://localhost:8080/springmvc2/b";
  6. }
复制代码
可以自行测试一下!!!
总结:
转发: return "forward:/b" 底层创建的是InternalResourceView对象
重定向: return "redirect:/b" 底层创建的是 RedirectView对象
6. mvc:view-controller 和  mvc:annotation-driven/  的共同使用

配置用于将某个请求映射到特定的视图上,即指定某一个 URL 请求到一个视图资源的映射,使得这个视图资源可以被访问。它相当于是一个独立的处置惩罚程序,不必要编写任何 Controller ,只必要指定 URL 和对应的视图名称就可以了。注意仅仅只是对应的 Controller 不必要写,此中对应的 html,jsp 或者是其他的视图是一定必要编写的。
一般情况下, 配置可以更换一些没有业务逻辑的 Controller,比方:首页,错误页面等。当用户访问配置的 URL时,框架将直接匹配到对应的视图,而无需再颠末其他控制器的处置惩罚。
  配置的格式如下:
  1. [/code]此中:
  2. [indent]
  3. [list]
  4. [*]path:被映射的 URL 路径。
  5. [*]view-name:对应的逻辑视图名称。
  6. [/list][/indent]比方,配置首页的映射:
  7. [align=center][img]https://img2024.cnblogs.com/blog/3084824/202407/3084824-20240714164735906-396377847.png[/img][/align]
  8. [code]
复制代码
上述配置将会匹配上访问应用程序的根路径,如:http://localhost:8080/springmvc。当用户在浏览器中访问该根路径时,就会直接渲染名为 index 的视图。
重点:
在SpringMVC中,如果在springmvc.xml文件中配置了 ,就必要同时在springmvc.xml文件中添加如下配置:< mvc:annotation-driven />
  1. [/code]该配置的作用是:启用Spring MVC的注解。
  2. [b]如果没有以上的配置,Controller 就无法访问到。访问之前的Controller会发生 404 问题。[/b]
  3. [size=6]7. Spring MVC 中访问静态资源[/size]
  4. 一个项目可能会包罗大量的静态资源,好比:css,js,images等。
  5. 由于我们 DispatcherServelt 的 url-pattern 的配置是 “/” 。
  6. [align=center][img]https://img2024.cnblogs.com/blog/3084824/202407/3084824-20240714164736389-1081866138.png[/img][/align]
  7. 之前我们说过,这个“/” 代表的是除了jsp 请求之外的所有请求,也就是说访问应用中的静态资源,也会走 [b]DispatcherServlet[/b] ,这会导致 404 错误,无法访问静态资源,如何解决,两种方案:
  8. [size=5]7.1 第一种方案:开启默认的 Servlet处置惩罚[/size]
  9. [code]第一种解决方案,开启默认的 Servlet处理
  10. <mvc:annotation-driven />
  11.    
  12. <mvc:default-servlet-handler> 在Tomcat服务器中提供了一个默认的Servlet,叫做: org.apache.catalina.servlets.DefaultServlet
  13. <mvc:annotation-driven />
  14.    
  15. <mvc:default-servlet-handler> 在CATALINA_HOME/conf/web.xml文件中,有这个默认的 Servlet的相关配置
  16. <mvc:annotation-driven />
  17.    
  18. <mvc:default-servlet-handler> 不过,这个默认的Servlet默认情况下是不开启的
  19. <mvc:annotation-driven />
  20.    
  21. <mvc:default-servlet-handler> 你需要在springmvc.xml文件中使用以下配置进行开启
  22. <mvc:annotation-driven />
  23.    
  24. <mvc:default-servlet-handler> <mvc:default-servlet-handler/>
  25. <mvc:annotation-driven />
  26.    
  27. <mvc:default-servlet-handler> <mvc:annotation-driven>  开启注解驱动
  28. // 注意:上面这两个配置是一起的,不可以分开来使用。
  29. > 开启之后的作用是:当你访问: http://localhost:8080/springmvc/static/img/touxiang.jpeg 的时候。
  30. > 默认先走:DispatcherServlet,如果发生 404 错误的话,会自动走DefaultServlet,然后 DefaultServlet 帮你定位
  31. > 静态资源
复制代码
起首必要在 springmvc.xml 文件中添加以下配置,开启 默认Servlet处置惩罚静态资源 功能:
注意:下面两个配置是一起的,不可以分开来(就是,这两个配置都要有才行,不可以缺少此中的恣意一个) 。
  1. [/code]然后在 web.xml 文件中指定什么样的路径走其他 Servlet:
  2. [code]<servlet>
  3. <mvc:annotation-driven />
  4.    
  5. <mvc:default-servlet-handler> <servlet-name>default</servlet-name>
  6. <mvc:annotation-driven />
  7.    
  8. <mvc:default-servlet-handler> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  9. <mvc:annotation-driven />
  10.    
  11. <mvc:default-servlet-handler> <init-param>
  12. <mvc:annotation-driven />
  13.    
  14. <mvc:default-servlet-handler><mvc:annotation-driven />
  15.    
  16. <mvc:default-servlet-handler>  <param-name>debug</param-name>
  17. <mvc:annotation-driven />
  18.    
  19. <mvc:default-servlet-handler><mvc:annotation-driven />
  20.    
  21. <mvc:default-servlet-handler>  <param-value>0</param-value>
  22. <mvc:annotation-driven />
  23.    
  24. <mvc:default-servlet-handler> </init-param>
  25. <mvc:annotation-driven />
  26.    
  27. <mvc:default-servlet-handler> <init-param>
  28. <mvc:annotation-driven />
  29.    
  30. <mvc:default-servlet-handler><mvc:annotation-driven />
  31.    
  32. <mvc:default-servlet-handler>  <param-name>listings</param-name>
  33. <mvc:annotation-driven />
  34.    
  35. <mvc:default-servlet-handler><mvc:annotation-driven />
  36.    
  37. <mvc:default-servlet-handler>  <param-value>false</param-value>
  38. <mvc:annotation-driven />
  39.    
  40. <mvc:default-servlet-handler> </init-param>
  41. <mvc:annotation-driven />
  42.    
  43. <mvc:default-servlet-handler> <load-on-startup>1</load-on-startup>
  44. </servlet>
  45. <servlet-mapping>
  46. <mvc:annotation-driven />
  47.    
  48. <mvc:default-servlet-handler> <servlet-name>default</servlet-name>
  49. <mvc:annotation-driven />
  50.    
  51. <mvc:default-servlet-handler> <url-pattern>/</url-pattern>
  52. </servlet-mapping>
复制代码
以上配置 url-pattern 使用的也是 “/”,和 DispatcherServlet 一样。体现的寄义是:同一个请求路径,先走 DispatcherServlet,如果找不到则走默认的Servlet。
默认的 Servlet 类中的代码已经由 Tomcat 服务器提供了实现了,一般不必要开辟者自己编写。
上面的示例中,我们指定了 org.apache.catalina.servlets.DefaultServlet ,则 Tomcat 服务器会自动将请求转发到该类处置惩罚,再处置惩罚时,该类会根据请求的 URL 去查询 Web 应用的静态资源(如 HTML,CSS,JavaScript 和图片等),并将其返回给用户。
告诉大家一个好消息,以上在  web.xml 文件中的配置,我们也可以省略了,因为在 Tomcat 服务器中已经为我们提前配置好了,在 CATALINA_HOME/conf/web.xml 文件中,如下:

因此我们只必要在springmvc.xml文件中启用这个默认的Servlet即可:
7.2 第二种方案:使用 mvc:resources 标签配置静态资源
  1. 第二种解决方案:配置静态资源处理,在springmvc.xml文件中添加如下配置
  2. <mvc:resources mapping="/static/**" location="/static/"></mvc:resources>
  3. <mvc:annotaiton-driven>  //开启注解驱动
  4. 同样这两个是一起配合使用的,不可以分开来
  5. > 作用:当请求路径符合 /static/**的时候,去 /static/位置找资源
复制代码
访问静态资源,也可以在springmvc.xml文件中添加如下的配置:
  1. [/code]体现凡是请求路径是"/static/"开始的,都会去"/static/"目次下找该资源。
  2. 注意:要想使用  配置,必须开启注解驱动
  3. [align=center][img]https://img2024.cnblogs.com/blog/3084824/202407/3084824-20240714164736390-813350012.png[/img][/align]
  4. [size=6]8. 总结:[/size]
  5. [indent][list=1]
  6. [*]ViewResolver 接口,视图剖析接口(ThymeleafViewResolver 实现了 ViewResolver 接口,InternalResourceViewResolver 也是实现了
  7. ViewResolver接口...),这个接口作用是将逻辑视图名称 转换为 物理视图名称,并且最终返回一个 view 接口对象,核心方法是:View resolveViewName(String viewName,Locale locale) throws Exception;
  8. [*]View 接口,视图接口(ThymeleafView 实现了接口,InternalResourceView 也实现了 View 接口)这个接口做什么的?这个接口负责模板语法的字符串转换成 html代码,并且将html代码响应给浏览器。(渲染)核心方法是 void render(@Nullable Map model,HttpServletRequest request, HttpServletResponse response) throws Exception;
  9. [*]注意:默认的
  10. [/list][code]在 Spring MVC 中是怎么通过代码完成转发的?
  11. @RequestMapping("/a")
  12. public String toA() {
  13. <mvc:annotation-driven />
  14.    
  15. <mvc:default-servlet-handler> // 返回的是一个逻辑视图名称
  16. <mvc:annotation-driven />
  17.    
  18. <mvc:default-servlet-handler> return "a";  // 转发 ThymeleafView
  19. }
  20. 注意,当 return "a"; 的时候,返回一个逻辑视图名称,这种方式跳转到视图,默认采用的就是 forward 方式跳转过去的
复制代码
[code][/code]9. 末了:

“在这个末了的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上汲取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的范畴奋斗。感谢你们,我们总会在某个时刻再次相遇。”


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4