Spring MVC中控制器用于解析用户请求并且转换为模型以提供访问应用程序的行为,通常用注解方式实现.

org.springframework.stereotype.Controller注解用于声明Spring类的实例为一个控制器, 可以通过在配置文件中声明扫描路径,找到应用程序中所有基于注解的控制器类:

<!-- 自动扫描包路径,实现支持注解的IOC -->
<context:component-scan base-package="cn.luan.controller" />

一个简单的控制器:

@Controller
public class BarController {
//映射访问路径
@RequestMapping("/index")
public String index(Model model){
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("message", "这是通过注解定义的一个控制器中的Action");
//返回视图位置
return "foo/index";
}
}

@RequestMapping注解用于映射url到控制器类或方法,该注解共有8个属性:

public @interface RequestMapping {
java.lang.String name() default ""; @org.springframework.core.annotation.AliasFor("path")
java.lang.String[] value() default {}; @org.springframework.core.annotation.AliasFor("value")
java.lang.String[] path() default {}; org.springframework.web.bind.annotation.RequestMethod[] method() default {}; java.lang.String[] params() default {}; java.lang.String[] headers() default {}; java.lang.String[] consumes() default {}; java.lang.String[] produces() default {};
}

value和path属性功能相同, 用来指定映射路径或URL模板,数组类型故可以写成@RequestMapping(value={"/path1","/path2"})。

name属性指定映射器名称,一般情况下不指定

method属性指定请求方式,可以为GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE,用来过滤请求范围,不符合的请求将返回405错误,即Method Not Allowed

params属性指定映射参数规则

consumes属性指定请求的内容类型,如application/json, text/html

produces属性指定返回的内容类型,如application/json; charset=UTF-8

headers属性指定映射请求头部,如Host,Content-Type等

一个例子:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
private final AppointmentBook appointmentBook; @Autowired
public AppointmentsController(AppointmentBook appointmentBook) {
this.appointmentBook = appointmentBook;
} @RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
} @RequestMapping(value = "/{day}", method = RequestMethod.GET)
public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso = ISO.DATE) Date day, Model model) {
return appointmentBook.getAppointmentsForDay(day);
} @RequestMapping(value = "/new", method = RequestMethod.GET)
public AppointmentForm getNewForm() {
return new AppointmentForm();
} @RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm appointment, BindingResult result) {
if (result.hasErrors()) {
return "appointments/new";
}
appointmentBook.addAppointment(appointment);
return "redirect:/appointments";
}
}

@RequestMapping只注解方法:

@Controller
public class myController {
@RequestMapping("/act")
public String act(){
return "jsp/index";
}
}

访问路径:http://localhost:8080/springmvctest/act

@RequestMapping同时注解类和方法,访问路径为类上的value组合函数上的value:

@Controller
@RequestMapping("/my")
public class MyController {
@RequestMapping("/act")
public String act(){
return "jsp/index";
}
}

访问路径:http://localhost:8080/springmvctest/my/act

@RequestMapping中value属性默认为空,当只写@RequestMapping时, 表示该类或方法为默认控制器,默认方法:

@Controller
@RequestMapping
//默认控制器
public class myController {
@RequestMapping
//默认action
public String action(Model model){
model.addAttribute("message", "action2");
return "jsp/index";
}
}

访问路径为:http://localhost:8080/springmvctest/

可以使用@PathVariable注释将方法参数的值绑定到一个URL模板变量:

@RequestMapping("/action/{p1}/{p2}")
public String action(@PathVariable int p1,@PathVariable int p2,Model model){
model.addAttribute("message", p1+" "+p2);
return "jsp/index"; }

访问路径:http://localhost:8080/springmvctest/action/1/2, 参数的类型必须符合,否则404错误

@RequestMapping支持正则表达式:

@RequestMapping(value="/action/{id:\\d{4}}-{name:[a-z]{4}}")
public String action(@PathVariable int id,@PathVariable String name,Model model){
model.addAttribute("message", "id:"+id+" name:"+name);
return "jsp/index";
}

访问路径:http://localhost:8080/springmvctest/action/1234-abcd

也支持通配符:

@RequestMapping(value = "/action/*.do")
public String action(Model model){
model.addAttribute("message","123");
return "jsp/index";
}

访问路径:http://localhost:8080/springmvctest/action/test234-rrt.do

过滤提交的内容类型

@Controller
@RequestMapping("/my")
public class MyController {
// 请求内容类型必须为text/html,浏览器默认没有指定Content-type
@RequestMapping(value = "/action",consumes="text/html")
public String action(Model model) {
model.addAttribute("message", "请求的提交内容类型是text/html");
return "jsp/index";
}
}

指定返回的内容类型

@RequestMapping(value = "/action",produces="application/json; charset=UTF-8")
public String action(Model model) {
model.addAttribute("message", "application/json; charset=UTF-8");
return "jsp/index";
}

过滤映射请求的参数,限制客户端发送到服务器的请求参数为某些特定值或不为某些值:

    @RequestMapping(value = "/action",params={"id!=0","name=root"})
public String action(Model model) {
model.addAttribute("message", "");
return "jsp/index";
}

访问路径:http://localhost:8080/springdemo/show/action?id=10&name=root

过滤映射请求头部,约束客户端发送的请求头部信息中必须包含某个特定的值或不包含某个值,作用范围大于consumes 和 produces

    @RequestMapping(value = "/action",headers={"Host=localhost:8088",Content-Type="application/*"})
public String action(Model model) {
model.addAttribute("message", "");
return "jsp/index";
}

end

Spring MVC控制器的更多相关文章

  1. Spring入门(十四):Spring MVC控制器的2种测试方法

    作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...

  2. spring mvc 控制器方法传递一些经验对象的数组

    由于该项目必须提交一个表单,其中多个对象,更好的方法是直接通过在控制器方法参数的数组. 因为Spring mvc框架在反射生成控制方法的參数对象的时候会调用这个类的getDeclaredConstru ...

  3. Spring MVC:控制器类名称处理映射

    控制器类名称处理映射的好好处是: 如果项目是hello,WelcomeController是控制器,那么访问地址是: http://localhost:8080/hello/welcome http: ...

  4. Spring MVC控制器方法参数类型

    HttpServletRequest Spring会自动将 Servlet API 作为参数传过来 HttpServletResponse InputStream 相当于request.getInpu ...

  5. Spring MVC控制器用@ResponseBody声明返回json数据报406的问题

    本打算今天早点下班,结果下午测试调试程序发现一个问题纠结到晚上才解决,现在写一篇博客来总结下. 是这样的,本人在Spring mvc控制层用到了@ResponseBody标注,以便返回的数据为json ...

  6. 转转转!!Spring MVC控制器用@ResponseBody声明返回json数据报406的问题

    本打算今天早点下班,结果下午测试调试程序发现一个问题纠结到晚上才解决,现在写一篇博客来总结下. 是这样的,本人在Spring mvc控制层用到了@ResponseBody标注,以便返回的数据为json ...

  7. Spring MVC控制器类名称处理映射

    以下示例显示如何使用Spring Web MVC框架使用控制器类名称处理程序映射. ControllerClassNameHandlerMapping类是基于约定的处理程序映射类,它将URL请求映射到 ...

  8. 关于一些Spring MVC控制器的参数注解总结

    昨天同事问我控制器参数的注解的问题,我好久没那样写过,把参数和url一起设置,不过,今天我看了一些文章,查了一些资料,我尽可能的用我自己的理解方式来解释它吧! 1.@RequestParam绑定单个请 ...

  9. Spring MVC(五)--控制器通过注解@RequestParam接受参数

    上一篇中提到,当前后端命名规则不一致时,需要通过注解@RequestParam接受参数,这个注解是作用在参数上.下面通过实例说明,场景如下: 在页面输入两个参数,控制器通过注解接受,并将接受到的数据渲 ...

随机推荐

  1. Android APP压力测试-Monkey

    压力测试-Monkey学习 Monkey测试特点 什么是Monkey test? 如其名,像猴子一样,虽然什么都不懂,但是可以乱点一通,可以理解为压力测试.在规定的时间或次数范围内做任何随机的操作,随 ...

  2. Net中httpResponse和httpRequest的简单实用;

    这对象很简单,封装很多常用的方法和属性:使用起来也很方便: 这个关键是要对我们的 http中的各种协议要很了解滴呀: 模拟一个简单的暴力破解: public static class HttpInfo ...

  3. php构造方法与析构方法

    1. 构造方法 <?php //构造方法 __construct() 是在实例化对象时被自动调用 //用途:可以用于初始化程序(可以给成员属性赋值,也可以调用成员方法) //语法:[修饰符] f ...

  4. C语言:使用命令行参数用字符串读取流和输出流进行文本文件的复制

    #include<stdio.h> int main(int argc,char *argv[]) { //检查用户的参数是否正确 if(argc<3) { printf(" ...

  5. PorterDuffXfermode的用法

    1.下面的Xfermode子类可以改变这种行为: AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图). PixelXorXfermode  当覆盖 ...

  6. win10快速开机

    百度经验:jingyan.baidu.com 在win8系统出现以后的win系统中,都有一个特点,那就是快速启动,可是,相信大家都有这样一个问题,就是,自己明明用的是win8(或者win10)系统,可 ...

  7. Webform Application、ViewState

    Application(全局对象) Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动 ...

  8. Oracle分页查询

    1.无ORDER BY排序的写法.(效率最高) 经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然! sql语句如下: SELECT * FROM (Sel ...

  9. zTree Jquery eCharts

    (function(){ var setting = { view:{ dblClickExpand:false, expandSpeed:300 }, data: { simpleData: { e ...

  10. Linux中可用于管道操作的命令总结

    在Linux中药进行稍复杂的操作,通常需要借助管道命令"|"多个命令的组合,形式如下: command 1 |  command 2 |  command 3 -- 在linux中 ...