springmvc代码分析(Spring源码深度解析快速体验SpringMVC)
springmvc代码分析(Spring源码深度解析快速体验SpringMVC)<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.Springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.Springframework.org/schema/tx" xsi:schemaLocation="http://www.Springframework.org/schema/beans http://www.Springframework.org/schema/beans/Spring-beans-2.5.xsd http://www.Springframework.org/schema/tx http
SpringMVCSpring框架提供了构建Web应用程序的全功能MVC模块。通过策略接口,Spring框架是高度可配置的,而且支持多种视图技术,例如JavaServer Pages(jsp)、Velocity、Tiles、iText和POI。SpringMVC框架并不知道使用的视图,所以不会强迫您只使用JSP技术。SpringMVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
Spring的MVC是基于servlet功能实现的,通过实现Servlet接口的DispatcherServlet来封装其核心功能实现,通过将请求分派给处理程序,同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。默认的处理程序是非常简单的Controller接口,只有一个方法ModelAndView handleRequest(request response)。Spring提供了一个控制器层次结构,可以派生子类。如果应用程序需要处理用户输入表单,那么可以继承AbstractFormController。如果需要把多页输入处理到一个表单,那么可以继承AbstractWizardFormController。
对SpringMVC或者其他比较成熟的MVC框架而言,解决的问题无外乎以下几点。
- 将Web页面的请求传给服务器。
- 根据不同的请求处理不同的逻辑单元。
- 返回处理结果数据并跳转至响应的页面。
我们首先通过一个简单示例来快速回顾SpringMVC的使用。
11.1 SpringMVC快速体验1.配置web.xml
一个Web中可以没有web.xml文件,也就是说,web.xml文件并不是Web工程必需的。web.xml文件用来初始化配置信息,比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。但是,SpringMVC的实现原理是通过servlet拦截所有URL来达到控制的目的,所以web.xml的配置是必需的。
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun. com/ xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>Springmvc</display-name> <!-- 使用ContextLoaderListener配置时,需要告诉它Spring配置文件的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- SpringMVC的前端控制器 --> <!-- 当DispatcherServlet载入后,它将从一个XML文件中载入Spring的应用上下文,该XML文件的名字取决于<servlet-name> --> <!-- 这里DispatcherServlet将试图从一个叫作Springmvc-servlet.xml的文件中载入应用上下文,其默认位于WEB-INF目录下 --> <servlet> <servlet-name>Springmvc</servlet-name> <servlet-class>org.Springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Springmvc</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> <!-- 配置上下文载入器 --> <!-- 上下文载入器载入除DispatcherServlet载入的配置文件之外的其他上下文配置文件 --> <!-- 最常用的上下文载入器是一个Servlet监听器,其名称为ContextLoaderListener --> <listener> <listener-class>org.Springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
Spring的MVC之所以必须要配置web.xml,其实最关键的是要配置两个地方。
- contextConfigLocation:Spring的核心就是配置文件,可以说配置文件是Spring中必不可少的东西,而这个参数就是使Web与Spring的配置文件相结合的一个关键配置。
- DispatcherServlet:包含了SpringMVC的请求逻辑,Spring使用此类拦截Web请求并进行相应的逻辑处理。
2.创建Spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.Springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.Springframework.org/schema/tx" xsi:schemaLocation="http://www.Springframework.org/schema/beans http://www.Springframework.org/schema/beans/Spring-beans-2.5.xsd http://www.Springframework.org/schema/tx http://www.Springframework.org/schema/tx/Spring-tx-2.5.xsd"> <bean id="viewResolver" class="org.Springframework.web.servlet.view. Internal Resource ViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
InternalResourceViewResolver是一个辅助bean,会在ModelAndView返回的视图名前加上prefix指定的前缀,再在最后加上suffix指定的后缀,例如:由于XXController返回的ModelAndView中的视图名是testview,故该视图解析器将在/WEB-INF/jsp/testview.jsp处查找视图。
3.创建model
模型对于SpringMVC来说并不是必不可少,如果处理程序非常简单,完全可以忽略。模型创建主要的目的就是承载数据,使数据传输更加方便。
public class User { private String username; private Integer age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
4.创建controller
控制器用于处理Web请求,每个控制器都对应着一个逻辑处理。
public class UserController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest arg0 HttpServletResponse arg1) throws Exception { List<User> userList = new ArrayList<User>(); User userA = new User(); User userB = new User(); userA.setUsername("张三"); userA.setAge(27); userB.setUsername("李四"); userB.setAge(37); userList.add(userA); userList.add(userB); return new ModelAndView("userlist" "users" userList); } }
在请求的最后返回了ModelAndView类型的实例。ModelAndView类在SpringMVC中占有很重要的地位,控制器执行方法都必须返回一个ModelAndView,ModelAndView对象保存了视图以及视图显示的模型数据,例如其中的参数如下。
- 第1个参数userlist:视图组件的逻辑名称。这里视图的逻辑名称就是userlist,视图解析器会使用该名称查找实际的View对象。
- 第2个参数users:传递给视图的模型对象的名称。
- 第3个参数userList:传递给视图的模型对象的值。
5.创建视图文件userlist.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <h2>This is SpringMVC demo page</h2> <c:forEach items="${users}" var="user"> <c:out value="${user.username}"/><br/> <c:out value="${user.age}"/><br/> </c:forEach>
视图文件用于展现请求处理结果,通过对JSTL的支持,可以很方便地展现在控制器中放入ModelAndView中的处理结果数据。
6.创建Servlet配置文件Spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.Springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www. Spring framework. org/schema/tx" xsi:schemaLocation="http://www.Springframework.org/schema/beans http://www.Springframework.org/schema/beans/Spring-beans-2.5.xsd http://www.Springframework.org/schema/tx http://www.Springframework.org/schema/tx/Spring-tx-2.5.xsd"> <bean id="simpleUrlMapping" class="org.Springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/userlist.htm">userController</prop> </props> </property> </bean> <!-- 这里的id="userController"对应的是<bean id="simpleUrlMapping">中的<prop>里面的value --> <bean id="userController" class="test.controller.UserController" /> </beans>
因为SpringMVC是基于Servlet的实现,所以在Web启动的时候,服务器会首先尝试加载对应于Servlet的配置文件,而为了让项目更加模块化,通常我们将Web部分的配置都存放于此配置文件中。
至此,已经完成了SpringMVC的搭建,启动服务器,输入网址http://localhost:8080/ Springmvc/userlist.htm。
看到了服务器返回界面,如图11-1所示。
图11-1 SpringMVC快速体验
本文摘自:《Spring源码深度解析》(第2版)
《Spring源码深度解析》(第2版)
- 全面剖析Spring源码,方便读者根据业务需求进行更改或扩展
- 所有知识点秉承由浅入深、由易到难的讲解架构
- 采用抽丝剥茧的方式来阐述复杂的逻辑,降低理解难度
《Spring源码深度解析(第2版)》从核心实现、企业应用和Spring Boot这3个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring 整体架构和环境搭建、容器的基本实现、默认标签的解析、自定义标签的解析、bean的加载、容器的功能扩展、AOP、数据库连接JDBC、整合MyBatis、事务、SpringMVC、远程服务、Spring消息、Spring Boot体系原理等内容。
《Spring源码深度解析(第2版)》不仅介绍了使用Spring框架开发项目必须掌握的核心概念,还指导读者使用Spring框架编写企业级应用,并针对在编写代码的过程中如何优化代码、如何使得代码高效给出了切实可行的建议,从而帮助读者全面提升实战能力。
《Spring源码深度解析(第2版)》语言简洁,示例丰富,可帮助读者迅速掌握使用Spring进行开发所需的各种技能。本书适合于已具有一定Java编程基础的读者,以及在Java平台下进行各类软件开发的开发人员、测试人员等。