docs | 该文件夹下存放Spring的相关文档,包含开发指南、API参考文档。 |
libs | 该文件夹下的JARS分为三类:①Spring框架class文件的JAR包;②Spring框架源文件的压缩包,文件名以-source结尾;③Spring框架API文档的压缩包,文件名以-javadoc结尾。 |
schemas | 该文件夹下包含了Spring各种配置文件的XML Schemas文档。 |
readme.txt、notice.txt、license.txt等说明性文档。 |
web.xml配置
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/springmvc-config.xml
1
springmvc
/
2018.7.22
DispatcherServlet在Spring当中充当一个前端控制器的角色,它的核心功能是分发请求。请求会被分发给对应处理的Java类,Spring MVC中称为Handle。在Spring2.5版本以前,开发一个Handle的唯一方法是实现org.springframework.web.servlet.mvc.Controller接口,Controller接口必须实现一个方法,该方法的签名如下:
ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception
Controller接口的实现类可以通过handleRequest方法传递的参数访问对应请求的HttpServletRequest和HttpServletResponse对象,处理完业务请求之后,必须返回一个包含模型对象和视图路径的ModelAndView对象。
Controller接口的实现类只能处理一个单一请求动作,而Spring2.5之后新增的基于注解的控制器可以支持同时处理多个请求动作,并且无须实现任何接口,更加灵活。
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/springmvc-config.xml
1
springmvc
/
welcome.jsp
springmvc-config.xml文件声明了HelloController业务控制器类,并将其映射到/Hello请求。此处还配置了一个处理映射器BeanNameUrlHandlerMapping,这样可以Bean的名称为url进行查找老同事配置了处理器适配器SimpleControllerHandlerAdapter,来完成对HelloController类的handleRequest方法的调用;最后配置了视图解析器InternalResourceViewResolver来解析视图,将View呈现给用户。需要注意的是,在Spring4.0之后,如果不配置处理映射器、处理器适配器和视图解析器,也会使用默认的完成Spring内部MVC工作。
package org.fkit.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
private static final Log logger=LogFactory.getLog(HelloController.class);
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("handleRequest 被调用。");
ModelAndView modelAndView =new ModelAndView();
modelAndView.addObject("message","Hello World!");
modelAndView.setViewName("welcome.jsp");
return modelAndView;
}
}
Spring MVC建议把所有的视图页面存放在WEB-INF文件夹下,这样可以保护页面视图,避免直接向视图页面发送请求。
<%--
Created by IntelliJ IDEA.
User: Jeanne d'Arc
Date: 2018/7/10
Time: 21:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
${requestScope.message}
package org.fkit.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* HelloController是一个基于注解的控制器,
* 可以同时处理多个请求动作,并且无需实现任何接口。
* org.springframewok.stereotype.Controller注解用于指示该类是一个控制器
*/
@Controller
public class HelloController {
private static final Log logger = LogFactory.getLog(HelloController.class);
/**
* org.springframework.web.bind.annotation.RequestMapping注解
* 用来映射请求的URL和请求的方法等。本例用来映射"/hello"
* hello只是一个普通方法。
* 该方法返回一个包含视图名或视图名和模型的ModelAndView对象。
**/
@RequestMapping(value = "/hello")
public ModelAndView hello() {
logger.info("hello方法被调用。");
//创建准备返回的ModelAndView对象,该对象通常包含了返回视图名、模型的名称以及模型对象
ModelAndView modelAndView = new ModelAndView();
//添加模型数据,视图解析器会根据改名字解析到具体的视图页面
modelAndView.setViewName("/WEB-INF/welcome.jsp");
//返回ModelAndView对象
return modelAndView;
}
}
value="hello" 表示请求由hello方法进行处理。
//事务的约束
框架源代码:org.springframework.web.servlet.DispatcherServlet.java
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);//初始化上传文件解析器
initLocaleResolver(context);//初始化本地化解析器
initThemeResolver(context);//初始化主题解析器
initHandlerMappings(context);//初始化处理器解析器,将请求映射到处理器
initHandlerAdapters(context);//初始化处理器适配器
initHandlerExceptionResolvers(context);
//初始化处理器异常解析器,如果执行过程中遇到一场将交给HandlerExceptionResolver来解析
initRequestToViewNameTranslator(context);//初始化请求到视图名称解析器
initViewResolvers(context);
//初始化视图解析器,通过ViewResolver解析逻辑视图名到具体视图实现
initFlashMapManager(context);//初始化flash映射管理器
}
initStrategies方法将在WebApplicationContext初始化后自动执行,自动扫描上下文的Bean,根据名称或类型匹配的机制查找自定义的组件,如果没有找到则会装配一套Spring的默认组件。在org.springframework.web.servlet路径下有一个DispatcherServlet.properties配置文件,该文件制定了DispatcherServlet所使用的默认组件。
org.springframework.web.servlet.DispatcherServlet.properties
//本地化解析器
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
//主题解析器
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
//处理器解析器(共2个)
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
//处理器适配器(共3个)
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
//异常处理器(共3个)
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
//视图名称解析器
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
//视图解析器
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
//FlashMap映射解析器
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
同一类型的组件如果存在多个,优先级顺序:因为这些组件都实现了org.springframework.core.Ordered接口,所以可以通过Order属性确定优先级的顺序,值越小的优先级越高。
消息转换 | 将请求消息(如Json,xml等数据)转换成一个对象,将对象转换为指定的响应信息 |
数据转换 | 将请求消息进行数据转换,如String转换成Integer、Double等 |
数据格式化 | 对请求消息进行数据格式化,如将字符串转换成格式化数字或格式化日期等 |
数据验证 | 验证数据的有效性(长度、格式等),验证结果存储到BIndingResult或Error中 |
以上8个步骤,DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver等对象协同工作,完成Spring MVC请求→响应的整个工作流程,这些对象所完成的工作对于开发者来说都是不可兼得,开发者并不需要关心这些对象是如何工作的,开发者只需要在Handler(Controller)当中完成对请求的业务处理。
2018.7.23
干物女(weiwei)—三无MarBlue
温柔正确的人总是难以生存,因为这世界既不温柔,也不正确。