SpringMVC请求映射:@Controller注解与@RequestMapping
注解的使⽤
在⽇常的基于SpringMVC框架开发中会经常使⽤<annotation-driven>标签,<annotation-driven>标签是⼀种简写模式,使⽤默认配置替代了⼀般的⼿动配置。<annotation-driven>标签会⾃动注册处理器映射器和处理器适配器,分别为RequestMappingHandlerMapping和RequestMappingHandlerAdapter。然后再配置<component-scan>标签,⽬的是为了让注解的处理器映射器和处理器适配器到注解的Handler,使⽤扫描配置,对某⼀个包下的所有类进⾏扫描,出所有使⽤@Controller注解的Handler控制器类。配置信息如下:
<!-- 开启SpringMVC注解模式(设置注解映射器、注解适配器) -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- ⽅式⼀:使⽤扫描配置,对某⼀个包下的所有类进⾏扫描,出所有使⽤@Controller注解的Handler控制器类 -->
<context:component-scan base-package="com.ller"></context:component-scan>
<!-- ⽅式⼆:使⽤声明相关bean信息 -->
<!--<bean class="com.ller.UserController"></bean>-->
1、@Controller注解
在配置了注解的处理器映射器和适配器的情况下,当使⽤@Controller注解去标识⼀个类时,其实就是告诉SpringMVC该类时⼀个Handler控制器类。在配置<component-scan>标签后,当Spring初始化Bean信息时,会扫描到所有标注了@Controller注解的类,并作为Handler来加载。
【⽰例】创建⽤户控制器类(UserController.java),使⽤@Controller注解标识该类为⼀个控制器类。
/**
* ⽤户控制器
* 使⽤@Controller注解来标识它是⼀个控制器
* @author pan_junbiao
**/
@Controller
public class UserController
{
}
2、@RequestMapping注解
2.1 @RequestMapping注解的使⽤
@RequestMapping注解的作⽤是为控制器指定可以处理哪些URL请求,该注解可以放置在类上或者⽅法上。当放置在类上,提供初步的URL请求映射信息,即⼀个前置请求路径(相对于Web应⽤的根⽬录)。当放置在⽅法上时,提供进⼀步的细分URL映射信息,相对于类定义处的URL。若类定义处未标注@RequestMapping注解,则⽅法处标记的URL相对于Web应⽤的根⽬录。
【⽰例】创建⽤户控制器类(UserController.java),使⽤@Controllerg注解标识该类为⼀个控制器类,使⽤@RequestMapping注解为类和⽅法指定URL映射名。
/**
* ⽤户控制器
* 使⽤@Controller注解来标识它是⼀个控制器
* 使⽤@RequestMapping注解为控制器类指定⼀个URL映射名
* @author pan_junbiao
**/
@Controller
@RequestMapping("/user")
public class UserController
{
/**
* 获取⽤户名称
* 使⽤@RequestMapping注解为⽅法指定⼀个URL映射名
*/
@RequestMapping("/getUserName")
public String getUserName()
{
return "pan_junbiao的博客";
}
}
2.2 @RequestMapping注解提供的属性
@RequestMapping注解提供了⼀些属性,可以⽤来限制请求⽅法、请求参数、请求头。
2.2.1 method属性
对于请求⽅法,@RequestMapping注解的method属性可以指定“GET” 或“POST”请求类型,表明该URL只能以某种请求⽅式请求才能获得相应:
@Controller
public class UserController
{
@RequestMapping(value = "/getUserName",method = RequestMethod.GET)
public String getUserName()
{
return "pan_junbiao的博客";
}
}
这⾥访问“/getUserName”请求时,只能接受GET请求。可以看到,指定“GET” 或“POST”请求类型需要由RequestMethod枚举类来表⽰,已达到⼀种规范。
2.2.2 params属性
对于请求参数,@RequestMapping注解的params属性可以指定某⼀种参数名类型,当请求数据中含有该名称的请求参数时,才能进⾏相应:
@Controller
public class UserController
{
@RequestMapping(value = "/getUserName",params = "username")
public String getUserName()
{
System.out.println("只接受包含username参数的请求");
return "pan_junbiao的博客";
}
}
该配置表⽰,当⼀个URL请求中不包含有名称为“username”的参数时,该⽅法就拒绝此次请求。
此外,Spring4.3之后引⼊了⼀系列@RequestMapping的变种。如下:
2.2.3 headers属性
对于请求头,@RequestMapping注解的headers属性可以指定某⼀种请求头类型,当请求数据头的类型符合指定值时,才能进⾏响应:
@Controller
public class UserController
{
@RequestMapping(value = "/getUserName",headers = "contentType:text/html;charset=UTF-8")
public String getUserName()
{
System.out.println("只接受请求头中contentType为:text/html;charset=UTF-8的请求");
return "pan_junbiao的博客";
}
}
springmvc的注解有哪些该配置表⽰,当⼀个请求头中的contentType为“text/html;charset=UTF-8”的参数时,该⽅法才会处理此次请求。
2.2.4 consumes属性
@RequestMapping注解的consumes属性表⽰处理请求的提交内容类型(Content-Type),例如“application/json,text/html”。
@Controller
public class UserController
{
@RequestMapping(value="/addUser",method=RequestMethod.POST,consumes="application/json")
public void addUser(UserModel userModel)
{
//忽略具体逻辑...
}
}
该配置表⽰⽅法仅处理request的Content-Type为“application/json”类型的请求。
2.2.5 produces属性
@RequestMapping注解的produces属性表⽰返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型时才返回。
@Controller
public class UserController
{
@RequestMapping(value="/getUser",method=RequestMethod.GET,produces="application/json")
@ResponseBody
public UserModel getUser(String userId)
{
//忽略具体逻辑...
}
}
该配置表⽰⽅法仅处理request请求中Accept头中包含“application/json”的请求,同时暗⽰了返回的内容类型
为“application/json”。
⼩贴⼠:指定consumes和produces可以规范请求的Content-Type内容类型。
【⽰例】通过设置@RequestMapping注解的produces属性,解决SpringMVC返回字符串中⽂乱码问题。
/**
* SpringMVC返回字符串结果,并解决中⽂乱码问题
*
* @author pan_junbiao
*/
@RequestMapping(value = "/getMessage", produces = {"text/html;charset=UTF-8;", "application/json;"})
@ResponseBody
public String getMessage()
{
return "您好,欢迎访问 pan_junbiao的博客";
}
3、综合实例
【实例】使⽤@Controller与@RequestMapping注解实现⽤户控制器类,模拟⽤户信息的增删改查操作,并显⽰⽤户信息。执⾏结果如下图:
(1)Controller控制器类:⽤户控制器(UserController.java)。
package com.ller;
import com.del.UserModel;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
/**
* ⽤户控制器
* 使⽤@Controller注解来标识它是⼀个控制器
* 使⽤@RequestMapping注解指定⼀个URL映射名
* @author pan_junbiao
**/
@Controller
@RequestMapping("/user")
public class UserController
{
/**
* 获取⽤户
* 使⽤@RequestMapping注解为⽅法指定⼀个URL映射名
*/
*/
@RequestMapping(value="/getUser",method=RequestMethod.GET)
public ModelAndView getUser()
{
//获取⽤户信息(模拟Service层的业务)
UserModel userModel = new UserModel();
userModel.setUserId(1);
userModel.setUserName("pan_junbiao的博客");
userModel.setBlogUrl("blog.csdn/pan_junbiao");
userModel.setRemark("您好,欢迎访问 pan_junbiao的博客");
//创建返回结果ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
/
/相当于request的setAttribut⽅法
modelAndView.addObject("userInfo",userModel);
//指定视图
modelAndView.setViewName("/userInfo");
return modelAndView;
}
/**
* 新增⽤户
*/
@RequestMapping(value="/addUser",method=RequestMethod.POST)
public void addUser(UserModel userModel)
{
//忽略具体逻辑...
}
/**
* 修改⽤户
*/
@RequestMapping(value="/updateUser",method=RequestMethod.POST) public void updateUser(UserModel userModel)
{
//忽略具体逻辑...
}
/**
* 删除⽤户
*/
@RequestMapping(value="/deleteUser",method=RequestMethod.POST) public void deleteUser(int userId)
{
//忽略具体逻辑...
}
}
(2)Model模型类:⽤户信息模型类(UserModel.java)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论