详解Spring mvc工作原理及源码分析

详解Spring mvc工作原理及源码分析,第1张

Model 模型层 (javaBean组件 = 领域模型(javaBean) + 业务层 + 持久层)

View 视图层( html、jsp…)

Controller 控制层(委托模型层进行数据处理)

springmvc是一个web层mvc框架,类似struts2。

springmvc是spring的部分,其实就是spring在原有基础上,又提供了web应用的mvc模块。

实现机制:

struts2是基于过滤器实现的。

springmvc是基于servlet实现的。

运行速度:

因为过滤器底层是servlet,所以springmvc的运行速度会稍微比structs2快。

struts2是多例的

springmvc单例的

参数封装:

struts2参数封装是基于属性进行封装。

springmvc是基于方法封装。颗粒度更细。

⑴ 用户发送请求至DispatcherServlet。

⑵ DispatcherServlet收到请求调用HandlerMapping查询具体的Handler。

⑶ HandlerMapping找到具体的处理器(具体配置的是哪个处理器的实现类),生成处理器对象及处理器拦截器(HandlerExcutorChain包含了Handler以及拦截器集合)返回给DispatcherServlet。

⑷ DispatcherServlet接收到HandlerMapping返回的HandlerExcutorChain后,调用HandlerAdapter请求执行具体的Handler(Controller)。

⑸ HandlerAdapter经过适配调用具体的Handler(Controller即后端笑巧控制器)。

⑹ Controller执行完成返回ModelAndView(其中包含逻辑视图和数据)给HandlerAdaptor。

⑺ HandlerAdaptor再将ModelAndView返回给DispatcherServlet。

⑻ DispatcherServlet请求视图解析器ViewReslover解析ModelAndView。

⑼ ViewReslover解析后返胡迟回具体View(物理视图)到DispatcherServlet。

⑽ DispatcherServlet请求渲染视图(即将模型数据填充至视图中) 根据View进行渲染视图。

⑾ 将渲染后的视图返回给DispatcherServlet。

⑿ DispatcherServlet将响应结果返回给用户。

(1)前端控制器DispatcherServlet(配置即可)

功能:中央处理器,接收请求,自己不做任何处理,而是将请求发送给其他组件进行处理。DispatcherServlet 是整个流程的控制中心。

(2)处理器映射器HandlerMapping(配置即可)

功能:根据DispatcherServlet发送的url请求路径查找Handler

常见的处理器映射器:BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping,

ControllerClassNameHandlerMapping,DefaultAnnotationHandlerMapping(不建议使用)

(3)处理器适配器HandlerAdapter(配置即可)

功能:按照特定规裤升李则(HandlerAdapter要求的规则)去执行Handler。

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展多个适配器对更多类型的处理器进行执行。

常见的处理器适配器:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,AnnotationMethodHandlerAdapter

(4)处理器Handler即Controller(程序猿编写)

功能:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。

(5)视图解析器ViewReslover(配置即可)

功能:进行视图解析,根据逻辑视图名解析成真正的视图。

ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

springmvc框架提供了多种View视图类型,如:jstlView、freemarkerView、pdfView...

(6)视图View(程序猿编写)

View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)

引入相关依赖:spring的基本包、springmvc需要的spring-webmvc,日志相关的slf4j-log4j12,jsp相关的jstl、servlet-api、jsp-api。

因为DispatcherServlet本身就是一个Servlet,所以需要在web.xml配置。

一、使用默认加载springmvc配置文件的方式,必须按照以下规范:

①命名规则:-servlet.xml ====>springmvc-servlet.xml

②路径规则:-servlet.xml必须放在WEB-INF下边

二、如果要不按照默认加载位置,则需要在web.xml中通过标签来指定springmvc配置文件的加载路径,如上图所示。

将自定义的 Controller 处理器配置到 spring 容器中交由 spring 容器来管理,因为这里的 springmvc.xml 配置文件中处理器映射器配置的是 BeanNameUrlHandlerMapping ,根据名字可知这个处理器映射器是根据 bean (自定义Controller) 的 name 属性值url去寻找执行类 Handler(Controller) , 所以bean的name属性值即是要和用户发送的请求路径匹配的 url 。

根据视图解析路径:WEB-INF/jsps/index.jsp

功能:根据bean(自定义Controller)的name属性的url去寻找执行类Controller。

功能:自定义的处理器(Controller)实现了Controller接口时,适配器就会执行Controller的具体方法。

SimpleControllerHandlerAdapter会自动判断自定义的处理器(Controller)是否实现了Controller接口,如果是,它将会自动调用处理器的handleRequest方法。

Controller接口中有一个方法叫handleRequest,也就是处理器方法。

因此,自定义的Controller要想被调用就必须实现Controller接口,重写Controller接口中的处理器方法。

spring框架jar包

1、下载spring源包

spring地址:http://www.springsource.org/download

我下的是spring-framework-3.1.0.RELEASE-with-docs.zip

下载依赖包:spring-framework-3.0.5.RELEASE-dependencies.zip

注意官网上3.0.3版本以后同版本依赖包不提供下载

2、导入所需jar包

引入dist目录下除了下面贺前三个其余所有包

org.springframework.web.struts-3.1.0.RELEASE.jar

org.springframework.spring-library-3.1.0.RELEASE.libd

org.springframework.web.portlet-3.1.0.RELEASE.jar

引入依赖包下com.springsource.org.apache.commons.logging-1.1.1.jar及com.springsource.org.aopalliance-1.0.0.jar

spring框架配置

1、web.xml配置

[html] view plain copy

<?xml version="1.0" encoding="UTF-8"?>

<web-app

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID"

version="3.0">

<context-param>

<param-name>contextConfigLocation</param-name>

<!-- 应用上下文配置文件 -->坦滑

<param-value>/WEB-INF/spring-servlet.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- 配置spring核心让拍腊servlet -->

<servlet>

<servlet-name>spring</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<!-- url-pattern配置为/,不带文件后缀,会造成其它静态文件(js,css等)不能访问。如配为*.do,则不影响静态文件的访问 -->

<servlet-mapping>

<servlet-name>spring</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

</web-app>

2、应用上下文配置

spring-servlet.xml即配置用于开启基于注解的springMVC功能,照web.xml中设定,路径为WEB-INF下

[html] view plain copy

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射-->

<mvc:annotation-driven />

<!-- 启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为spring的bean -->

<context:component-scan base-package="com.mvc.rest" />

<!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp" />

</beans>

Demo例子

1、根据spring-servlet.xml配置的包路径(com.mvc.rest)新建Constroller

[java] view plain copy

package com.mvc.rest

import javax.servlet.http.HttpServletRequest

import javax.servlet.http.HttpServletResponse

import org.springframework.stereotype.Controller

import org.springframework.ui.ModelMap

import org.springframework.web.bind.annotation.PathVariable

import org.springframework.web.bind.annotation.RequestMapping

import org.springframework.web.bind.annotation.RequestMethod

import org.springframework.web.servlet.ModelAndView

@Controller

public class RestConstroller {

public RestConstroller() {}

@RequestMapping(value = "/login/{user}", method = RequestMethod.GET)

public ModelAndView myMethod(HttpServletRequest request,HttpServletResponse response,

@PathVariable("user") String user, ModelMap modelMap) throws Exception {

modelMap.put("loginUser", user)

return new ModelAndView("/login/hello", modelMap)

}

@RequestMapping(value = "/welcome", method = RequestMethod.GET)

public String registPost() {

return "/welcome"

}

}

2、建jsp视图

视图路径在spring-servlet.xml配置(/WEB-INF/view/),据上述RestConstroller 类,我们在WEB-INF下建立view目录,在view下建立welcome.jsp及login/hello.jsp

welcome.jsp随意,hello.jsp代码如下:

[html] view plain copy

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath()

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<base href="<%=basePath%>">

<title>My JSP 'hello.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

</head>

<body>

你好:<%=request.getAttribute("loginUser") %>,现在时间是<%= new Date() %>

</body>

</html>

3、部署访问

http://localhost:8080/SpringMvcDemo/welcome

DotNetNukeDotNetNuke(简称DNN)是一个免费的、开源的、可扩展的内容管理系统,是建立在

ASP.NET

平台上的Web应用框架。mojoPortalmojoPortal是一款C#开发的面向对象网站框架,它可以运行于Windows的

ASP.NET

和GNU/Linux或MacOSX的Mono的平台上。UmbracoUmbraco是一个开放源码的CMS内容管理系统,基于

asp.net

建立,使用睁液亩mssql进行存储数据。使用Umbraco,设计师能创造出有效的XHTML标记模板和开发人员可以创建任何基于

.Net

的模块。主要特点包括:漂亮,友好的用户界面综合所见即所得编辑器支持编辑在MicrosoftWord全部源代码可用(开放源代码)超级简单的模板引擎完全支持Web标准CuyahogaCuyahoga是C#开发的灵活的CMS/Portal解决悉森方案。它可以运行于Microsoft

.NET

和Mono平台,支持SQLServer,PostgreSQL或MySQL作为底层数据库埋罩。N2CMSN2CMS是一款轻量级的cms框架,它能帮你建立一个人人都能够更新的大站点.网站内容编辑者将享有一个简单且功能强大的WEB界面,同时开发者将享有一个友好的API这使得建站变得快速和有趣

.TheBeerHouseTheBeerHouse

是一个采用微软MVC框架开发的CMS和电子商务网站KoobooKooboo是一个基于

ASP.NET

MVC的CMS系统,实现面向企业级的内容管理解决方案和快速开发。Kooboo具有如下主要特性:--基于角色的用户管理--无限制的用户和站点--实现各种验证--内容版本控制--工作流控制--布局和内容模板


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8261735.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存