深入理解Spring MVC概要与环境配置
一、mvc概要
mvc是模型(model)、视图(view)、控制器(controller)的简写,是一种软件设计规范,用一种将业务逻辑、数据、显示分离的方法组织代码,mvc主要作用是降低了视图与业务逻辑间的双向偶合。mvc不是一种设计模式,mvc是一种架构模式。当然不同的mvc存在差异。
在web早期的开发中,通常采用的都是model1。model1中,如图所示主要分为两层,视图层和模型层。model2把一个项目分成三部分,包括视图、控制、模型。这样不仅提高的代码的复用率与项目的扩展性,且大大降低了项目的维护成本。model 1模式的实现比较简单,适用于快速开发小规模项目,model1中jsp页面身兼view和controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度。model2消除了model1的缺点。
model1
model2
常见的服务器端mvc框架有:struts、spring mvc、asp.net mvc、zend framework、jsf;常见前端mvc框架:angularjs、reactjs、backbone;由mvc演化出了另外一些模式如:mvp、mvvm。
二、spring mvc介绍
spring mvc是spring framework的一部分,是基于java实现mvc的轻量级web框架。spring mvc的特点:
1、轻量
2、高效
3、与spring兼容性好
4、功能强大
restful、数据验证、格式化、绑定机制、本地化、主题等
5、简洁灵活
spring的web框架围绕dispatcherservlet设计。 dispatcherservlet的作用是将请求分发到不同的处理器。从spring 2.5开始,使用java 5或者以上版本的用户可以采用基于注解的controller声明方式。官网上说spring的web模块提供了大量独特的功能,包括:
清晰的角色划分:控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(form object)、模型对象(model object)、 servlet分发器(dispatcherservlet)、 处理器映射(handler mapping)、视图解析器(view resolver)等等。 每一个角色都可以由一个专门的对象来实现。
强大而直接的配置方式:将框架类和应用程序类都能作为javabean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器(validator)的引用。
可适配、非侵入:可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如action/actionform)继承。
可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。
可定制的绑定(binding) 和验证(validation):比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象, 需要手动解析它并转换到业务对象。
可定制的handler mapping和view resolution:spring提供从最简单的url映射, 到复杂的、专用的定制策略。与某些web mvc框架强制开发人员使用单一特定技术相比,spring显得更加灵活。
灵活的model转换:在springweb框架中,使用基于map的 键/值对来达到轻易地与各种视图技术的集成。
可定制的本地化和主题(theme)解析:支持在jsp中可选择地使用spring标签库、支持jstl、支持velocity(不需要额外的中间层)等等。
简单而强大的jsp标签库(spring tag library):支持包括诸如数据绑定和主题(theme) 之类的许多功能。它提供在标记方面的最大灵活性。
jsp表单标签库:在spring2.0中引入的表单标签库,使得在jsp中编写 表单更加容易。
spring bean的生命周期可以被限制在当前的http request或者http session。 准确的说,这并非spring mvc框架本身特性,而应归属于sping mvc使用的webapplicationcontext容器。
三、第一个spring mvc 项目:hello world
3.1、通过maven新建一个web项目
在eclipse中新建maven项目,选择“create a simple project”,创建一个简单项目,不选择模板。
修改层面信息,更加详细的内容请参考前面写过的文章:
将webcontent中的所有内容复制到webapp目录下,并删除webcontent目录,删除后的结果如下:
修改项目的部署信息,删除测试文件夹,添加webapp为项目根目录:
如果不打算在pom.xml中添加对server runtime的依赖,则这里必须手动添加依赖,如下图所示:
另外如果pom.xml报错,修改任意位置保存。
3.2、添加依赖的jar包
1、修改pom.xml文件、添加jar包的依赖,主要有:spring框架核心库、spring mvc、jstl等,具体信息如下:
<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/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.zhangguo</groupid> <artifactid>springmvc01</artifactid> <version>0.0.1</version> <packaging>war</packaging> <properties> <project.build.sourceencoding>utf-8</project.build.sourceencoding> <spring.version>4.3.0.release</spring.version> </properties> <dependencies> <!--spring框架核心库 --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>${spring.version}</version> </dependency> <!-- spring mvc --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>${spring.version}</version> </dependency> <!-- jstl --> <dependency> <groupid>javax.servlet</groupid> <artifactid>jstl</artifactid> <version>1.2</version> </dependency> </dependencies> </project>
当依赖成功时,会加载的jar包如下:
3.3、修改web.xml注册中心控制器dispatcherservlet
spring mvc框架像许多其他mvc框架一样, 请求驱动,围绕一个中心servlet分派请求及提供其他功能,dispatcherservlet是一个实际的servlet (它继承自httpservlet 基类)。如下图所示当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。
修改web.xml文件注册该servlet,修改后的web.xml文件如下:
<?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" 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"> <servlet> <!--名称 --> <servlet-name>springmvc</servlet-name> <!-- servlet类 --> <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class> <!-- 启动顺序,数字越小,启动越早 --> <load-on-startup>1</load-on-startup> <init-param> <!--springmvc配置参数文件的位置 --> <param-name>contextconfiglocation</param-name> <!--默认名称为servletname-servlet.xml --> <param-value>classpath*:springmvc-servlet.xml</param-value> </init-param> </servlet> <!--所有请求都会被springmvc拦截 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
3.4、添加spring mvc配置文件
在src/main/java源代码目录下添加springmvc-servlet.xml配置文件,配置的形式与spring容器配置基本类似,为了支持基于注解的ioc,设置了自动扫描包的功能,具体配置信息如下:
<?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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!-- 自动扫描包,实现支持注解的ioc --> <context:component-scan base-package="com.zhangguo.springmvc01" /> <!-- spring mvc不处理静态资源 --> <mvc:default-servlet-handler /> <!-- 支持mvc注解驱动 --> <mvc:annotation-driven /> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.internalresourceviewresolver" id="internalresourceviewresolver"> <!-- 前缀 --> <property name="prefix" value="/web-inf/view/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean> </beans>
在视图解析中我们把所有的视图都存放在/web-inf/目录下,这样是为了视图安全,因为这个目录客户端不能直接访问。
3.5、创建helloworld控制器
在src/main/java源代码目录下创建包com.zhangguo.springmvc01.controller,在包下创建一个普通的类:helloworld,具体代码如下:
package com.zhangguo.springmvc01.controller; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.requestmapping; @controller @requestmapping("/hello") public class helloworld { @requestmapping("/sayhi") public string sayhi(model model) { model.addattribute("message", "hello spring mvc!"); return "sayhi"; } }
注解为@controller是为了让spring ioc容器初始化时自动扫描到;@requestmapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/hello/sayhi;方法中声明model类型的参数是为了把action中的数据带到视图中;方法返回的结果是视图的名称sayhi。
3.6、创建视图
在web-inf/view目录中创建视图,视图将从action中带回的信息展示,具体内容如下:
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>hello spring mvc!</title> </head> <body> <h2>${message}</h2> </body> </html>
3.7、测试运行
启动tomcat运行项目,请注意查看启动信息,如果有异常应该先解决异常信息,运行成功后的结果如下所示:
3.8、示例下载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。