Java Spring MVC项目搭建与spring框架结构 2018-10-25 09:27:54 Steven Xeldax > Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。处理器是你的应用中注解了@Controller和@RequestMapping的类和方法,Spring为处理器方法提供了极其多样灵活的配置。Spring 3.0以后提供了@Controller注解机制、@PathVariable注解以及一些其他的特性,你可以使用它们来进行RESTful web站点和应用的开发。 ## Spring 框架流程 ### Spring组件 spring的常见组件为: 1. DisPatcherServlet:前端控制器(不需要程序员开发) 用户请求到达前端控制器,它相当于MVC模式中的C(Controller),DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。 作用:作为接受请求,相应结果,相当于转发器,中央处理器,减少其他组件之间的耦合度。 2. HandlerMapping:处理器映射器(不需要程序员开发) HandlerMapping负责根据用户请求找到Handler(即:处理器),SpringMVC提供了不同的映射器实现实现不同的映射方式,例如:配置文件方式、实现接口方式、注解方式等。 作用:根据请求的Url 查找Handler 3. HandLer:处理器(需要程序员开发) Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下,Handler对具体的用户请求进行处理。 由于Handler设计到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。 注意:编写Handler时按照HandlerAdpter的要求去做,这样才可以去正确执行Handler。 4. HandlerAdapter:处理器适配器 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。 作用:按照特定的规则(HandlerAdapter要求的规则)去执行Handler 5. ViewResolver:视图解析器(不需要程序员开发) ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面的展示给用户。SpringMVC框架提供了很多View视图类型,包括:JSTLView、freemarkerView、pdfView等等. 作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)。 6. View视图 (需要程序员开发 jsp) View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf) 一般情况下需要通过页面标签或者页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。 ### spring mvc 流程 Spring MVC框架,与其他很多web的MVC框架一样:请求驱动;所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器;同时提供其他web应用开发所需要的功能。  1.用户发送请求至 前端控制器DispatcherServlet。 2.前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping。 3.处理器映射器HandlerMapping根据请求的Url找到具体的处理器,生成处理器对象Handler及处理器拦截器HandlerIntercepter(如果有则生成)一并返回给前端控制器DispatcherServlet。 4.前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用处理器Controller。 5.执行处理器(Controller,也叫后端控制器) 6.处理器Controller执行完后返回ModelAnView。 7.处理器映射器HandlerAdapter将处理器Controller执行返回的结果ModelAndView返回给前端控制器DispatcherServlet。 8.前端控制器DispatcherServlet将ModelAnView传给视图解析器ViewResolver。 9.视图解析器ViewResolver解析后返回具体的视图View。 10.前端控制器DispatcherServlet对视图View进行渲染视图(即:将模型数据填充至视图中) 11.前端控制器DispatcherServlet响应用户。 ## Spring MVC 项目构建 在spring MVC中有几个关键的元素: controller, DAO, Model, Service。在开发需要严格按照这四个逻辑进行coding。 项目构建大致流程为,修改pom.xml,构建web.xml,修改servlet.xml,构建四元素。 ### 项目结构  ### 构建pom.xml ``` <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>lxk</groupId> <artifactId>springMVC</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>springMVC Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <org.springframework-version>4.1.4.RELEASE</org.springframework-version> </properties> <dependencies> <!-- Spring MVC support --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- Tag libs support for view layer --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> <scope>runtime</scope> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>springMVC</finalName> </build> </project> ``` ### 构建web.xml ``` <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` ### 增加spring-servlet.xml ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 开启spring的扫描注入,使用如下注解 --> <!-- @Component,@Repository,@Service,@Controller--> <context:component-scan base-package="top.xeldax"/> <!-- 开启springMVC的注解驱动,使得url可以映射到对应的controller --> <mvc:annotation-driven /> <!-- 视图解析 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans> ``` ### 注意事项 jsp中el表达式默认不启用,需要添加以下代码才能 ``` <%@page isELIgnored="false" %> ```