一、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等,具体信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<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文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?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,设置了自动扫描包的功能,具体配置信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?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,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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中带回的信息展示,具体内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<%@ 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、示例下载
项目地址:springmvcdemo.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/best/p/5653916.html