控制器(Controller)、RestFul风格

导读:本篇文章讲解 控制器(Controller)、RestFul风格,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、控制器Controlle

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

实现Controller接口

Controller是一个接口,在org.springframework.web.servlet.mvc包下,接口中只有一个方法;

@FunctionalInterface
public interface Controller {
    @Nullable
    ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}


1、编写一个Controller类,ControllerTest1

1//只要实现类Controller接口的类,,说明这就是哟个控制器了
public class ControllerText1 implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "ControllerText01");
        mv.setViewName("test");

        return mv;
    }
}

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

<bean name="/t1" class="com.baidu.controller.ControllerText1"/>

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、测试:
在这里插入图片描述

注解实现Controller;

1、在controller包中创建ControllerTest2,用注解实现。

package com.baidu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
//代表这个类被Spring托管,被这个注解的类中的方法,如果返回值是String,并且有具体的页面跳转,那么就会被视图解析器解析;
public class ControllerTest2 {

    @RequestMapping("/t2")
    public String test1(Model model) {
        model.addAttribute("msg", "ControllerTest2");

        return "test";
    }

}

2、测试:
在这里插入图片描述

二、RestFul 风格

概念
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

功能
资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
分别对应 添加、 删除、修改、查询。

传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,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

使用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

1、再新建一个RestFulController ,在Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。

@Controller
public class RestFulController {    

    @RequestMapping(value = "/add/{a}/{b}")
    public String test1(@PathVariable int a,@PathVariable int b, Model model){
        int res = a + b;
        model.addAttribute("msg","结果为:"+ res);
        return "test";
    }

    
}

2、测试结果:
在这里插入图片描述
思考:使用路径变量的好处?

  • 使路径变得更加简介。
  • 获得参数更加方便,框架会自动进行类型转换。
  • 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/commit/1/a,则路径与方法不匹配,而不会是参数转换失败。

我们来修改下对应的参数类型,再次测试

@Controller
public class RestFulController {

    @RequestMapping(value = "/add/{a}/{b}")
    public String test1(@PathVariable int a,@PathVariable String b, Model model){
        String res = a + b;
        model.addAttribute("msg","结果为:"+ res);
        return "test";
    }

在这里插入图片描述

使用method属性指定请求类型
用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
我们来测试一下:

  • 增加一个方法;
//我们使用浏览器地址栏进行访问默认是Get请求,会报错405: 改回Get就好了
@RequestMapping(value = "add",method = RequestMethod.POST)
public String test2(Model model){
    model.addAttribute("msg","Hello!");
    return "test";
}

所有的地址栏请求默认都会是 HTTP GET 类型的。
方法级别的注解变体有如下几个:组合注解

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

@GetMapping 是一个组合注解,平时使用的会比较多!
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。

三、视图跳转

ModelAndView
设置ModelAndView对象,根据view的名称,和视图解析器跳到指定的页面。

页面: {视图解析器前缀} + viewName + {视图解析器后缀}

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      id="internalResourceViewResolver">
    <!-- 前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <!-- 后缀 -->
    <property name="suffix" value=".jsp" />
</bean>

对应的Controller

//只要实现类Controller接口的类,,说明这就是哟个控制器了
public class ControllerText1 implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","ControllerText01");
        mv.setViewName("test");

        return mv;
    }
}

ServletAPI
通过设置ServletAPI,不需要视图解析器﹒
1.通过HttpServletResponse进行输出
2.通过HttpServletResponse实现重定向
3.通过HttpServletResponse实现转发

SpringMvc
通过SpringMVC来实现转发和重定向–无需视图解析器;
在前面加上forward,请求,redirect,重定向

@Controller
public class ModelTest1 {

    @RequestMapping("/m1/t1")
    public String test1(Model model){

        //转发
        model.addAttribute("msg","ModeelTest1");

        return "forward:/WEB-INF/jsp/test.jsp";
    }

    @RequestMapping("/m1/t2")
    public String test2(Model model){

        //重定向
        model.addAttribute("msg","ModeelTest2");

        return "redirect:/index.jsp";
    }
}

测试前,需要将视图解析器注释掉
注释之后,想要访问到必须书写他的权限域名

return "/WEB-INF/jsp/test.jsp";

通过SpringMVC来实现转发和重定向–有视图解析器;
重定向,不需要视图解析器,本质就是重新请求一个新地方嘛,所以注意路径问题.
可以重定向到另外一个请求实现﹐

return "redirect:/index.jsp";

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71847.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!