资讯专栏INFORMATION COLUMN

3.1、定义一个控制器:使用 @Controller 和 @RequestMapping

Render / 1982人阅读

摘要:用定义一个控制器注解指定一个特定的类担任控制器的角色。典型地,类级别的注解映射一个指定的请求路径或者是路径匹配模式到一个控制器,使用额外的方法层注解缩小主要映射的范围。第一处是类级别的,它指出这个控制器中的所有方法都与路径相关。

1)用 @Controller 定义一个控制器

    注解 @Controller 指定一个特定的类担任控制器的角色。Spring 不要求你集成任何控制器基类或者引用 Servlet API。不过,你仍然可以根据需要使用指定的 Servlet 特性。
    注解 @Controller 对于被注解的类来说就像一个模板(stereotype),指示它的角色。收发器(dispatcher)为被映射的方法扫描被注解的类,并检测注解 @RequestMapping(见下一部分)。
    你可以在分发器的上下文中使用标准的 Spring Bean 定义,来显式地定义被注解的控制器。不过,@Controller 模板也允许自动检测,就像 Spring 通常支持的在类路径中自动检测组件类并自动为它们注册 Bean 定义。
    为了能够自动检测到这样被注解的控制器,你要添加组件扫描到你的配置中。像下面的 XML 片段那样使用 Spring 的 context"命名空间:




    
    ......
2)使用 @RequestMapping 映射请求

    使用注解 @RequestMapping 映射一个 URL(比如:/contex)到一个类或者一个特定的处理方法上。典型地,类级别的注解映射一个指定的请求路径(或者是路径匹配模式)到一个控制器,使用额外的方法层注解缩小主要映射的范围。
下面是一个例子:

package com.techmap.examples.controllers;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;


@Controller
@RequestMapping("/contex")
public class ContexController
{
    
    /**
     * 不指定 path 参数
     */
    @RequestMapping(method = RequestMethod.GET)
    public String get1()
    {
        return "/examples/targets/test1";
    }
    
    /**
     * 带有 path 参数
     */
    @RequestMapping(path = "/new", method = RequestMethod.GET)
    public String get2()
    {
        return "/examples/targets/test2";
    }
    
    /**
     * 带有 URI 模板
     */
    @RequestMapping(path = "/{day}", method = RequestMethod.GET)
    public String getForDay(@PathVariable @DateTimeFormat(iso = ISO.DATE) Date day, Model model)
    {
        System.out.println("--> " + new SimpleDateFormat("yyyy-MM-dd").format(day));
        
        return "/examples/targets/test3";
    }
}
3)测试例子

    为使得例子可用,在上一篇的项目中添加下面三个 jsp 文件:test1.jsp、test3.jsp、test3.jsp。内容如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
    String basepath = request.getScheme() + "://" + request.getServerName() + ":" + request
            .getServerPort() + request.getContextPath() + "/";
%>






    

Test 1

代码中只有 test1.jsp,其他两个内容相同,只有

中的内容不同,test2.jsp 中是

Test 2

,test3.jsp中是

Test 3

。它们所在的目录是:

4)改造一下 helloWorld.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
    String basepath = request.getScheme() + "://" + request.getServerName() + ":" + request
            .getServerPort() + request.getContextPath() + "/";
%>






    

Hello World!

Test Controller

Test1
Test2
Test3
5)开始测试

    用上一篇中给出的路径进入 helloWorld.jsp,看到如下页面:

    分别点击超链接 Test1、Test2、Test3,将会跳到上面定义的三个 test*.jsp 页面。值得注意的是,点击 Test3 时,控制台会打印出如下的信息:

...
DEBUG 2016-09-05 08:15:23,152 Last-Modified value for [/spring5mvc/contex/2016-09-05] is: -1  (DispatcherServlet.java:951) 
--> 2016-09-05
DEBUG 2016-09-05 08:15:23,219 Invoking afterPropertiesSet() on bean with name "/examples/targets/test3"
...

这说明Test3中的日期字符串将作为参数传递到参数 day 上。

6)说明

    在上面的例子中,注解 @RequestMapping 被用在了多处。第一处是类级别的,它指出这个控制器中的所有方法都与路径 /contex 相关。方法get1()上有一个 @RequestMapping 来进一步细化:它只接受 GET 请求,这意味着 HTTP GET 请求 /contex 将调用这个方法。方法 get2() 有一个相似的细化;方法 get2() 把 HTTP 方法定义和路径合并到了一起,这样 GET 请求 /contex/new 就可以被这个方法处理了。
    方法 getForDay() 展示了另一种使用 @RequestMapping 的方式:URI 模板(后面介绍)。
    像第一、二篇给出的 Hello World 例子那样,类级别的 @RequestMapping 不是必须的。没有它,所有的路径都是简单的绝对路径,而不是相对的。如果不指定 GET、PUT、POST 等,@RequestMapping 默认映射所有的HTTP方法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65104.html

相关文章

  • SpringMVC【开发Controller】详解

    摘要:是使用拦截器来自动帮我们完成中文乱码的问题的。这是我的首页当然了,基于注解和基于来开发,都是通过映射器适配器和视图解析器的。能够控制请求路径和请求方式一个控制器写多个业务方法到目前为止,我们都是一个控制器写一个业务方法,这肯定是不合理的。 前言 本文主要是讲解在Controller中的开发,主要的知识点有如下: 编码过滤器 使用注解开发 注解@RequestMapping详解 业务方...

    Pines_Cheng 评论0 收藏0
  • SpringMVC之源码分析--HandlerMapping(四)

    摘要:默认支持该策略。以上是对的宏观分析,下面我们进行内部细节分析。整体流程一通过实现接口,完成拦截器相关组件的初始化调用类的方法。总结本文主要分析了的初始化过程,希望对大家有帮助。随着学习的深入,后面有时间在分析下期中涉及的关键,比如等等。 概述 本节我们继续分析HandlerMapping另一个实现类ReqeustMappingHandlerMapping,该类是我们日常开发中使用最多的...

    imccl 评论0 收藏0
  • Spring之旅第八站:Spring MVC Spittr舞台的搭建、基本的制器、请求的输入、表

    摘要:请求旅程的第一站是的。的任务是将请求发送控制器控制器是一个用于处理请求的组件。处理映射器根据请求携带的信息来进行决策。这样的结果就是,只能找到显示声明在配置类中的控制器。 构建Spring Web应用 说明 如果你有幸能看到。 1、本文参考了《Spring 实战》重点内容,参考了GitHub上的代码 2、本文只为记录作为以后参考,要想真正领悟Spring的强大,请看原书。 3、在一次...

    maybe_009 评论0 收藏0
  • SpringMVC之Controller常用注解功能全解析

    摘要:分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了注解。这种绝对路径和相对路径所组合成的最终路径都是相对于根路径而言的。属性属性主要是用于限制能够访问的方法类型的。属性的用法和功能与属性相似。使用标记的参数。 一、简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封...

    wanghui 评论0 收藏0
  • springmvc常用注解标签详解

    摘要:分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了注解。作用该注解用于将的方法返回的对象,通过适当的转换为指定格式后,写入到对象的数据区。用于注解层,在类上面注解。使用标记的参数。 1、@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个M...

    notebin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<