使用Spring 25基于注解驱动的Spring MVCWord格式.docx

上传人:b****5 文档编号:16440995 上传时间:2022-11-23 格式:DOCX 页数:17 大小:25.12KB
下载 相关 举报
使用Spring 25基于注解驱动的Spring MVCWord格式.docx_第1页
第1页 / 共17页
使用Spring 25基于注解驱动的Spring MVCWord格式.docx_第2页
第2页 / 共17页
使用Spring 25基于注解驱动的Spring MVCWord格式.docx_第3页
第3页 / 共17页
使用Spring 25基于注解驱动的Spring MVCWord格式.docx_第4页
第4页 / 共17页
使用Spring 25基于注解驱动的Spring MVCWord格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

使用Spring 25基于注解驱动的Spring MVCWord格式.docx

《使用Spring 25基于注解驱动的Spring MVCWord格式.docx》由会员分享,可在线阅读,更多相关《使用Spring 25基于注解驱动的Spring MVCWord格式.docx(17页珍藏版)》请在冰豆网上搜索。

使用Spring 25基于注解驱动的Spring MVCWord格式.docx

——① 

@RequestMapping("

/forum.do"

public class BbtForumController {

  @Autowired

  private BbtForumService bbtForumService;

  @RequestMapping //<

——② 

  public String listAllBoard() {

    bbtForumService.getAllBoard();

    System.out.println("

call listAllBoard method."

);

    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框架

<

?

xml version="

1.0"

 encoding="

UTF-8"

>

web-app xmlns="

 

  xmlns:

xsi="

http:

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

  xsi:

schemaLocation="

   version="

2.5"

  <

display-name>

Spring Annotation MVC Sample<

/display-name>

!

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

context-param>

    <

param-name>

contextConfigLocation<

/param-name>

param-value>

classpath:

applicationContext.xml<

/param-value>

/context-param>

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

listener>

listener-class>

org.springframework.web.context.ContextLoaderListener

/listener-class>

/listener>

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

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

servlet>

servlet-name>

annomvc<

/servlet-name>

servlet-class>

org.springframework.web.servlet.DispatcherServlet 

/servlet-class>

load-on-startup>

2<

/load-on-startup>

/servlet>

servlet-mapping>

url-pattern>

*.do<

/url-pattern>

/servlet-mapping>

/web-app>

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

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

清单3.annomvc-servlet.xml

beans 

  xmlns="

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

p="

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

context="

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

//www.springframework.org/schema/beans 

  http:

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

//www.springframework.org/schema/context 

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

-- ①:

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

context:

component-scan base-package="

com.baobaotao.web"

/>

-- ②:

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

bean class="

org.springframework.web.servlet.mvc.annotation.

    AnnotationMethodHandlerAdapter"

-- ③:

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

org.springframework.web.servlet.view.InternalResourceViewResolver"

    p:

prefix="

/WEB-INF/jsp/"

 p:

suffix="

.jsp"

/beans>

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

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

而③处的工作是定义模型视图名称的解析规则,这里我们使用了Spring2.5的特殊命名空间,即p命名空间,它将原先需要通过<

property>

元素配置的内容转化为<

bean>

属性配置,在一定程度上简化了<

的配置。

启动Tomcat,发送http:

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

让一个Controller处理多个URL请求

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

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

请看下面的代码:

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

@Controller

  @RequestMapping("

/listAllBoard.do"

) // <

—— ① 

/listBoardTopic.do"

—— ② 

  public String listBoardTopic(int topicId) {

    bbtForumService.getBoardTopics(topicId);

call listBoardTopic method."

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,由请求参数决定请求处理方法

/bbtForum.do"

—— ① 指定控制器对应URL请求 

  // <

—— ② 如果URL请求中包括"

method=listAllBoard"

的参数,由本方法进行处理 

  @RequestMapping(params = "

—— ③ 如果URL请求中包括"

method=listBoardTopic"

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

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

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

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

method=createTopic"

method = RequestMethod.POST)

  public String createTopic(){

call createTopic method."

createTopic"

这样只有当/bbtForum.do?

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

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

按契约绑定

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

我们不禁要问:

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

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

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

  //<

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

当我们发送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

package com.b

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

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1