使用 Spring 25 基于注解驱动的 Spring MVC.docx

上传人:b****3 文档编号:4638617 上传时间:2023-05-07 格式:DOCX 页数:26 大小:25.41KB
下载 相关 举报
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第1页
第1页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第2页
第2页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第3页
第3页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第4页
第4页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第5页
第5页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第6页
第6页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第7页
第7页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第8页
第8页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第9页
第9页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第10页
第10页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第11页
第11页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第12页
第12页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第13页
第13页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第14页
第14页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第15页
第15页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第16页
第16页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第17页
第17页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第18页
第18页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第19页
第19页 / 共26页
使用 Spring 25 基于注解驱动的 Spring MVC.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

使用 Spring 25 基于注解驱动的 Spring MVC.docx

《使用 Spring 25 基于注解驱动的 Spring MVC.docx》由会员分享,可在线阅读,更多相关《使用 Spring 25 基于注解驱动的 Spring MVC.docx(26页珍藏版)》请在冰点文库上搜索。

使用 Spring 25 基于注解驱动的 Spring MVC.docx

使用Spring25基于注解驱动的SpringMVC

使用Spring2.5基于注解驱动的SpringMVC

概述

继Spring2.0对SpringMVC进行重大升级后,Spring2.5又为SpringMVC引入了注解驱动功能。

现在你无须让Controller继承任何接口,无需在XML配置文件中定义请求和Controller的映射关系,仅仅使用注解就可以让一个POJO具有Controller的绝大部分功能——SpringMVC框架的易用性得到了进一步的增强.在框架灵活性、易用性和扩展性上,SpringMVC已经全面超越了其它的MVC框架,伴随着Spring一路高唱猛进,可以预见SpringMVC在MVC市场上的吸引力将越来越不可抗拒。

本文将介绍Spring2.5新增的SpingMVC注解功能,讲述如何使用注解配置替换传统的基于XML的SpringMVC配置。

回页首

一个简单的基于注解的Controller

使用过低版本SpringMVC的读者都知道:

当创建一个Controller时,我们需要直接或间接地实现org.springframework.web.servlet.mvc.Controller接口。

一般情况下,我们是通过继承SimpleFormController或MultiActionController来定义自己的Controller的。

在定义Controller后,一个重要的事件是在SpringMVC的配置文件中通过HandlerMapping定义请求和控制器的映射关系,以便将两者关联起来。

来看一下基于注解的Controller是如何定义做到这一点的,下面是使用注解的BbtForumController:

清单1.BbtForumController.java

packagecom.baobaotao.web;

importcom.baobaotao.service.BbtForumService;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Controller;

importorg.springframework.web.bind.annotation.ModelAttribute;

importorg.springframework.web.bind.annotation.RequestMapping;

importorg.springframework.web.bind.annotation.RequestMethod;

importjava.util.Collection;

@Controller//<——①

@RequestMapping("/forum.do")

publicclassBbtForumController{

@Autowired

privateBbtForumServicebbtForumService;

@RequestMapping//<——②

publicStringlistAllBoard(){

bbtForumService.getAllBoard();

System.out.println("calllistAllBoardmethod.");

return"listBoard";

}

}

从上面代码中,我们可以看出BbtForumController和一般的类并没有区别,它没有实现任何特殊的接口,因而是一个地道的POJO。

让这个POJO与众不同的魔棒就是SpringMVC的注解!

在①处使用了两个注解,分别是@Controller和@RequestMapping。

在“使用Spring2.5基于注解驱动的IoC”这篇文章里,笔者曾经指出过@Controller、@Service以及@Repository和@Component注解的作用是等价的:

将一个类成为Spring容器的Bean。

由于SpringMVC的Controller必须事先是一个Bean,所以@Controller注解是不可缺少的。

真正让BbtForumController具备SpringMVCController功能的是@RequestMapping这个注解。

@RequestMapping可以标注在类定义处,将Controller和特定请求关联起来;还可以标注在方法签名处,以便进一步对请求进行分流。

在①处,我们让BbtForumController关联“/forum.do”的请求,而②处,我们具体地指定listAllBoard()方法来处理请求。

所以在类声明处标注的@RequestMapping相当于让POJO实现了Controller接口,而在方法定义处的@RequestMapping相当于让POJO扩展Spring预定义的Controller(如SimpleFormController等)。

为了让基于注解的SpringMVC真正工作起来,需要在SpringMVC对应的xxx-servlet.xml配置文件中做一些手脚。

在此之前,还是先来看一下web.xml的配置吧:

清单2.web.xml:

启用Spring容器和SpringMVC框架

xmlversion="1.0"encoding="UTF-8"?

>

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="

version="2.5">

SpringAnnotationMVCSample

--Spring服务层的配置文件-->

contextConfigLocation

classpath:

applicationContext.xml

--Spring容器启动监听器-->

org.springframework.web.context.ContextLoaderListener

--SpringMVC的Servlet,它将加载WEB-INF/annomvc-servlet.xml的

配置文件,以启动SpringMVC模块-->

annomvc

org.springframework.web.servlet.DispatcherServlet

2

annomvc

*.do

web.xml中定义了一个名为annomvc的SpringMVC模块,按照SpringMVC的契约,需要在WEB-INF/annomvc-servlet.xml配置文件中定义SpringMVC模块的具体配置。

annomvc-servlet.xml的配置内容如下所示:

清单3.annomvc-servlet.xml

xmlversion="1.0"encoding="UTF-8"?

>

xmlns="http:

//www.springframework.org/schema/beans"

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xmlns:

p="http:

//www.springframework.org/schema/p"

xmlns:

context="http:

//www.springframework.org/schema/context"

xsi:

schemaLocation="http:

//www.springframework.org/schema/beans

http:

//www.springframework.org/schema/beans/spring-beans-2.5.xsd

http:

//www.springframework.org/schema/context

http:

//www.springframework.org/schema/context/spring-context-2.5.xsd">

--①:

对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能-->

component-scanbase-package="com.baobaotao.web"/>

--②:

启动SpringMVC的注解功能,完成请求和注解POJO的映射-->

AnnotationMethodHandlerAdapter"/>

--③:

对模型视图名称的解析,即在模型视图名称添加前后缀-->

p:

prefix="/WEB-INF/jsp/"p:

suffix=".jsp"/>

因为Spring所有功能都在Bean的基础上演化而来,所以必须事先将Controller变成Bean,这是通过在类中标注@Controller并在annomvc-servlet.xml中启用组件扫描机制来完成的,如①所示。

在②处,配置了一个AnnotationMethodHandlerAdapter,它负责根据Bean中的SpringMVC注解对Bean进行加工处理,使这些Bean变成控制器并映射特定的URL请求。

而③处的工作是定义模型视图名称的解析规则,这里我们使用了Spring2.5的特殊命名空间,即p命名空间,它将原先需要通过元素配置的内容转化为属性配置,在一定程度上简化了的配置。

启动Tomcat,发送http:

//localhost/forum.doURL请求,BbtForumController的listAllBoard()方法将响应这个请求,并转向WEB-INF/jsp/listBoard.jsp的视图页面。

回页首

让一个Controller处理多个URL请求

在低版本的SpringMVC中,我们可以通过继承MultiActionController让一个Controller处理多个URL请求。

使用@RequestMapping注解后,这个功能更加容易实现了。

请看下面的代码:

清单3.每个请求处理参数对应一个URL

packagecom.baobaotao.web;

importcom.baobaotao.service.BbtForumService;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Controller;

importorg.springframework.web.bind.annotation.RequestMapping;

@Controller

publicclassBbtForumController{

@Autowired

privateBbtForumServicebbtForumService;

@RequestMapping("/listAllBoard.do")//<——①

publicStringlistAllBoard(){

bbtForumService.getAllBoard();

System.out.println("calllistAllBoardmethod.");

return"listBoard";

}

@RequestMapping("/listBoardTopic.do")//<——②

publicStringlistBoardTopic(inttopicId){

bbtForumService.getBoardTopics(topicId);

System.out.println("calllistBoardTopicmethod.");

return"listTopic";

}

}

在这里,我们分别在①和②处为listAllBoard()和listBoardTopic()方法标注了@RequestMapping注解,分别指定这两个方法处理的URL请求,这相当于将BbtForumController改造为MultiActionController。

这样/listAllBoard.do的URL请求将由listAllBoard()负责处理,而/listBoardTopic.do?

topicId=1的URL请求则由listBoardTopic()方法处理。

对于处理多个URL请求的Controller来说,我们倾向于通过一个URL参数指定Controller处理方法的名称(如method=listAllBoard),而非直接通过不同的URL指定Controller的处理方法。

使用@RequestMapping注解很容易实现这个常用的需求。

来看下面的代码:

清单4.一个Controller对应一个URL,由请求参数决定请求处理方法

packagecom.baobaotao.web;

importcom.baobaotao.service.BbtForumService;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Controller;

importorg.springframework.web.bind.annotation.RequestMapping;

@Controller

@RequestMapping("/bbtForum.do")//<——①指定控制器对应URL请求

publicclassBbtForumController{

@Autowired

privateBbtForumServicebbtForumService;

//<——②如果URL请求中包括"method=listAllBoard"的参数,由本方法进行处理

@RequestMapping(params="method=listAllBoard")

publicStringlistAllBoard(){

bbtForumService.getAllBoard();

System.out.println("calllistAllBoardmethod.");

return"listBoard";

}

//<——③如果URL请求中包括"method=listBoardTopic"的参数,由本方法进行处理

@RequestMapping(params="method=listBoardTopic")

publicStringlistBoardTopic(inttopicId){

bbtForumService.getBoardTopics(topicId);

System.out.println("calllistBoardTopicmethod.");

return"listTopic";

}

}

在类定义处标注的@RequestMapping让BbtForumController处理所有包含/bbtForum.do的URL请求,而BbtForumController中的请求处理方法对URL请求的分流规则在②和③处定义分流规则按照URL的method请求参数确定。

所以分别在类定义处和方法定义处使用@RequestMapping注解,就可以很容易通过URL参数指定Controller的处理方法了。

@RequestMapping注解中除了params属性外,还有一个常用的属性是method,它可以让Controller方法处理特定HTTP请求方式的请求,如让一个方法处理HTTPGET请求,而另一个方法处理HTTPPOST请求,如下所示:

清单4.让请求处理方法处理特定的HTTP请求方法

packagecom.baobaotao.web;

importcom.baobaotao.service.BbtForumService;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Controller;

importorg.springframework.web.bind.annotation.RequestMapping;

importorg.springframework.web.bind.annotation.RequestMethod;

@Controller

@RequestMapping("/bbtForum.do")

publicclassBbtForumController{

@RequestMapping(params="method=createTopic",method=RequestMethod.POST)

publicStringcreateTopic(){

System.out.println("callcreateTopicmethod.");

return"createTopic";

}

}

这样只有当/bbtForum.do?

method=createTopic请求以HTTPPOST方式提交时,createTopic()方法才会进行处理。

回页首

处理方法入参如何绑定URL参数

按契约绑定

Controller的方法标注了@RequestMapping注解后,它就能处理特定的URL请求。

我们不禁要问:

请求处理方法入参是如何绑定URL参数的呢?

在回答这个问题之前先来看下面的代码:

清单5.按参数名匹配进行绑定

@RequestMapping(params="method=listBoardTopic")

//<——①topicId入参是如何绑定URL请求参数的?

publicStringlistBoardTopic(inttopicId){

bbtForumService.getBoardTopics(topicId);

System.out.println("calllistBoardTopicmethod.");

return"listTopic";

}

当我们发送http:

//localhost//bbtForum.do?

method=listBoardTopic&topicId=10的URL请求时,Spring不但让listBoardTopic()方法处理这个请求,而且还将topicId请求参数在类型转换后绑定到listBoardTopic()方法的topicId入参上。

而listBoardTopic()方法的返回类型是String,它将被解析为逻辑视图的名称。

也就是说Spring在如何给处理方法入参自动赋值以及如何将处理方法返回值转化为ModelAndView中的过程中存在一套潜在的规则,不熟悉这个规则就不可能很好地开发基于注解的请求处理方法,因此了解这个潜在规则无疑成为理解SpringMVC框架基于注解功能的核心问题。

我们不妨从最常见的开始说起:

请求处理方法入参的类型可以是Java基本数据类型或String类型,这时方法入参按参数名匹配的原则绑定到URL请求参数,同时还自动完成String类型的URL请求参数到请求处理方法参数类型的转换。

下面给出几个例子:

∙listBoardTopic(inttopicId):

和topicIdURL请求参数绑定;

∙listBoardTopic(inttopicId,StringboardName):

分别和topicId、boardNameURL请求参数绑定;

特别的,如果入参是基本数据类型(如int、long、float等),URL请求参数中一定要有对应的参数,否则将抛出TypeMismatchException异常,提示无法将null转换为基本数据类型。

另外,请求处理方法的入参也可以一个JavaBean,如下面的User对象就可以作为一个入参:

清单6.User.java:

一个JavaBean

packagecom.baobaotao.web;

publicclassUser{

privateintuserId;

privateStringuserName;

//省略get/setter方法

publicStringtoString(){

return

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2