网站建设的书籍,公司网站建设的需求,wordpress yzipicc,网站外链平台目录第一章、SpringMVC基本了解1.1 概述1.2 SpringMVC处理请求原理简图第二章、SpringMVC搭建框架1、搭建SpringMVC框架1.1 创建工程【web工程】1.2 导入jar包1.3 编写配置文件(1) web.xml注册DispatcherServlet(2) springmvc.xml(3) index.html1.4 编写请求处理器【Controller…
目录第一章、SpringMVC基本了解1.1 概述1.2 SpringMVC处理请求原理简图第二章、SpringMVC搭建框架1、搭建SpringMVC框架1.1 创建工程【web工程】1.2 导入jar包1.3 编写配置文件(1) web.xml注册DispatcherServlet(2) springmvc.xml(3) index.html1.4 编写请求处理器【Controller|Handler】1.5 准备页面进行测试第三章 RequestMapping详解3.1 RequestMapping注解位置3.2 RequestMapping注解属性3.3 RequestMapping支持Ant 风格的路径了解第四章 PathVariable 注解4.1 PathVariable注解位置4.2 PathVariable注解作用4.3 PathVariable注解属性第五章 REST【RESTful】风格CRUD5.1 REST的CRUD与传统风格CRUD对比5.2 REST风格CRUD优势5.3 实现PUTDELETE提交方式步骤5.4 源码解析HiddenHttpMethodFilter第六章 SpringMVC处理请求数据6.1 处理请求参数6.2 处理请头6.3 处理Cookie信息6.4 使用原生Servlet-API第七章 SpringMVC处理响应数据7.1 使用ModelAndView7.2 使用Model、ModelMap、Map7.3 SpringMVC中域对象第八章 SpringMVC处理请求响应乱码8.1 源码解析CharacterEncodingFilter8.2 处理请求与响应乱码第九章 SpringMVC视图及视图解析器9.1 视图解析器对象【ViewResolver】9.2 视图对象【View】第十章 源码解析SpringMVC工作原理10.1 Controller中方法的返回值问题10.2 视图及视图解析器源码第十一章 视图控制器重定向加载静态资源11.1 视图控制器11.2 重定向11.3 加载静态资源11.4 源码解析重定向原理第一章、SpringMVC基本了解
1.1 概述 SpringMVC是Spring子框架 SpringMVC是Spring 为【展现层|表示层|表述层|控制层】提供的基于 MVC 设计理念的优秀的 Web 框架是目前最主流的MVC 框架。 SpringMVC是非侵入式可以使用注解让普通java对象作为请求处理器【Controller】。 SpringMVC是用来代替Servlet Servlet作用 处理请求 将数据共享到域中 做出响应 跳转页面【视图】 1.2 SpringMVC处理请求原理简图
请求DispatcherServlet【前端控制器】 将请求交给Controller|Handler Controller|Handler【请求处理器】 处理请求返回数据模型 ModelAndView Model数据模型View视图对象或视图名 DispatcherServlet渲染视图 将数据共享到域中跳转页面【视图】 响应
第二章、SpringMVC搭建框架
1、搭建SpringMVC框架
1.1 创建工程【web工程】 web项目结构 web.xml ?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee
xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd
version4.0
/web-app添加web模块 添加web模块
1.2 导入jar包
E:\java-file\spring\spring_all\spring_mvc\pom.xml!--spring-webmvc--
dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.1/version
/dependency!-- 导入thymeleaf与spring5的整合包 --
dependencygroupIdorg.thymeleaf/groupIdartifactIdthymeleaf-spring5/artifactIdversion3.0.12.RELEASE/version
/dependency!--servlet-api--
dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/versionscopeprovided/scope
/dependency1.3 编写配置文件
(1) web.xml注册DispatcherServlet
url配置/init-param初始化参数:contextConfigLocation设置springmvc.xml配置文件路径【管理容器对象】load-on-startup设置DispatcherServlet优先级【启动服务器时创建当前Servlet对象】
// src/main/webapp/WEB-INF/web.xml
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!-- 注册DispatcherServlet【前端控制器】--servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class!-- 设置springmvc.xml配置文件路径【管理容器对象】--init-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:springmvc.xml/param-value/init-param!-- 设置DispatcherServlet优先级【启动服务器时创建当前Servlet对象】--load-on-startup1/load-on-startup/servletservlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mapping/web-app(2) springmvc.xml
开启组件扫描配置视图解析器【解析视图设置视图前缀后缀】 注意property nameprefix value/WEB-INF/pages/中的pages是可变的代表的是WEB-INF文件下的文件名
// src/main/resources/springmvc.xml
!-- - 开启组件扫描--
context:component-scan base-packagecom.atguigu/context:component-scan
!-- - 配置视图解析器【解析视图设置视图前缀后缀】--
bean classorg.thymeleaf.spring5.view.ThymeleafViewResolver
!-- 配置字符集属性--property namecharacterEncoding valueUTF-8/
!-- 配置模板引擎属性--property nametemplateEngine
!-- 配置内部bean --bean classorg.thymeleaf.spring5.SpringTemplateEngine
!-- 配置模块的解析器属性 --property nametemplateResolver
!-- 配置内部bean --bean classorg.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver!-- 视图前缀 --property nameprefix value/WEB-INF/pages//!-- 视图后缀 --property namesuffix value.html/
!-- property nametemplateMode valueHTML5/--!-- 配置字符集 --property namecharacterEncoding valueUTF-8 //bean/property/bean/property
/bean (3) index.html
demo演示
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8title首页/title
/head
bodya th:href{/HelloController}发送请求/a/body
/html1.4 编写请求处理器【Controller|Handler】
使用**Controller**注解标识请求处理器使用**RequestMapping**注解标识处理方法【URL】src/main/java/com/atguigu/controller/HelloController.javapackage com.atguigu.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;Controller // 标识当前类是一个请求处理器类
public class HelloController {/*** 配置url【/】会映射跳转到 WEB-INF/index.html* return*/RequestMapping(/)public String toIndex(){// /WEB-INF/pages/index.html// 物理视图名 视图前缀逻辑视图名视图后缀// 物理视图名 /WEB-INF/pages/ index .htmlreturn index;}
}
1.5 准备页面进行测试
tomcat集成到idea 测试
第三章 RequestMapping详解 RequestMapping注解作用为指定的类或方法设置相应URL 3.1 RequestMapping注解位置
书写在类上面 作用为当前类设置映射URL注意不能单独使用需要与方法上的RequestMapping配合使用 书写在方法上面 作用为当前方法设置映射URL注意可以单独使用 注意当类和类中方法都有RequestMapping注解时此时路径应为/类的RequestMapping路径/方法的RequestMapping路径 3.2 RequestMapping注解属性 value属性 类型String[]作用设置URL信息 path属性 类型String[]作用与value属性作用一致 method属性 类型RequestMethod[] public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}作用为当前URL【类或方法】设置请求方式【POST、DELETE、PUT、GET】 注意 默认情况所有请求方式均支持如请求方式不支持会报如下错误 405【Request method ‘GET’ not supported】 params 类型String[]作用为当前URL设置请求参数注意如设置指定请求参数但URL中未携带指定参数会报如下错误 400【Parameter conditions “lastName” not met for actual request parameters:】 headers 类型String[]作用为当前URL设置请求头信息注意如设置指定请求头但URL中未携带请求头会报如下错误 404请求资源未找到 示例代码 RequestMapping(value {/saveEmp,/insertEmp},method RequestMethod.GET,params lastNamelisi,headers User-AgentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36)
public String saveEmp(){System.out.println(添加员工信息);return SUCCESS;
}RequestMapping(method RequestMethod.POST)
public interface PostMapping {}
RequestMapping(method RequestMethod.GET)
public interface GetMapping {}
RequestMapping(method RequestMethod.PUT)
public interface PutMapping {}
RequestMapping(method RequestMethod.DELETE)
public interface DeleteMapping {}3.3 RequestMapping支持Ant 风格的路径了解 常用通配符 a) ?匹配一个字符 b) *匹配任意字符 c) **匹配多层路径 示例代码 RequestMapping(/testAnt/**)
public String testAnt(){System.out.println(testAnt!!!);return SUCCESS;
}第四章 PathVariable 注解
4.1 PathVariable注解位置 Target(ElementType.PARAMETER) 书写在参数前面
4.2 PathVariable注解作用 获取URL中占位符参数 占位符语法{} 示例代码 a th:href{/EmpController/testPathVariable/1001}测试PathVariable注解/abr/*** testPathVariable* return*/
RequestMapping(/testPathVariable/{empId})
public String testPathVariable(PathVariable(empId) Integer empId){System.out.println(empId empId);return SUCCESS;
}4.3 PathVariable注解属性
value属性 类型String作用设置占位符中的参数名 name属性 类型String作用与name属性的作用一致 required属性 类型boolean作用设置当前参数是否必须入参【默认值true】 true表示当前参数必须入参如未入参会报如下错误 Missing URI template variable ‘empId’ for method parameter of type Integer false表示当前参数不必须入参如未入参会装配null值
第五章 REST【RESTful】风格CRUD
5.1 REST的CRUD与传统风格CRUD对比 传统风格CRUD 功能 URL 请求方式增 /insertEmp POST删 /deleteEmp?empId1001 GET改 /updateEmp POST查 /selectEmp?empId1001 GET REST风格CRUD 功能 URL 请求方式增 /emp POST删 /emp/1001 DELETE改 /emp PUT查 /emp/1001 GET
5.2 REST风格CRUD优势
提高网站排名 排名方式 竞价排名技术排名 便于第三方平台对接
5.3 实现PUTDELETE提交方式步骤
注册过滤器HiddenHttpMethodFilter!-- 注册过滤器 --filterfilter-nameHiddenHttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class/filterfilter-mappingfilter-nameHiddenHttpMethodFilter/filter-name
!-- 所有的请求都需要经过过滤器 --url-pattern/*/url-pattern/filter-mapping 设置表单的提交方式为POST设置参数_methodPUT或_methodDELETEh3修改员工--PUT方式提交/h3
form th:action{/emp} methodpostinput typehidden name_method valuePUTinput typesubmit value修改员工信息
/formh3删除员工--DELETE方式提交/h3
form th:action{/emp/1001} methodpostinput typehidden name_method valueDELETEinput typesubmit value删除员工信息
/form5.4 源码解析HiddenHttpMethodFilter
public static final String DEFAULT_METHOD_PARAM _method;private String methodParam DEFAULT_METHOD_PARAM;Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {HttpServletRequest requestToUse request;if (POST.equals(request.getMethod()) request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) null) {String paramValue request.getParameter(this.methodParam);if (StringUtils.hasLength(paramValue)) {String method paramValue.toUpperCase(Locale.ENGLISH);if (ALLOWED_METHODS.contains(method)) {requestToUse new HttpMethodRequestWrapper(request, method);}}}filterChain.doFilter(requestToUse, response);
}
/*** Simple {link HttpServletRequest} wrapper that returns the supplied method for* {link HttpServletRequest#getMethod()}.*/private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {private final String method;public HttpMethodRequestWrapper(HttpServletRequest request, String method) {super(request);this.method method;}Overridepublic String getMethod() {return this.method;}}第六章 SpringMVC处理请求数据 使用Servlet处理请求数据 请求参数 String param request.getParameter(); 请求头 request.getHeader(); Cookie request.getCookies(); 6.1 处理请求参数
默认情况可以将请求参数名与入参参数名一致的参数自动入参【自动类型转换】
h2测试SpringMVC处理请求数据/h2
h3处理请求参数/h3
a th:href{/requestParam1(stuNamezs, stuAge18)}测试处理请求参数1/a/**
* 获取请求参数
* return
*/
RequestMapping(/requestParam1)
public String requestParam1(String stuName,Integer stuAge){System.out.println(stuName stuName);System.out.println(stuAge stuAge);return SUCCESS;
}SpringMVC支持POJO入参 要求请求参数名与POJO的属性名保持一致 示例代码 form th:action{/saveEmp} methodPOSTid:input typetext nameidbrLastName:input typetext namelastNamebrEmail:input typetext nameemailbrSalary:input typetext namesalarybrinput typesubmit value添加员工信息
/form/*** 获取请求参数POJO* return*/
RequestMapping(value /saveEmp,method RequestMethod.POST)
public String saveEmp(Employee employee){System.out.println(employee employee);return SUCCESS;
}RequestParam注解 作用如请求参数与入参参数名不一致时可以使用RequestParam注解设置入参参数名 属性 value 类型String作用设置需要入参的参数名 name 类型String作用与value属性作用一致 required 类型Boolean作用设置当前参数是否必须入参 true【默认值】表示当前参数必须入参如未入参会报如下错误 400【Required String parameter ‘sName’ is not present】 false表示当前参数不必须入参如未入参装配null值 defaultValue 类型String作用当装配数值为null时指定当前defaultValue默认值 示例代码 h2测试SpringMVC处理请求数据/h2
h3处理请求参数/h3
a th:href{/requestParam1(sNamezs, stuAge18)}测试处理请求参数1/a/*** 获取请求参数* return*/
RequestMapping(/requestParam1)
public String requestParam1(RequestParam(value sName,required false,defaultValue zhangsan)String stuName,Integer stuAge){System.out.println(stuName stuName);System.out.println(stuAge stuAge);return SUCCESS;
}6.2 处理请头 语法RequestHeader注解 属性 value 类型String作用设置需要获取请求头名称 name 类型String作用与value属性作用一致 required 类型boolean作用【默认值true】 true设置当前请求头是否为必须入参如未入参会报如下错误 400【Required String parameter ‘sName’ is not present】 false表示当前参数不必须入参如未入参装配null值 defaultValue 类型String作用当装配数值为null时指定当前defaultValue默认值 示例代码 a th:href{/testGetHeader}测试获取请求头/a/*** 获取请求头* return*/
RequestMapping(value /testGetHeader)
public String testGetHeader(RequestHeader(Accept-Language)String al,RequestHeader(Referer) String ref){System.out.println(al al);System.out.println(ref ref);return SUCCESS;
}6.3 处理Cookie信息 语法CookieValue获取Cookie数值 属性 value 类型String作用设置需要获取Cookie名称 name 类型String作用与value属性作用一致 required 类型boolean作用【默认值true】 true设置当前Cookie是否为必须入参如未入参会报如下错误 400【Required String parameter ‘sName’ is not present】 false表示当前Cookie不必须入参如未入参装配null值 defaultValue 类型String作用当装配数值为null时指定当前defaultValue默认值 示例代码 a th:href{/setCookie}设置Cookie信息/abr
a th:href{/getCookie}获取Cookie信息/abr/*** 设置Cookie* return*/RequestMapping(/setCookie)public String setCookie(HttpSession session){
// Cookie cookie new Cookie();System.out.println(session.getId() session.getId());return SUCCESS;}/*** 获取Cookie* return*/RequestMapping(/getCookie)public String getCookie(CookieValue(JSESSIONID)String cookieValue){System.out.println(cookieValue cookieValue);return SUCCESS;}6.4 使用原生Servlet-API
将原生Servlet相关对象入参即可
RequestMapping(/useRequestObject)
public String useRequestObject(HttpServletRequest request){}第七章 SpringMVC处理响应数据
7.1 使用ModelAndView 语法使用ModelAndView对象作为方法返回值类型处理响应数据 ModelAndView是模型数据与视图对象的集成对象源码如下 public class ModelAndView {/** View instance or view name String. *///view代表view对象或viewName【建议使用viewName】Nullableprivate Object view;/** Model Map. *///ModelMap集成LinkedHashMap,存储数据Nullableprivate ModelMap model;/**设置视图名称*/public void setViewName(Nullable String viewName) {this.view viewName;}/*** 获取视图名称*/Nullablepublic String getViewName() {return (this.view instanceof String ? (String) this.view : null);}/**获取数据返回Map【无序model可以为null】*/Nullableprotected MapString, Object getModelInternal() {return this.model;}/*** 获取数据返回 ModelMap【有序】*/public ModelMap getModelMap() {if (this.model null) {this.model new ModelMap();}return this.model;}/*** 获取数据返回Map【无序】*/public MapString, Object getModel() {return getModelMap();}/**设置数据*/public ModelAndView addObject(String attributeName, Nullable Object attributeValue) {getModelMap().addAttribute(attributeName, attributeValue);return this;}} 底层实现原理 数据共享到request域跳转路径方式转发 示例代码 h2测试SpringMVC处理响应数据/h2
h31、测试响应数据--ModelAndView/h3
a th:href{/ResponseDataController/testModelAndView}测试处理请求参数1/a
brController
RequestMapping(/ResponseDataController)
public class ResponseDataController {RequestMapping(/testModelAndView)public ModelAndView testModelAndView(){ModelAndView mv new ModelAndView();
// 设置数据mv.addObject(stuName,lisi);
// 设置视图mv.setViewName(response_success);return mv;}
}h2响应数据--成功页面/h2
stuNamespan th:text${stuName}/span7.2 使用Model、ModelMap、Map 语法使用Model、ModelMap、Map作为方法入参处理响应数据 示例代码 h32、测试响应数据--ModelOrModelMapOrMap/h3
a th:href{/ResponseDataController/testModelOrModelMapOrMap}测试处理响应参数2/a
br/*** 使用Map、Model、ModelMap处理响应数据* return*/// RequestMapping(/testModelOrModelMapOrMap)// public String testModelOrModelMapOrMap(MapString,Object map){ 设置数据--Map方式// map.put(stuName,zhangsan);//// return response_success;// }RequestMapping(/testModelOrModelMapOrMap)public String testModelOrModelMapOrMap(Model model){// 设置数据--Model/ModelMap方式model.addAttribute(stuName,wangwu);return response_success;}h2响应数据--成功页面/h2
stuNamespan th:text${stuName}/span底层实现原理 数据共享到request域跳转路径方式转发
7.3 SpringMVC中域对象 SpringMVC封装数据默认使用request域对象 session域的使用 方式一 /*** 测试响应数据【其他域对象】* return*/
GetMapping(/testScopeResponsedata)
public String testScopeResponsedata(HttpSession session){session.setAttribute(stuName,xinlai);return response_success;
}方式二 Controller
SessionAttributes(value stuName) //将request域中数据同步到session域中
public class TestResponseData {RequestMapping(/testSession)public String testSession( MapString, Object map ){
// 设置数据--数据在Session域map.put(stuName,sunqi);return response_success;}
}第八章 SpringMVC处理请求响应乱码 JavaWeb解决乱码三行代码 解决POST请求乱码 解决GET请求乱码【Tomcat8及以后自动解决】 解决响应乱码 8.1 源码解析CharacterEncodingFilter
public class CharacterEncodingFilter extends OncePerRequestFilter {//需要设置字符集Nullableprivate String encoding;//true:处理请乱码private boolean forceRequestEncoding false;//true:处理响应乱码private boolean forceResponseEncoding false;public String getEncoding() {return this.encoding;}public boolean isForceRequestEncoding() {return this.forceRequestEncoding;}public void setForceResponseEncoding(boolean forceResponseEncoding) {this.forceResponseEncoding forceResponseEncoding;}public void setForceEncoding(boolean forceEncoding) {// 合并了forceRequestEncoding和forceResponseEncoding this.forceRequestEncoding forceEncoding;this.forceResponseEncoding forceEncoding;}Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 字符集String encoding getEncoding();if (encoding ! null) {if (isForceRequestEncoding() || request.getCharacterEncoding() null) {// 解决请求乱码request.setCharacterEncoding(encoding);}if (isForceResponseEncoding()) {// 解决响应乱码response.setCharacterEncoding(encoding);}}filterChain.doFilter(request, response);}}8.2 处理请求与响应乱码 SpringMVC底层默认处理响应乱码 SpringMVC处理请求乱码步骤 注册CharacterEncodingFilter 注册CharacterEncodingFilter必须是第一Filter位置 为CharacterEncodingFilter中属性encoding赋值为CharacterEncodingFilter中属性forceRequestEncoding赋值 示例代码 !-- 必须是第一过滤器位置--!-- 注册CharacterEncodingFilter解决乱码问题 --
filterfilter-nameCharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class!-- 设置初始化的字符集 --init-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param!-- 解决请求及响应乱码 --init-paramparam-nameforceRequestEncoding/param-nameparam-valuetrue/param-value/init-param
/filter
filter-mappingfilter-nameCharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping第九章 SpringMVC视图及视图解析器
9.1 视图解析器对象【ViewResolver】 概述SpringMVC中所有的视图解析器对象均实现了ViewResolver接口 作用使用ViewResolver将View从ModelAndView中解析出来 在SpringMVC中无论方法返回的是ModelAndView还是String最终底层都会封装为ModelAndView
9.2 视图对象【View】
概述SpringMVC中所有的视图对象【View】均实现了view接口作用视图渲染 将数据共享到域中【requestsessionapplicationServletContext】跳转路径【转发或重定向】
第十章 源码解析SpringMVC工作原理
10.1 Controller中方法的返回值问题 无论方法返回是ModelAndView还是String最终SpringMVC底层均会封装为ModelAndView对象 //DispatcherServlet的1061行代码
ModelAndView mv null;
mv ha.handle(processedRequest, response, mappedHandler.getHandler());SpringMVC解析mv【ModelAndView】 //DispatcherServlet的1078行代码
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);ThymeleafView对象中344行代码【SpringMVC底层处理响应乱码】 //computedContentTypetext/html;charsetUTF-8
response.setContentType(computedContentType);WebEngineContext对象中783行代码【SpringMVC底层将数据默认共享到request域】 this.request.setAttribute(name, value);10.2 视图及视图解析器源码 视图解析器将View从ModelAndView中解析出来 ThymeleafViewResolver的837行代码 //底层使用反射的方式newInstance()创建视图对象
final AbstractThymeleafView viewInstance BeanUtils.instantiateClass(getViewClass());第十一章 视图控制器重定向加载静态资源
11.1 视图控制器
作用如果没有业务逻辑处理只是单纯的跳转页面可以通过视图控制器跳转语法view-controller步骤 添加mvc:view-controller标签为指定URL映射html页面添加mvc:annotation-driven 有20种功能配置了mvc:view-controller标签之后会导致其他请求路径都失效添加mvc:annotation-driven解决 !-- 添加视图控制器 --mvc:view-controller path/ view-nameindex/mvc:view-controllermvc:view-controller path/toRestPage view-namerest_page/mvc:view-controllermvc:view-controller path/toRequestDataPage view-nametoRequestDataPage/mvc:view-controllermvc:view-controller path/toResponseDataPage view-nametoResponseDataPage/mvc:view-controller!-- 配置了mvc:view-controller标签之后会导致其他请求路径都失效添加mvc:annotation-driven解决 --mvc:annotation-driven/mvc:annotation-driven11.2 重定向
语法return redirect: / xxx.html;
11.3 加载静态资源 由DefaultServlet加载静态资源到服务器 静态资源html、css、js等资源tomcat-conf-web.xml关键代码如下 servletservlet-namedefault/servlet-nameservlet-classorg.apache.catalina.servlets.DefaultServlet/servlet-classinit-paramparam-namedebug/param-nameparam-value0/param-value/init-paraminit-paramparam-namelistings/param-nameparam-valuefalse/param-value/init-paramload-on-startup1/load-on-startup/servlet
servlet-mappingservlet-namedefault/servlet-nameurl-pattern//url-pattern/servlet-mapping发现问题 DispatcherServlet与DefaultServlet的URL配置均为/导致DispatcherServlet中的配置将DefaultServlet配置的/覆盖了【DefaultServlet失效无法加载静态资源】 解决方案 !-- 解决静态资源加载问题--
mvc:default-servlet-handler/mvc:default-servlet-handler
!-- 添加上述标签会导致Controller无法正常使用需要添加mvc:annotation-driven解决 --
mvc:annotation-driven/mvc:annotation-driven11.4 源码解析重定向原理 创建RedirectView对象【ThymeleafViewResolver的775行代码】 // Process redirects (HTTP redirects)
if (viewName.startsWith(REDIRECT_URL_PREFIX)) {vrlogger.trace([THYMELEAF] View \{}\ is a redirect, and will not be handled directly by ThymeleafViewResolver., viewName);final String redirectUrl viewName.substring(REDIRECT_URL_PREFIX.length(), viewName.length());final RedirectView view new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible());return (View) getApplicationContext().getAutowireCapableBeanFactory().initializeBean(view, REDIRECT_URL_PREFIX);
}RedirectView视图渲染 RedirectView对象URL处理【330行代码】 执行重定向【RedirectView的627行代码】