Spring MVC中@Controller和@RequestMapping注解使用

目录
  • @Controller和@RequestMapping注解使用
    • RequestMapping注解类型
    • 通过@RequestParam接收请求参数
      • SpringMVC应用@Autowired和@Service进行依赖注入
      • 通过org.springframework.web.bind.annotation.ModelAttribute
      • 拦截器的配置
  • @RequestMapping和Controller方法返回值
    • @RequestMapping
    • Controller方法返回值

@Controller和@RequestMapping注解使用

RequestMapping 注解类型

1)方法级别注解

@RequestMapping(value = "/index/login")
public String login() {
/**
* login代表逻辑视图名称,需要根据Spring MVC配置
* 文件中internalResourceViewResolver的前缀和后缀找到对应的物理视图
*/
return "login";
}

2)类级别注解

@RequestMapping("/index")
public class IndexController {
}

通过 @RequestParam 接收请求参数

@RequestMapping("/register")
/**
* 通过@RequestParam接收请求参数
*/
public String register(@RequestParam String uname,
    @RequestParam String upass, Model model) {
    if ("zhangsan".equals(uname) && "123456".equals(upass)) {
        logger.info("成功");
        return "login"; // 注册成功,跳转到 login.jsp
    } else {
        // 在register.jsp页面上可以使用EL表达式取出model的uname值
        model.addAttribute("uname", uname);
        return "register"; // 返回 register.jsp
    }
}
@RequestMapping("/register")
public String register(@ModelAttribute("user") UserForm user) {
    if ("zhangsan".equals(uname) && "123456".equals(upass)) {
        logger.info("成功");
        return "login"; // 注册成功,跳转到 login.jsp
    } else {
        logger.info("失败");
        // 使用@ModelAttribute("user")与model.addAttribute("user",user)的功能相同
        //register.jsp页面上可以使用EL表达式${user.uname}取出ModelAttribute的uname值
        return "register"; // 返回 register.jsp
    }
}

Spring MVC应用@Autowired和@Service进行依赖注入

<context:component-scan base-package="service" />

通过 org.springframework.web.bind.annotation.ModelAttribute

注解类型可经常实现以下两个功能:

1.绑定请求参数到实体对象(表单的命令对象)

@RequestMapping("/register")
public String register(@ModelAttribute("user") UserForm user) {
    if ("zhangsan".equals(uname) && "123456".equals(upass)) {
        logger.info("成功");
        return "login";
    } else {
        logger.info("失败");
        return "register";
}

在上述代码中“@ModelAttribute("user")UserForm user”语句的功能有两个:

将请求参数的输入封装到 user 对象中。

创建 UserForm 实例。

以“user”为键值存储在 Model 对象中,和“model.addAttribute("user",user)”语句的功能一样。如果没有指定键值,即“@ModelAttribute UserForm user”,那么在创建 UserForm 实例时以“userForm”为键值存储在 Model 对象中,和“model.addAtttribute("userForm", user)”语句的功能一样。

2.注解一个非请求处理方法

被 @ModelAttribute 注解的方法将在每次调用该控制器类的请求处理方法前被调用。这种特性可以用来控制登录权限,当然控制登录权限的方法有很多,例如拦截器、过滤器等。

拦截器的配置

让自定义的拦截器生效需要在 Spring MVC 的配置文件中进行配置,配置示例代码如下:

<!-- 配置拦截器 -->
<mvc:interceptors>
    <!-- 配置一个全局拦截器,拦截所有请求 -->
    <bean class="interceptor.TestInterceptor" /> 
    <mvc:interceptor>
        <!-- 配置拦截器作用的路径 -->
        <mvc:mapping path="/**" />
        <!-- 配置不需要拦截作用的路径 -->
        <mvc:exclude-mapping path="" />
        <!-- 定义<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
        <bean class="interceptor.Interceptor1" />
    </mvc:interceptor>
    <mvc:interceptor>
        <!-- 配置拦截器作用的路径 -->
        <mvc:mapping path="/gotoTest" />
        <!-- 定义在<mvc: interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
        <bean class="interceptor.Interceptor2" />
    </mvc:interceptor>
</mvc:interceptors> 

在上述示例代码中,<mvc:interceptors> 元素用于配置一组拦截器,其子元素 <bean> 定义的是全局拦截器,即拦截所有的请求。

<mvc:interceptor> 元素中定义的是指定路径的拦截器,其子元素 <mvc:mapping> 用于配置拦截器作用的路径,该路径在其属性 path 中定义。

如上述示例代码中,path 的属性值“/**”表示拦截所有路径,“/gotoTest”表示拦截所有以“/gotoTest”结尾的路径。如果在请求路径中包含不需要拦截的内容,可以通过 <mvc:exclude-mapping> 子元素进行配置。

需要注意的是,<mvc:interceptor> 元素的子元素必须按照 <mvc:mapping.../>、<mvc:exclude-mapping.../>、<bean.../> 的顺序配置。

@RequestMapping和Controller方法返回值

@RequestMapping

通过@RequestMapping注解可以定义不同的处理器映射规则。

1. URL路径映射

@RequestMapping(value="/item") 或 @RequestMapping("/item") --当括号里有多个属性时,value=不可以省略。

value的值是数组,可以将多个url映射到同一个方法。

/**
 * 查询商品列表
 * @return
 */
@RequestMapping(value = { "itemList", "itemListAll" })
public ModelAndView queryItemList() {
    // 查询商品数据
    List<Item> list = this.itemService.queryItemList();
    // 创建ModelAndView,设置逻辑视图名
    ModelAndView mv = new ModelAndView("itemList");
    // 把商品数据放到模型中
    mv.addObject("itemList", list);
    return mv;
}

2. 添加在类上面

在class上添加@RequestMapping(url)指定通用请求前缀,限制此类下的所有方法请求url必须以请求前缀开头

可以使用此方法对url进行分类管理,如下图:

此时需要进入queryItemList()方法的请求url为:http://127.0.0.1:8080/api/item/itemList.action

或者

http://127.0.0.1:8080/api/item/itemListAll.action

3.请求方法限定

除了可以对url进行设置,还可以限定请求进来的方法。不写的话默认所有方法都可以。

(1)限定GET方法

@RequestMapping(method = RequestMethod.GET)

如果通过POST访问则报错:

HTTP Status 405 - Request method 'POST' not supported

例如:

@RequestMapping(value = "itemList",method = RequestMethod.POST)

(2)限定POST方法

@RequestMapping(method = RequestMethod.POST)

如果通过GET访问则报错:

HTTP Status 405 - Request method 'GET' not supported

(3)GET和POST都可以

@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})

Controller方法返回值

1. 返回ModelAndView --无敌的,带着数据,返回视图路径

controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

@RequestMapping(value = "/item/itemlist.action")
public ModelAndView itemList(){
    // 从MySQL中查询数据
    List<Items> list = itemService.selectItemsList();
    // 创建ModelAndView,用来存放数据和视图
    ModelAndView mav = new ModelAndView();
    // 设置数据到模型中
    mav.addObject("itemList", list); //页面上循环的是itemList
    // 设置视图的路径,需要设置视图的物理地址
    //mav.setViewName("/WEB-INF/jsp/itemList.jsp");
    mav.setViewName("itemList"); //在springmvc.xml中替换掉默认的视图解析器
    return mav;
}

2. 返回void --数据通过形参 Model model 或者 ModelMap model,但是没办法return视图。

如果需要返回视图得通过request或response。这种比较适合ajax请求,但是给ajax返回数据得json格式数据。

在Controller方法形参上可以定义request和response,使用request或response指定响应结果:

(1)使用request转发页面,如下:

request.getRequestDispatcher("页面路径").forward(request, response);
request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

(2)可以通过response页面重定向:

response.sendRedirect("url")
response.sendRedirect("/itemEdit.action");

(3)可以通过response指定响应结果,例如响应json数据如下:

response.getWriter().print("{\"abc\":123}");

代码:

/**
 * 返回void测试
 *
 * @param request
 * @param response
 * @throws Exception
 */
@RequestMapping("queryItem")
public void queryItem(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 1 使用request进行转发
    // request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,
    // response);

    // 2 使用response进行重定向到编辑页面
    // response.sendRedirect("/springmvc-web2/itemEdit.action");

    // 3 使用response直接显示
    response.getWriter().print("{\"abc\":123}");
}

【注意】:改映射@RequestMapping、改方法名、改方法形参、改返回值都需要重启程序,其他不需要重启。

3.返回字符串(官方推荐此种方式) --返回视图路径,数据通过形参 Model model 或者 ModelMap model

(1)逻辑视图名

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp
return "itemList";

示例代码:

/**
 * 根据id查询商品,绑定简单数据类型
 *
 * @param id
 * @param model
 * @return
 */
@RequestMapping("/itemEdit.action")
public String queryItemById(Integer id, ModelMap model) { //不要用int,万一传进来一个long
    // 根据id查询商品数据
    Items item = this.itemService.selectItemsById(id);

    // 把商品数据放在模型中
    model.addAttribute("item", item);

    return "editItem";
}

(2)Redirect重定向

Contrller方法返回字符串可以重定向到一个url地址。

如下商品修改提交后重定向到商品编辑页面。

/**
  * 更新商品
  *
  * @param item
  * @return
  */
 @RequestMapping("updateItem")
 public String updateItemById(Items item) {
     // 更新商品
     this.itemService.updateItemById(item);

     // 修改商品成功后,重定向到商品编辑页面
     // 重定向后浏览器地址栏变更为重定向的地址,
     // 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
     // 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数
     return "redirect:/itemEdit.action?itemId=" + item.getId();
 }

(3)forward转发

Controller方法执行后继续执行另一个Controller方法

如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。

/**
 * 更新商品
 *
 * @param item
 * @return
 */
@RequestMapping("updateItem")
public String updateItemById2(Items item) {
    // 更新商品
    this.itemService.updateItemById(item);

    // 修改商品成功后,重定向到商品编辑页面
    // 重定向后浏览器地址栏变更为重定向的地址,
    // 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
    // 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数
    // return "redirect:/itemEdit.action?itemId=" + item.getId();

    // 修改商品成功后,继续执行另一个方法
    // 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,
    // 转发并没有执行新的request和response,所以之前的请求参数都存在
    return "forward:/itemEdit.action";
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。 

(0)

相关推荐

  • SpringMVC中RequestMapping注解(作用、出现的位置、属性)

    RequestMapping注解 作用出现位置属性 作用 用于建立请求 URL 和处理请求方法之间的对应关系. 出现位置 1.作用在类上:请求 URL 的第一级访问目录.此处不写的话,就相当于应用的根目录.写的话需要以/开头. 2.作用在方法上:请求 URL 的第二级访问目录. 控制器中部分代码示例: @Controller @RequestMapping(path = "/user") //第一级的访问目录 public class HelloController { @Reques

  • Spring MVC之@RequestMapping注解详解

    引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessage

  • SpringMVC @RequestMapping注解详解

    目录 一.@RequestMapping 1.@RequestMapping注解的功能 2.@RequestMapping注解的位置 二.@RequestMapping注解的属性 1.value属性(掌握) 2.method属性(掌握) 3.params属性(了解) 4.headers属性(了解) 5.SpringMVC支持ant风格的路径 6.SpringMVC支持路径中的占位符(重点) 三.@RequestMapping的派生类注解 测试form表单是否支持put或delete方式的请求 一

  • Spring MVC中@Controller和@RequestMapping注解使用

    目录 @Controller和@RequestMapping注解使用 RequestMapping注解类型 通过@RequestParam接收请求参数 SpringMVC应用@Autowired和@Service进行依赖注入 通过org.springframework.web.bind.annotation.ModelAttribute 拦截器的配置 @RequestMapping和Controller方法返回值 @RequestMapping Controller方法返回值 @Controll

  • spring mvc中的@ModelAttribute注解示例介绍

    前言 本文介绍在spring mvc中非常重要的注解@ModelAttribute.这个注解可以用在方法参数上,或是方法声明上.这个注解的主要作用是绑定request或是form参数到模型对象.可以使用保存在request或session中的对象来组装模型对象.注意,被@ModelAttribute注解的方法会在controller方法(@RequestMapping注解的)之前执行.因为模型对象要先于controller方法之前创建. 请看下面的例子 ModelAttributeExample

  • spring mvc中注解@ModelAttribute的妙用分享

    前言 本文主要给大家介绍了关于spring mvc注解@ModelAttribute妙用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 在Spring mvc中,注解@ModelAttribute是一个非常常用的注解,其功能主要在两方面: 运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用: 运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值

  • Spring Mvc中传递参数方法之url/requestMapping详解

    前言 相信大家在使用spring的项目中,前台传递参数到后台是经常遇到的事, 我们必须熟练掌握一些常用的参数传递方式和注解的使用,本文将给大家介绍关于Spring Mvc中传递参数方法之url/requestMapping的相关内容,分享出来供大家参考学习,话不多说,直接上正文. 方法如下 1. @requestMapping: 类级别和方法级别的注解, 指明前后台解析的路径. 有value属性(一个参数时默认)指定url路径解析,method属性指定提交方式(默认为get提交) @Reques

  • Spring MVC中使用Controller如何进行重定向

    目录 Controller如何进行重定向 本人知道的有两种方式 注意 具体看demo理解这两种方式的实现 controller请求转发,重定向 了解 转发forward 重定向redirect Controller如何进行重定向 Spring MVC中进行重定向 本人知道的有两种方式 方法返回的URI(相对路径)中加上"redirect:"前缀,声明要重定向到该地址 使用HttpServletResponse对象进行重定向 注意 "redirect:"后面跟着的是&

  • 详解获取Spring MVC中所有RequestMapping以及对应方法和参数

    在Spring MVC中想要对每一个URL进行权限控制,不想手工整理这样会有遗漏,所以就动手写程序了.代码如下: /** * @return * @author Elwin ZHANG * 创建时间:2017年3月8日 上午11:48:22 * 功能:返回系统中的所有控制器映射路径,以及对应的方法 */ @RequestMapping(value = "/maps", produces = "application/json; charset=utf-8") @Re

  • Spring MVC中的Controller进行单元测试的实现

    目录 导入静态工具方法 初始化MockMvc 执行测试 测试GET接口 测试POST接口 测试文件上传 定义预期结果 写在最后 对Controller进行单元测试是Spring框架原生就支持的能力,它可以模拟HTTP客户端发起对服务地址的请求,可以不用借助于诸如Postman这样的外部工具就能完成对接口的测试.具体来讲,是由Spring框架中的spring-test模块提供的实现,详见MockMvc. 如下将详细阐述如何使用MockMvc测试框架实现对“Spring Controller”进行单

  • 基于spring mvc请求controller访问方式

    目录 spring mvc请求controller访问 1.一个Controller里含有不同的请求url 2.采用一个url访问 3.RequestMapping在Class上 4.在SpringMVC中常用的注解 springmvc请求一次,访问多个controller方法 举例 结论 spring mvc请求controller访问 1.一个Controller里含有不同的请求url @Controller //类似Struts的Action public class TestContro

  • spring mvc中的@PathVariable动态参数详解

    目录 spring mvc @PathVariable动态参数 spring mvc是如何做到根据参数名动态绑定参数的? 反射获取参数名 -parameters参数 -g参数 ASM SpringMVC的处理方式 总结 spring mvc @PathVariable动态参数 spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便 @Controller public class TestController { @RequestMapping(value

  • 详解Http请求中Content-Type讲解以及在Spring MVC中的应用

    详解Http请求中Content-Type讲解以及在Spring MVC中的应用 引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值,以及在spring MVC中如何使用它们来映射请求信息. 1.  Content-Type MediaType,即是Internet Media Type,互联网媒体类型:也叫做MIME类型,在Http协议消息头中,

随机推荐