Controller与RestFul

1. Controller

1. 控制器Controller

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

2. 利用接口定义控制器

1. 实现Controller接口

在类中重写ModelAndView方法实现功能

package com.wang.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接口的类, 说明这就是一个控制器了
public class ControllerTest1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView(); //设置视图的属性
mv.addObject("msg", "ControllerTest1");
//设置跳转的页面
mv.setViewName("test"); return mv;
}
}

2. 在spring配置文件中注册请求的bean

其中, name对应请求的路径, class对应处理请求的类

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.wang.controller"/> <mvc:default-servlet-handler/> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean> <bean name="/t1" class="com.wang.controller.ControllerTest1"/> </beans>

3. 编写前端jsp

<%--
Created by IntelliJ IDEA.
User: Wang
Date: 2020/9/8
Time: 14:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ControllerTest</title>
</head>
<body> <h1>${msg}</h1> </body>
</html>

4. 注意

  • 实现Controller接口是一个较老的办法, 最好不要使用它!

  • 要在web.xml中配置DispatcherServlet

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0"> <!--配置DispatcherServlet-->
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet> <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping> </web-app>
  • 缺点: 一个控制器中只能写一个方法!

3. 利用注解实现控制器

1. 在spring配置文件中声明组件扫描

<context:component-scan base-package="com.wang.controller"/>

2. 在Spring配置文件中配置三大件与静态资源过滤

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.wang.controller"/> <mvc:default-servlet-handler/> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean> </beans>

3. 在类中利用注解实现

两个关键注解

  • @Controller

    • 代表这个类会被Spring接管, 这个注解的类中的所有方法, 如果返回值是String, 并且有具体的页面可以跳转, 那么就会被视图解析器解析!
  • @RequestMapping("/...")
package com.wang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; //代表这个类会被Spring接管, 这个注解的类中的所有方法, 如果返回值是String, 并且有具体的页面可以跳转, 那么就会被视图解析器解析!
@Controller
public class ControllerTest2 { //映射访问路径
@RequestMapping("/t2")
public String test1 (Model model) { model.addAttribute("msg", "ControllerTest2"); //此处的返回的字符串与要跳转的页面名一致!
return "test";
} }

4. 注意

可以使两个请求指向同一个视图, 但是返回不同的页面结果, 从而实现视图的复用, 控制器与视图之间是弱耦合关系

package com.wang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; //代表这个类会被Spring接管, 这个注解的类中的所有方法, 如果返回值是String, 并且有具体的页面可以跳转, 那么就会被视图解析器解析!
@Controller
public class ControllerTest2 { //映射访问路径
@RequestMapping("/t2")
public String test2 (Model model) { model.addAttribute("msg", "ControllerTest2"); //此处的返回的字符串与要跳转的页面名一致!
return "test";
} //映射访问路径
@RequestMapping("/t3")
public String test3 (Model model) { model.addAttribute("msg", "ControllerTest3"); //此处的返回的字符串与要跳转的页面名一致!
return "test";
} }

4. RequestMapping

ResquestMapping可以加在类或者方法上(源码中的@Target)

同时注解了类和方法, 则存在父子关系

package com.wang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
@RequestMapping("/c3")
public class ControllerTest3 { //此时要访问/c3/t1才能访问到下面写的资源
@RequestMapping("/t1")
public String test3(Model model) {
model.addAttribute("msg", "ControllerMapping");
return "test";
}
}

2. RestFul风格

1. 原来的url风格

url: http://localhost:8080/add?a=1&b=2

package com.wang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class RestFulController { //原来的
//http://localhost:8080/add?a=1&b=2
//由于此处要求有两个参数, url必须传参, 否则报500错误
@RequestMapping("/add")
public String test(int a, int b, Model model) {
int res = a + b;
model.addAttribute("msg", "结果为" + res);
return "test";
} }

2. RestFul风格

1. 简单的RestFul

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

url: http://localhost:8080/add/1/2

package com.wang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class RestFulController { //使用RestFul风格, 变量用 / 分隔
//此时的url: http://localhost:8080/add/1/2
@RequestMapping("/add/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model) {
int res = a + b;
model.addAttribute("msg", "结果为" + res);
return "test";
} }

2. 使用method属性指定请求类型

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

package com.wang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; @Controller
public class RestFulController { /*
此注解与下面的注解等价, 都是以get方法去提交
@RequestMapping(value = "/add/{a}/{b}", method = RequestMethod.GET)
*/
@GetMapping("/add/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model) {
int res = a + b;
model.addAttribute("msg", "结果为" + res);
return "test";
} }

3. 总结

pring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。

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

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

@GetMapping 是一个组合注解,平时使用的会比较多!

它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。

RestFul的特点:

  • 简洁(用 / 分隔)
  • 高效(支持缓存)
  • 安全(无法看到传递的参数名)

SpringMVC-Controller&RestFul的更多相关文章

  1. [转]SpringMVC Controller介绍及常用注解

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  2. SpringMVC Controller介绍

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  3. SpringMVC Controller 介绍

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  4. SpringMVC Controller介绍(转)

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  5. SpringMVC Controller详解

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  6. SpringMVC Controller介绍及常见注解

    一.简介 在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model,然后再把该Model返 ...

  7. 【转】SpringMVC Controller 介绍

    转自:原文url 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  8. SpringMVC实现RESTful服务

    SpringMVC实现RESTful服务 这里只说service,controller层的代码.Mapper层则直接继承Mapper<T>则可以,记住mybatis-config.xml一 ...

  9. SpringMVC Controller 介绍及常用注解

    摘要: @Controller.@RequestMapping(属性:value.params .method.headers).@PathVariable.@RequestParam.@Cookie ...

  10. 基于springMVC的RESTful服务实现

    一,什么是RESTful RESTful(RESTful Web Services)一种架构风格,表述性状态转移,它不是一个软件,也不是一个标准,而是一种思想,不依赖于任何通信协议,但是开发时要成功映 ...

随机推荐

  1. C#开发笔记之02-什么时候使用OnXXX方法,这种命名是什么意思?

    C#开发笔记概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/958 访问. 你也许经常会看到别人写的代码里有OnXX ...

  2. C#LeetCode刷题之#686-重复叠加字符串匹配(Repeated String Match)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3963 访问. 给定两个字符串 A 和 B, 寻找重复叠加字符串A ...

  3. 【译】GitHub 为什么挂?官方的可行性报告为你解答

    本文翻译自 GitHub 官方博客<Introducing the GitHub Availability Report> 原文链接:https://github.blog/2020-07 ...

  4. Solon详解(一)- 快速入门

    一.Solon 最近号称小而美的的Solon框架,终于得空,搞了一把,发觉Solon确实好用,那Solon到底是什么,又是怎么好用呢? 什么是Solon? Solon参考过Spring boot 和 ...

  5. 【Hyeri】上传本地代码到Github

    个人摸索出的上传本地代码到Github的办法 首先配置SSH Key(首次需要配置) 1.设置本地ssh key,打开git bash,输入命令: ssh -keygen -t rsa -C &quo ...

  6. Windows Server2008RFTP隔离账户的搭建

    Step1:添加用户 打开DOS命令, net user net user u1 123.com /add net user u2 123.com /add Step2:创建文件夹 Step3:修改用 ...

  7. Python日期时间(详细)

    获取当前时间戳 import time t = time.time() millis1 = int(t) print('10位时间戳:{}'.format(millis1)) millis2 = in ...

  8. Linux系统添加应用服务进程的守护进程

    以前曾在Linux上维护应用服务,但是只是简单的迭代版本等工作,没有什么技术含量.最近部署在Linux服务器上的一个平台的总线进程broker(下面总线用broker指代)经常挂掉,由于总线负责服务之 ...

  9. vmd与ovito的对比

    1.minimize后,lammps生成的data文件 2.pdb:

  10. NET Core Kestrel部署HTTPS 一个服务器绑一个证书 一个服务器绑多个证书

    .net core 3.0 网站发布到centos后,绑定ssl证书,一个服务器绑一个证书,一个服务器绑多个证书 开始之前:对于windows服务器不存在这个问题,在iis中绑定证书是非常简单的一件事 ...