Spring MVC之简单入门
一、Spring MVC简介:
1、什么是MVC
模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计模式。它主要通过分离模型(Model)、视图(View)及控制器(Control)在应用程序中的角色,从而将业务逻辑从界面中解耦。通常,模型负责封装应用程序数据在视图层展示。视图仅仅只是展示这些数据,不包含任何业务逻辑。控制器负责接收来自用户的请求,并调用后台服务(manager或者dao)来处理业务逻辑。处理后,后台业务层可能会返回了一些数据在视图层展示。控制器收集这些数据及准备模型在视图层展示。MVC模式的核心思想是将业务逻辑从界面中分离出来,允许它们单独改变而不会相互影响。
2、Spring MVC
Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring 3.0更加完善,实现了对Struts 2的超越。现在越来越多的开发团队选择了Spring MVC。
Spring MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
Struts2也是非常优秀的MVC构架,优点非常多比如良好的结构,拦截器的思想,丰富的功能。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降,应避免使用这些功能。而Struts2的多层拦截器、多实例action性能都很好。
Spring MVC的优点:
---Spring MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多。
---Spring MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分)
---Spring MVC的灵活是你无法想像的,Spring框架的扩展性有口皆碑,Spring MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。
二、Spring MVC的处理请求的基本流程
一个基本的流程图如下:
Spring MVC处理一个用户的请求的基本流程如下:
1、首先用户发送请求——>web服务器,此时web服务器已经根据web.xml的配置信息完成了相关初始化;
2、web服务器——>总控制器DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
3、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一 个 Handler 处理器(页面控制器)对象、多个 HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新 的映射策略;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处 理方法,完成功能处理;并返回一个 ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView 的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的 View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View 会根据传进来的 Model 模型数据进行渲染,此处的 Model 实际是一个 Map 数据结构,因此 很容易支持其他视图技术;
7、返回控制权给 DispatcherServlet,由 DispatcherServlet 返回响应给用户,到此一个流程结束。
我们需要关心的核心开发步骤:
---DispatcherServlet 需要在 web.xml 中的部署描述,从而拦截请求到 Spring MVC。
---HandlerMapping 的配置,从而将请求映射到处理器。
---HandlerAdapter 的配置,从而支持多种类型的处理器
---ViewResolver 的配置,从而将逻辑视图名解析为具体视图技术
---处理器(页面控制器)的配置,从而进行功能处理
三、实例演示
这里利用Spring MVC来实现一个查询员工信息的程序。
1、首先建立一个maven web工程,编辑pom.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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kang</groupId>
<artifactId>SpringmvcTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> <!-- Spring MVC support --> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.4.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.4.RELEASE</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> </dependencies>
</project>
2、配置web.xml
配置 DispatcherServlet :DispatcherServlet 默认加载 /WEB-INF/<servletName>-servlet.xml 的 Spring 配置文件, 启动 WEB 层的 Spring 容器。可以通过 contextConfigLocation 初始化参数自定义配置文件的位置和名称。
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" 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_2_5.xsd"
id="taotao" version="2.5">
<display-name>SpringmvcTest</display-name> <!-- 配置 DispatcherServlet -->
<servlet>
<!--
这个Servlet的名字是spring,可以有多个DispatcherServlet,是通过名字来区分的。
每一个DispatcherServlet有自己的WebApplicationContext上下文对象。
同时保存在ServletContext中和Request对象中
-->
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- load-on-startup标示的是启动顺序,让这个Servlet随Servlet容器一起启动 -->
<load-on-startup>1</load-on-startup>
<!--
配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
-->
<!-- 这里采用默认配置, SpringMVC会在WEB-INF目录下寻找spring-servlet.xml
(因为这里定义的servlet-name是spring)来完成初始化-->
</servlet> <!-- 定义拦截哪些请求 -->
<servlet-mapping>
<!-- 与上面定义的servlet-name保持一致 -->
<servlet-name>spring</servlet-name>
<!--
url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。
也可以如“*.html”表示拦截所有以html为扩展名的请求。
-->
<url-pattern>/</url-pattern>
</servlet-mapping> </web-app>
3、配置spring的配置文件
上面配置好web.xml后,请求已交给Spring MVC框架处理,因此我们需要配置Spring的配置文件。我们需要在Spring配置文件中配置HandlerMapping、HandlerAdapter。注意此配置文件必须在WEB-INF目录下,且名为spring-servlet.xml。
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:aop="http://www.springframework.org/schema/aop"
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/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- 配置自定扫描的包 -->
<context:component-scan base-package="com.kang"></context:component-scan> <!--
Spring MVC 提供主要的 HanderMapping 有 DefaultAnnotationHandlerMapping,
SimpleUrlHandlerMapping 和 BeanNameUrlHandlerMapping。
-->
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
配置视图解析器中
InternalResourceViewResolver:用于支持Servlet、JSP视图解析;
prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),比如传进来的逻辑视图名为hello,则该该jsp视图页面应该存放在“WEB-INF/views/hello.jsp”;
4、编写实现代码
---建立员工模型信息:这个类作为MVC模式的模型。
EmployeeVO.java
package com.kang.model; import java.io.Serializable; public class EmployeeVO implements Serializable {
private static final long serialVersionUID = 1L; private Integer id;
private String firstName;
private String lastName; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} @Override
public String toString() {
return "EmployeeVO [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
}
}
---编写模拟与数据库交互的DAO代码:这个类位于三层架构中的第三层,负责与底层的数据库存储进行交互。
EmployeeDAO.java
package com.kang.dao; import java.util.List; import com.kang.model.EmployeeVO; public interface EmployeeDAO {
public List<EmployeeVO> getAllEmployees();
}
EmployeeDAOImpl.java
package com.kang.dao; import java.util.ArrayList;
import java.util.List; import org.springframework.stereotype.Repository; import com.kang.model.EmployeeVO; @Repository
public class EmployeeDAOImpl implements EmployeeDAO { public List<EmployeeVO> getAllEmployees() {
List<EmployeeVO> employees = new ArrayList<EmployeeVO>(); EmployeeVO vo1 = new EmployeeVO();
vo1.setId(1);
vo1.setFirstName("xiaokang");
vo1.setLastName("chen");
employees.add(vo1); EmployeeVO vo2 = new EmployeeVO();
vo2.setId(2);
vo2.setFirstName("lei");
vo2.setLastName("wang");
employees.add(vo2); return employees;
}
}
---编写DAO交互服务代码:这个类处于三层架构中的第二层,负责与DAO层交互。
EmployeeManager.java
package com.kang.service; import java.util.List; import com.kang.model.EmployeeVO; public interface EmployeeManager {
public List<EmployeeVO> getAllEmployees();
}
EmployeeManagerImpl.java
package com.kang.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.kang.dao.EmployeeDAO;
import com.kang.model.EmployeeVO; @Service
public class EmployeeManagerImpl implements EmployeeManager { @Autowired
EmployeeDAO dao; public List<EmployeeVO> getAllEmployees() {
return dao.getAllEmployees();
}
}
---编写控制代码:注解@RequestMapping在类级别和方法级别层面确定将被调用方法的URL。
EmployeeController.java
package com.kang.controller; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import com.kang.service.EmployeeManager; @Controller
@RequestMapping("/employee-module")
public class EmployeeController {
@Autowired
EmployeeManager manager; @RequestMapping(value = "/getAllEmployees", method = RequestMethod.GET)
public String getAllEmployees(Model model) {
model.addAttribute("employees", manager.getAllEmployees());
return "employeesListDisplay";
//对应在WEB-INF/views的目录下应该有一个employeesListDisplay.jsp。 }
}
5、编写jsp页面
首先写一个index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC Test</title>
</head>
<body>
<a href="employee-module/getAllEmployees">获取员工信息</a>
<!-- 以get的方式发送一个请求,名为employee-module/getAllEmployees -->
</body>
</html>
然后再正确的位置编写一个jsp页面来显示结果。其位置和名称都由之前的相关配置决定。
spring-servlet.xml中一下两句指明了视图的目录为/WEB-INF/views/,后缀名为.jsp。
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
EmployeeController.java中以下语句指定了这个视图的名为employeesListDisplay
return "employeesListDisplay";
综上,应该在/WEB-INF/views/目录下定义一个employeesListDisplay.jsp的文件。
employeesListDisplay.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <html>
<head>
<title>Spring MVC Hello World</title>
</head> <body>
<h2>All Employees in System</h2> <table border="1">
<tr>
<th>Employee Id</th>
<th>First Name</th>
<th>Last Name</th>
</tr>
<c:forEach items="${employees}" var="employee">
<tr>
<td>${employee.id}</td>
<td>${employee.firstName}</td>
<td>${employee.lastName}</td>
</tr>
</c:forEach>
</table> </body>
</html>
至此,整个项目构建完毕,完整目录结构如下:
6、测试
将项目部署到tomcat上,访问index.jsp,点击超链接,结果如下:
Spring MVC之简单入门的更多相关文章
- 基于注解的Spring MVC的简单入门——简略版
网上关于此教程各种版本,太多太多了,因为我之前没搭过框架,最近带着两个实习生,为了帮他们搭框架,我只好...惭愧啊...基本原理的话各位自己了解下,表示我自己从来没研究过Spring的源码,所以工作了 ...
- Spring MVC 教程,快速入门,深入分析
http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: ...
- 用Spring MVC开发简单的Web应用程序
1 工具与环境 借助Eclipse4.3 + Maven3.0.3构建Java Web应用程序.使用Maven内置的servlet 容器jetty,不需手工集成Web服务器到Eclipse.还帮我们自 ...
- Spring MVC整合Mybatis 入门
本文记录使用Intellij创建Maven Web工程搭建Spring MVC + Mybatis 的一个非常简单的示例.关于Mybatis的入门使用可参考这篇文章,本文在该文的基础上,引入了Spri ...
- Spring MVC 教程,快速入门,深入分析[1-11]
资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com ...
- [转]Spring MVC 教程,快速入门,深入分析
原文地址:http://elf8848.iteye.com/blog/875830 目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mv ...
- 用Spring MVC开发简单的Web应用
这个例子是来自于Gary Mak等人写的Spring攻略(第二版)第八章Spring @MVC中的一个例子,在此以学习为目的进行记录. 问题:想用Spring MVC开发一个简单的Web应用, 学习这 ...
- Spring MVC 教程,快速入门,深入分析(转载)
作者:赵磊 博客:http://elf8848.iteye.com 下载: Spring的官方下载网址是:http://www.springsource.org/download (本文使用是的 ...
- Spring MVC 简介及入门小例子
说明:文章内容全部截选自实验楼教程[Spring MVC 简易教程] 一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring ...
随机推荐
- 浏览器的 16ms 渲染帧--摘抄
由于现在广泛使用的屏幕都有固定的刷新率(比如最新的一般在 60Hz), 在两次硬件刷新之间浏览器进行两次重绘是没有意义的只会消耗性能. 浏览器会利用这个间隔 16ms(1000ms/60)适当地对绘制 ...
- SEO总结(一)
- 系统虚拟内存的理解 转载自http://blog.csdn.net/do2jiang/article/details/4690967
在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序 ...
- https的简单学习
HTTPS介绍: (全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Sec ...
- 更新YUM源后的arning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY错误
yum源更新后需要导入key值,否则报错如下,无法安装相关的包. Totalsize:42M DownloadingPackages: warning:rpmts_HdrFromFdno:Header ...
- js拖拽效果的实现
1.最基础的写法 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> < ...
- Codeforces 877E Danil and a Part-time Job(dfs序 + 线段树)
题目链接 Danil and a Part-time Job 题意 给出一系列询问或者修改操作 $pow$ $x$表示把以$x$为根的子树的所有结点的状态取反($0$变$1$,$1$变$0$ ...
- DELPHI是怎么实现跨平台的?
DELPHI是怎么实现跨平台的? 首先跨平台必须要兼容原来的语法,以线程的临界区对象为例: TCriticalSection = class(TSynchroObject){$IFDEF POSIX} ...
- Basic Vim Configuration
原文: https://computers.tutsplus.com/tutorials/basic-vim-configuration--cms-21498 原来,vim的配置文件,.vimrc也是 ...
- hdu 5389 Zero Escape (dp)
题目:http://acm.hdu.edu.cn/showproblem.php? pid=5389 题意:定义数根:①把每一位上的数字加起来得到一个新的数,②反复①直到得到的数仅仅有1位.给定n,A ...