springmvc框架的理解(如何深入 spring mvc)
本文目录
如何深入 spring mvc
SpringMVC是一个轻量级的MVC框架,SpringMVC由于其轻量级的实现以及与Spring框架的无缝整合等诸多优势,近年来在MVC框架中脱颖而出,受到诸多开发人员的青睐,学习SpringMVC势在必行。
Web环境中使用SpringMVC:SpringMVC提供了可插拔式的框架嵌入形式,将SpirngMVC插入或者从Web项目中卸载只需要简单的修改配置文件即可。
配置前端控制器,SpringMVC的入口程序为一个全局的Servlet,该Servlet拦截指定的一组请求交给SpringMVC框架执行后续的处理操作,在Web.xml中配置如下字段。
《!-- SpingMVC的前端控制器 --》
《servlet》
《servlet-name》dispatcher《/servlet-name》
《servlet-class》org.springframework.web.servlet.DispatcherServlet《/servlet-class》
《!-- 配置SpringMVC的IOC容器 --》
《init-param》
《param-name》contextConfigLocation《/param-name》
《param-value》/WEB-INF/root-context.xml《/param-value》
《/init-param》
《load-on-startup》1《/load-on-startup》
《/servlet》
《!-- 配置拦截所有的请求 --》
《servlet-mapping》
《servlet-name》dispatcher《/servlet-name》
《url-pattern》/《/url-pattern》
《/servlet-mapping》《/span》《/span》
创建SpringMVC IOC容器的配置文件root-context.xml并定义视图解析器,位置/WEB-INF/
《!-- 配置自动扫面的包 --》
《context:component-scan base-package=“cn.com.xiaofen“ /》
《!-- 定义视图解析器 --》
《bean
class=“org.springframework.web.servlet.view.InternalResourceViewResolver“》
《property name=“prefix“ value=“/WEB-INF/view/“》《/property》
《property name=“suffix“ value=“.jsp“》《/property》
《/bean》
《!-- 《mvc:default-servlet-handler /》《mvc:annotation-driven /》 --》《/span》《/span》
定义控制器,SpringMVC中定义方法来响应客户端请求,内存开销更小效率更高。
@Controller
@RequestMapping(“/T“)
public class T {
@RequestMapping(“/t_1“)
public String t_1() {
System.out.println(“t_1“);
return “index“;
}
}
定义视图,根据实际的视图解析器完成相关视图的配置,当前配置视图应该在/WEB-INF/view/ 下且文件类型为JSP文件,具体的应该在该目录下新建一个名称为index的jsp文件名称。
view plain copy
view plain copy
view plain copy
SpringMVC处理请求的工作流:DispatcherServlet作为SpringMVC框架的入口程序,负责调度SpringMVC框架响应用户的请求,如下图为宏观上SpingMVC处理一次请求大概需要经过以下调度过程。
请求进入由前端控制器(DispatcherServlet )拦截。
前端控制器分析请求将请求委托至具体的控制器来处理。
控制器处理请求返回逻辑视图(Model)。
前端控制器得到逻辑视图对象,调度视图解析器,解析视图模版给用户响应。
返回前端控制器。
DispatcherServlet 调用doDispatch处理请求。
try {
/*逻辑视图及上文提到的Model*/
ModelAndView mv = null;
Exception dispatchException = null;
try {
/*文件上传预处理*/
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
/*确定当前请求的处理者*/
mappedHandler = getHandler(processedRequest);
/*请求资源未发现*/
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
/*确定当前请求的处理者适配器*/
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//...............
/*请求调度前应用的拦截器*/
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
/*调用处理程序*/
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//......
/*请求调度后应用的拦截器*/
mappedHandler.applyPostHandle(processedRequest, response, mv);
}
catch (Exception ex) {
dispatchException = ex;
}
/*解析视图给用户响应*/
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
理解HandlerMapper,一个HandlerMapper代表一个请求到到处理对象的映射,该对象的创建依据是请求响应关系。getHandler方法部分源码分析如下。
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
遍历查找满足条件的HandlerMapping
for (HandlerMapping hm : this.handlerMappings) {
if (logger.isTraceEnabled()) {
logger.trace(
“Testing handler map in DispatcherServlet with name ’“ + getServletName() + “’“);
}
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
存在
return handler;
}
}
不存在
return null;
}
理解HandlerAapter,SpringMVC 中通过HandlerAdapter的handler方法来调用实际的处理请求的函数。getHandlerAapter 部分源码如下。
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
for (HandlerAdapter ha : this.handlerAdapters) {
if (logger.isTraceEnabled()) {
logger.trace(“Testing handler adapter “);
}
是否支持处理当前的HandlerMapper
if (ha.supports(handler)) {
return ha;
}
}
当前的HandlerMapper不能被处理报异常
throw new ServletException(“No adapter for handler [“ + handler +
“]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler“);
}
Model到视图,SpringMVC 中ModelAndView保存了逻辑视图与真实视图的关系,确定了当前请求为用户返回的View,processDispatchResult 源码分析如下。
private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) throws Exception {
boolean errorView = false;
/*处理异常信息*/
if (exception != null) {
if (exception instanceof ModelAndViewDefiningException) {
logger.debug(“ModelAndViewDefiningException encountered“, exception);
mv = ((ModelAndViewDefiningException) exception).getModelAndView();
}
else {
Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
mv = processHandlerException(request, response, handler, exception);
errorView = (mv != null);
}
}
/*渲染视图,返回响应*/
if (mv != null && !mv.wasCleared()) {
render(mv, request, response);
if (errorView) {
WebUtils.clearErrorRequestAttributes(request);
}
}
else {
if (logger.isDebugEnabled()) {
logger.debug(“Null ModelAndView returned to DispatcherServlet with name ’“ + getServletName() +
“’: assuming HandlerAdapter completed request handling“);
}
}
}
SpringMVC请求流程(部分源码分析):由DispatcherServlet的doService()方法入手,篇幅关系,下文仅列出核心的代码,下文的代码并并保证时间上的顺序性。
view plain copy
view plain copy
view plain copy
view plain copy
spring-mvc是什么框架
一、IoC(Inversionofcontrol):控制反转1、IoC:概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean二、AOP(Aspect-OrientedProgramming):面向方面编程1、代理的两种方式:静态代理:针对每个具体类分别编写代理类;针对一个接口编写一个代理类;动态代理:针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类2、AOP的主要原理:动态代理Spring工作原理Spring已经用过一段时间了,感觉Spring是个很不错的框架。内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xmlSpring的配置文件来动态的创建对象,和调用对象里的方法的。Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置内部通过反射去动态的组装对象)要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式)Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了也就基本上掌握了Spring.
springmvc和其他mvc框架有什么区别
spring 是是一个开源框架,是为了解决企业应用程序开发,功能如下◆目的:解决企业应用开发的复杂性◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能◆范围:任何Java应用简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。◆轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。◆控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。◆面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。◆框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。Spring的两大核心AOP与IOC,可以单独用于任何应用,包括与Struts等MVC框架与Hibernate等ORM框架的集成,目前很多公司所谓的轻量级开发就是用 Spring + Struts(2)+Hibernate。 Spring MVC就是一个MVC框架,个人觉得Spring MVC annotation式的开发比Struts2方便,可以直接代替上面的Struts(当然Struts的做为一个非常成熟的MVC,功能上感觉还是比Spring强一点,不过Spring MVC已经足够用了)。当然spring mvc的执行效率比struts高,是因为struts的值栈影响效率spring mvc类似于struts的一个MVC开框架,其实都是属于spring,spring mvc需要有spring的架包作为支撑才能跑起来如果有人问你什么事控制反转(spring的核心面试常问道):你就回答,本来程序是由我们new 出来的嘛,后来交给程序控制进行new出来了嘛,这就是控制反转嘛,打了那么多手都麻了,看在我那么辛苦的份上给分吧
更多文章:

nextsibling和nextelementsibling(javascript获取dom的下一个节点方法)
2025年2月25日 20:50

最小的中文linux(有图像界面的linux系统,最小的是哪个版本(支持中文的),有多大)
2025年3月11日 23:40

prosperity的动词(“flourish”与 “prosperity”有什么区别)
2025年3月14日 01:00

alphago(和柯洁对战的AlphaGO和之前的AlphaGO有什么区别)
2025年3月24日 07:20

structure怎么记忆(Structure是什么意思怎么读)
2025年4月3日 00:00