03-SpringMVC 控制器Controller和RestFul风格

四、控制器和RestFul

4.1、控制器 Controller

  • 控制器复杂提供访问应用程序的行为,通常通过接口定义或者注解定义两种方法实现
  • 控制器负责解析用户的请求并将其转换为一个模型
  • 在Spring MVC 中一个控制器类可以包含多个方法
  • 在Spring MVC 中,对于Controller的配置有很多中(实现接口,或者注解配置)

4.2、控制器的实现方式(两种)

4.4.1、实现Controller接口的方式
  • 实现接口Controller定义控制器是较老的办法
  • 缺点是:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦;
  • 开发中基本不使用,我们都是注解版

**(1)创建一个java类实现接口Controller,**Controller:全路径 org.springframework.web.servlet.mvc.Controller

该接口中只有一个方法(

public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { })需要我们去实现重写

注意:

只要实现了Controller 接口的类,说明这就是一个控制器了,在springMVC配置文件中配置这个控制器

package com.atdk.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 只要实现了Controller 接口的类,说明这就是一个控制器了
 * 缺点:一个Controller只能写一个方法,比较麻烦
 */
public class ControllerTest1 implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "Test1Controller");
        mv.setViewName("test");
        return mv;
    }
}

(2)编写完毕后,去Spring配置文件中注册请求的bean;name对应请求路径,class对应处理请求的类

注意:id值需要以/打头,方便 处理器映射器,适配器分析处理请求地址

<!--实现controller接口时我们需要配置一下-->
<bean id="/test" class="com.atdk.controller.ControllerTest1"></bean>

(3)编写前端test.jsp,注意在WEB-INF/jsp目录下编写,对应我们的视图解析器

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        ${msg}
    </body>
</html>

(4)配置Tomcat启动服务

4.4.2、关于实现Controller方式说明:
  • 实现接口Controller定义控制器是较老的办法
  • 缺点是:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦;
  • 开发中基本不使用,我们都是注解版
4.4.3、使用注解@Controller方式

这个我们在3.2注解版使用已经详细讲过,可以回看

SpringMVC注解版
注解方式是平时使用的最多的方式!

4.4.4、注解:@RequestMapping

@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。

可用于类或方法上。

用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

4.3、RestFul 风格

1、概念

RestFul就是一个资源定位及资源操作的风格。 不是标准也不是协议,只是一种风格基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。很多大厂都在使用此风格

2、功能

资源:互联网的所有事物都是可以被抽象为资源

资源操作:使用POST,GET,DELETE,PUT,使用不同的方法对资源进行操作

添加,查询,删除,修改

3、传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get

​ http://127.0.0.1/item/queryItem.action?id=1 查询,GET

​ http://127.0.0.1/item/saveItem.action 新增,POST

​ http://127.0.0.1/item/updateItem.action 更新,POST

​ http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST

4、使用RESTful操作资源 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

​ http://127.0.0.1/item/1 查询,GET

​ http://127.0.0.1/item 新增,POST

​ http://127.0.0.1/item 更新,PUT

​ http://127.0.0.1/item/1 删除,DELETE

5、学习测试
5.1、RestFul 风格 传递参数和获取参数

RestFul就是路径变量参数

上例子:

浏览器请求地址:http://127.0.0.1/comit/2/3(路径变量)
不在需要指定参数的名子直接写参数值而且当多个参数时不需要使用“&”了直接"/"分隔

@Controller
public class RestFulController {
   //映射访问路径
   @RequestMapping("/commit/{p1}/{p2}")
   public String index(@PathVariable int p1, @PathVariable int p2, Model model){
       int result = p1+p2;
       //Spring MVC会自动实例化一个Model对象用于向视图中传值
       model.addAttribute("msg", "结果:"+result);
       //返回视图位置
       return "test";    
  }
}

@RequestMapping("/commit/{p1}/{p2}") 因为我们使用了注解@PathVariable注解了 方法参数,需要把获取的参数和定义的方法参数对应起来,自动获取注入方法参数中。

{p1}表示把获取的对应请求地址对应位置上的参数值赋给方法参数p1,

{p2}同理

所以我们传递参数是,注意参数传递和获取的位置,对应起来

(@PathVariable int p1, @PathVariable int p2)表示让方法参数的值对应绑定到一个URI模板变量上。即获取到参数和此方法参数对应起来

5.2、注解:@PathVariable

(@PathVariable int p1, @PathVariable int p2)表示让方法参数的值对应绑定到一个URI模板变量上。即获取到参数和此方法参数对应起来

5.3、思考:使用路径变量的好处?
    • 使路径变得更加简洁;
    • 获得参数更加方便,框架会自动进行类型转换。
    • 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/commit/1/a,则路径与方法不匹配,而不会是参数转换失败
    • 只有参数类型对应上才可以访问到此方法(类型检查是很严格的)
5.4、@RequestMapping使用method属性指定请求类型(不常用)

用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

eg:只有post请求才可以访问此方法,一旦其他类型请求就会报错,无法请求

POST:

//映射访问路径,必须是POST请求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
public String index2(Model model){
   model.addAttribute("msg", "hello!");
   return "test";
}

GET:

//映射访问路径,必须是Get请求
@RequestMapping(value = "/hello",method = {RequestMethod.GET})
public String index2(Model model){
   model.addAttribute("msg", "hello!");
   return "test";
}
5.5、直接使用各自请求类型的注解(组合注解)指定请求类型(常用)

所有的地址栏请求默认都会是 HTTP GET 类型的。

方法级别的注解变体有如下几个:组合注解

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

修改@RequestMapping为,@GetMapping,@PostMapping,直接指定只有那种请求类型才可以访问此方法,简洁明了,使用方法和@RequestMapping一样,只是限制了请求方式,当我们发起请求,SpringMVC框架会自动的根据请求类型来访问不同的方法。

下面就请求地址一样,处理不同的请求方式的请求

/**
 * @GetMapping("/add/{a}/{b}") 表示只有GET请求才可以访问此方法
 * {a},{b},表示参数啊a,参数b
 * @PathVariable int a,表示把{a}值传递给a
 */
@GetMapping("/add/{a}/{b}")
public String test1(@PathVariable int a, @PathVariable int b, Model model) {
    model.addAttribute("msg", "GET请求:结果为" + (a + b));
    return "test";
}

/**
 *  @PostMapping("/add/{a}/{b}")
 *  {a},{b},表示参数a,参数b
 *  @PathVariable int a,表示把{a}值传递给a
 */
@PostMapping("/add/{a}/{b}")
public String test2(@PathVariable int a, @PathVariable int b,Model model) {
    model.addAttribute("msg", "GET请求:结果为" + (a + b));
    return "test";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值