这个例子是来自于Gary Mak等人写的Spring攻略(第二版)第八章Spring @MVC中的一个例子,在此以学习为目的进行记录。

问题:想用Spring MVC开发一个简单的Web应用, 学习这个框架的基本概念和配置。

解决方案:

Spring MVC的核心组件是一个控制器(大多数框架都是控制器比较重要吧)。

在最简单的Spring MVC应用中,控制器是需要在web.xml文件中配置的唯一Servlet。

Spring MVC的控制器通常称作请求分发Servlet(Dispatcher Servlet),实现了Java EE设计模式中的前端控制器(Front controller)。

每个web请求都要经过这个前端控制器,以便它能够管理整个请求处理过程。

当一个web请求发送给Spring MVC应用,控制器首先接受这个请求,然后控制器组织处理该请求的组件。

在Spring 3.0中定义一个控制器类,必须以@Control注解标记。(不理解注解是个啥)在以前则是要通过实现框架专有的接口或者扩展框架专用的基类,3.0以后就只用添加注解了。

加上了@Controller注解的类(也就是控制器类),就回去找人(合适的处理程序方法)来处理请求。

用@RequestMapping注解修饰的控制器方法就成为处理程序的方法。

这些处理程序方法的签名就像任何标准类里的方法一样,可以任意修改。同时处理程序方法也可以根据应用逻辑返回一系列值。

在处理程序结束请求处理之后,便将控制委托给视图,这个视图来处理程序方法的返回值,视图可以是多种形式。

为了从控制器传递信息给视图,处理程序的方法返回一个逻辑视图名称,String或者void是无关紧要的,因为处理程序的输入参数可以为视图所用。

当控制器类接受一个视图时,它依靠视图解析器将逻辑视图名称解析为具体的视图实现(例如user.jsp)。

视图解析器是web应用上下文中配置的一个实现ViewResolver接口的Bean,其任务是返回逻辑名称视图的具体实现。

视图的作用是将处理程序方法的逻辑中添加的对象显示给用户。

工作原理:

一个简单的web应用实例——开发一个球场预定系统。

首先在domain子包中建立如下三个类:

第一个是预定类,Reservation.java

第二个是预定者,Player.java

第三个是运动类型,SportType.java

在service子包中定义如下的服务接口:ReservationService.java,为表现层提供预定服务。

用包含硬编码添加几个预定订单的类来实现这个接口,即ReservationServiceImpl.java。生产中应该用数据库持续性来实现这个接口。

设置Spring MVC应用

创建一个Spring MVC应用布局和标准的Java Web应用相同,但是例外的是必须添加一些Spring MVC专用的配置文件和必须的库程序。

用户可以通过URL直接访问到WEB-INF目录之外的文件,所以CSS文件和图像必须放在那里,使用Spring MVC时,JSP文件起着模板的作用。

框架读取JSP文件用于生成动态内容,所以JSP必须在WEB-INF目录内,避免直接访问。

创建配置文件

web.xml是Java Web必不可少的配置文件,在这里为应用程序定义Servlet以及Web请求到这些Servlet的映射方式。

对于Spring MVC应用,只需要定义一个DispatcherServlet实例,作为前端控制器,如果需要的话也可以定义多个。

在大型应用中,使用多个DispatcherServlet实例可能更加方便,可将DispatcherServlet实例指派给特定的URL。

DispatcherServlet名称的另一个目的就是让DispatcherServlet决定加载哪个Spring MVC配置文件。

默认情况查找的文件名是servlet名加上-servlet.xml文件。

当然也可以在Servlet参数contextConfigLocation中明确指定一个配置文件。

如上court-servlet.xml是一个标准的Spring bean配置文件。

每一层声明一个Bean配置文件(例如持续层court-persistence.xml和服务层的court-service.xml)。

为了让Spring加载court-servlet.xml之外的配置文件,就必须要在web.xml中定义servlet监听器ContextLoaderListener

(这配置文件把头的搞晕了,不适合我这双商低的弱势群体啊!)

ContextLoaderListener加载指定的Bean配置文件到根应用的上下文中,而每个DispatcherServlet将其配置文件加载到自己的应用上下文,并且引用根应用上下文为期上下级。

所以每个DispatcherServlet实例加载的上下文可以访问甚至覆盖根应用的上下文声明中的Bean(反之则不行)。

(这里讲的是啥啊,啥啥啥。根应用上下文和自己的应用上下文?局部变量覆盖了全局变量?)

激活Spring MVC注解扫描

(开雷达了?)

在创建控制器类之前,要在配置web应用,使其扫描各个类来确定@Controller和@RequestMapping注解的存在。

只有带有这些注解的类能够像控制器一样操作。

首先,要让Spring自动监测注解,必须通过<context:component-scan>元素启用Spring的组件扫描功能。

除了这个之外,Spring MVC的@RequestMapping注解将URL请求映射到控制器类及其对应的处理方法,这就需要在Web应用上下文有更多的声明。

在Web应用上下文注册一个DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例。

上面两个实例分别在类级别方法级别处理@RequestMapping注解。

创建Spring MVC控制器

基于注解的控制器类可以是任意的类,不用实现特殊的接口或扩展特殊的基类。

可以用@Controller注解这种类。控制器中可以定义一个或者多个处理程序方法来处理一个或者多个动作。

@RequestMapping注解可以应用到类级别或者方法级别。

@RequestMapping注解还可以包含属性。

这个类中使用的第一个值("/welcome")用于指定体现控制器操作的URL,意味着/welcome URL接受的请求由WelcomeController类处理。

一旦控制器开始处理请求,它将调用委派给控制器中声明的默认HTTP GET处理程序方法。

这是因为对URL的每个初始请求都是HTTP GET类型。

所以当控制器处理对/welcome URL请求时,请求随后被委派到默认的HTTP GET处理程序方法处理。

@RequestMapping(method=RequestMethod.GET)注解用于将welcome方法装饰成控制器默认的HTTP GET处理程序方法。

新增加了赋予类的构造程序@Autowired注解,这个注解允许类的构造程序从应用配置文件court-service.xml中声明实例化其字段。

@Autowired注解不需要使用XML注入属性。

@RequestMapping("/reservationQuery")语句指出,URL/reservationQuery上的任何请求都又该控制器处理。

一个类级别的注解对应了两个处理程序方法,一个方法在/reservationQuery URL上的HTTP GET请求时发生,而另一个方法是在HTTP POST请求发生时调用。

Web应用中大部分请求是HTTP GET,HTTP POST请求一般在用户提交HTML表单时发出。

@RequestParam("courtName") String courtName声明,用于提取名为courtName的请求参数。

另外一个是Model声明,用于定义向返回视图传递数据的对象。

创建JSP视图

在Spring MVC中,视图常常是JSTL编写的JSP模板。当应用的web.xml文件中定义的DispatcherServlet接收到处理程序返回的视图名称,它将逻辑视图名称解析为视图实现以供显示。

部署web应用

用Spring MVC开发简单的Web应用的更多相关文章

  1. 用Spring MVC开发简单的Web应用程序

    1 工具与环境 借助Eclipse4.3 + Maven3.0.3构建Java Web应用程序.使用Maven内置的servlet 容器jetty,不需手工集成Web服务器到Eclipse.还帮我们自 ...

  2. Spring MVC之简单入门

    一.Spring MVC简介: 1.什么是MVC 模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计模式.它主要通过分离模型(Model).视图(View)及控制器(Contr ...

  3. 干净win7要做几步才能运行第一个Spring MVC 写的动态web程序

    干净win7要做几步才能运行第一个Spring MVC 写的动态web程序: 1. 下载安装jdk 2. 配置Java环境变量 3. 测试一下第1,2两步是否完全成功:http://jingyan.b ...

  4. 使用Spring MVC开发RESTful API

    第3章 使用Spring MVC开发RESTful API Restful简介 第一印象 左侧是传统写法,右侧是RESTful写法 用url描述资源,而不是行为 用http方法描述行为,使用http状 ...

  5. CRUD using Spring MVC 4.0 RESTful Web Services and AngularJS

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  6. [转] 使用Spring MVC构建REST风格WEB应用

    原文地址:http://fancy888.iteye.com/blog/1629120 对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理 ...

  7. 使用Spring MVC构建REST风格WEB应用

    转自:http://fancy888.iteye.com/blog/1629120 对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理数据 ...

  8. 使用Spring Boot开发 “Hello World” Web应用

    环境准备 由于现在很多IDE都支持Maven, 所以我们将使用Maven构建该工程: 开始之前,需要先安装Java和Maven: 本工程将基于Spring Boot 1.4.3.RELEASE开发,推 ...

  9. Spring MVC中发布Restful Web服务

      对于企业应用来说,数据是许多业务的命脉,软件通常是可替换的,但是多年积累的数据是永远不能替换的.   近些年来,以信息为中心的表述性状态转移(Representational State Tran ...

随机推荐

  1. Openstack的镜像上传原理

    openstack的horizon的上传镜像流程 通过html的form表单上传文件 先上传到horizon指定的临时目录,存储起来 通过glance-api请求接口 实际上glance-api也是提 ...

  2. http-使用get和post方式提交数据

    注意点: 1.Get和post这两种提交方式有何不同? 很明显post方式提交多了content-length和content-type这两项,所以post提交是要为这两项设置setRequestPr ...

  3. Asp.net的post提交方式

    //建立WebRequest对象,url目标地址HttpWebRequest req =(HttpWebRequest)WebRequest.Create(url); //将LoginInfo转换为b ...

  4. python核心编程学习记录之基础知识

    虽然对python的基础知识有所了解,但是为了更深入的学习,要对python的各种经典书籍进行学习 第一章介绍python的优缺点,略过 第二章介绍python起步,第三章介绍python基础,仅记录 ...

  5. HTTP详解(1)-工作原理【转】

    转自:http://blog.csdn.net/hguisu/article/details/8680808 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 1 HTTP简 ...

  6. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

  7. python sklearn环境配置

    os:win10   python2.7 主要参照 1.现下载pip.exe,因为很多安装文件都变成whl格式了,这里要注意下载对应python版本的,要用管理员权限,可以参照https://pypi ...

  8. HDU:Integer Inquiry

    #include"stdio.h" #include"stdlib.h" #include"string.h" #define N 105 ...

  9. YTU 3008: 链串的基本运算

    3008: 链串的基本运算 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 题目描述 编写一个程序,实现链串的各种基本运算,主函数已给出,请补充每一种方法. 1.建立串s ...

  10. PreparedStatement接口及其方法的使用

    PreparedStatement接口是Statement接口的子接口,使用它的好处有三个 一:简化代码,便于sql语句的书写 二:有效的禁止sql语句的注入,例如:用户名和密码,使用Prepared ...