SpringMVC框架——集成RESTful架构
REST:Representational State Transfer 资源表现层状态转换
Resources 资源
Representation 资源表现层
State Transfer 状态转换
RESTful的特点:
- URL传参更加简洁
传统的URL:http://localhost:7777/test?id=1
RESTful:http://localhost:7777/test/1
- 完成不同终端之间的资源共享,RESTful提供了一套规范,不同终端之间只需要遵守该规范,就可以实现数据的交互。
RESTful具体来讲就是4种表现形式,HTTP协议中的四种请求类型(GET、POST、PUT、DELETE)分别对应四种常规操作,CRUD。
GET 用来获取资源
POST 用来创建资源
PUT 用来修改资源
DELETE用来删除资源
- 由于form表单不支持PUT、DELETE请求,需要想办法支持。SpringMVC通过添加过滤器的方式来完成这种处理的。
实现原理:
检测请求参数中是否包含 _method 参数,如果包含则获取该参数的值,判断是哪种操作后完成请求类型的转换,然后继续传递。
示例一:
1、在 form 表单中添加隐藏域标签, name="_method", value="PUT"/"DELETE"。
2、在web.xml文件中配置HiddenHttpMethodFilter
<!-- put/delete请求转换 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3、编写Controller
package com.sunjian.controller; import com.sunjian.entity.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; /** * @author sunjian * @date 2020/3/19 8:13 */ @Controller @RequestMapping("/rest") public class RESTController { @RequestMapping("/get/{id}") @ResponseBody public String get(@PathVariable("id") int num){ System.out.println("GET"); if(num < 100){ return "OK"; }else return "没有这个编号的数据"; } @RequestMapping(value = "/post", method = RequestMethod.POST) public ModelAndView post(){ User user = new User(); user.setId(123); user.setName("post"); user.setAge(55); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("user", user); modelAndView.setViewName("show"); return modelAndView; } @RequestMapping(value = "/put", method = RequestMethod.PUT) @ResponseBody // 返回json格式 public String put(){ System.out.println("put"); return "put"; } @RequestMapping(value = "/delete", method = RequestMethod.DELETE) @ResponseBody public String delete(){ System.out.println("delete"); return "delete"; } }
4、编写JSP页面
rest.jsp
<%@page contentType="text/html; charset=UTF-8" language="java" %> <%@page isELIgnored="false" %> <!-- 是否忽略解析el表达式 --> <html> <body> <form action="/rest/put" method="POST"> <input type="hidden" name="_method" value="PUT"> <input type="submit" value="PUT"> </form> <hr> <form action="/rest/delete" method="POST"> <input type="hidden" name="_method" value="DELETE"> <input type="submit" value="DELETE"> </form> <hr> <form action="/rest/get/1" method="GET"> <input type="submit" value="GET"> </form> <hr> <form action="/rest/post" method="POST"> <input type="submit" value="POST"> </form> </body> </html>
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> ${user} </body> </html>
5、访问jsp页面,提交请求
示例二:
实现课程表的增删改查。
1、实体类
package com.sunjian.entity; /** * @author sunjian * @date 2020/3/20 14:28 */ public class Course { private Integer id; private String name; private Double price; public Course(Integer id, String name, Double price) { this.id = id; this.name = name; this.price = price; } @Override public String toString() { return "Course{" + "id=" + id + ", name='" + name + '\'' + ", price=" + price + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } }
2、编写repository
package com.sunjian.repository; import com.sunjian.entity.Course; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * @author sunjian * @date 2020/3/20 14:29 */ @Repository public class CourseRepository { private static Map<Integer, Course> map; static { map = new HashMap<>(); map.put(1, new Course(1, "java", 2000d)); map.put(2, new Course(2, "python", 3000d)); map.put(3, new Course(3, "c++", 4000d)); } public void saveOrUpdate(Course course){ map.put(course.getId(), course); } public Collection<Course> findAll(){ return map.values(); } public Course findId(Integer id){ return map.get(id); } public void deleteById(Integer id){ map.remove(id); } }
3、编写controller
package com.sunjian.controller; import com.sunjian.entity.Course; import com.sunjian.repository.CourseRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; /** * @author sunjian * @date 2020/3/20 14:34 */ @Controller @RequestMapping("/course") public class CourseController { @Autowired private CourseRepository courseRepository; @PostMapping("/add") public String add(Course course){ courseRepository.saveOrUpdate(course); return "redirect:/course/findAll"; } @DeleteMapping("/deleteById/{id}") public String deleteById(@PathVariable("id") Integer id){ courseRepository.deleteById(id); return "redirect:/course/findAll"; } @PutMapping("/update") public String update(Course course){ courseRepository.saveOrUpdate(course); return "redirect:/course/findAll"; } @GetMapping("/findAll") public ModelAndView findAll(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("showCourse"); modelAndView.addObject("list", courseRepository.findAll()); return modelAndView; } @GetMapping("/findById/{id}") public ModelAndView findById(@PathVariable("id") Integer id){ ModelAndView modelAndView = new ModelAndView("updateCourse"); modelAndView.addObject("course", courseRepository.findId(id)); return modelAndView; } }
4、配置web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--中文乱码处理--> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- put/delete请求转换 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--映射--> <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.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- js --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <!-- jpg --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> </web-app>
5、配置springmvc.xml
<?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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 配置自动扫描 --> <context:component-scan base-package="com.sunjian"></context:component-scan> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- 消息转换器 --> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 自定义数据类型转换器 --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.sunjian.converter.DataConverter"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg> </bean> <bean class="com.sunjian.converter.goodsConverter"></bean> </list> </property> </bean> <!--文件上传--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 处理文件名中文乱码 --> <property name="defaultEncoding" value="utf-8"></property> <!-- 多文件上传总⼤小的上限 10M --> <property name="maxUploadSize" value="10485760"></property> <!-- 单文件大小的上限 1M --> <property name="maxUploadSizePerFile" value="1048576"></property> </bean> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> </beans>
6、编写jsp页面
showCourse.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <table> <tr> <th>课程ID</th> <th>课程名称</th> <th>课程价格</th> <th>操作</th> </tr> <c:forEach items="${list}" var="course"> <tr> <td>${course.id}</td> <td>${course.name}</td> <td>${course.price}</td> <td> <form action="/course/deleteById/${course.id}" method="post"> <input type="hidden" name="_method" value="DELETE"/> <input type="submit" value="删除"/> </form> <a href="/course/findById/${course.id}">修改</a> </td> </tr> </c:forEach> </table> <a href="/addCourse.jsp">添加课程</a> </body> </html>
addCourse.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <form action="/course/add" method="post"> 课程编号:<input type="text" name="id"/><br/> 课程名称:<input type="text" name="name"/><br/> 课程价格:<input type="text" name="price"/><br/> <input type="submit" value="添加"/> </form> </body> </html>
updateCourse.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <form action="/course/update" method="post"> 课程编号:<input type="text" value="${course.id}" name="id" readonly/><br/> 课程名称:<input type="text" value="${course.name}" name="name"/><br/> 课程价格:<input type="text" value="${course.price}" name="price"/><br/> <input type="hidden" name="_method" value="PUT"/> <input type="submit" value="修改"/> </form> </body> </html>
7、访问页面操作
OK.
SpringMVC框架——集成RESTful架构的更多相关文章
- 8.springMVC中的RESTful架构风格
RESTful架构:是一种设计的风格,并不是标准,只是提供了一组设计原则和约束条件,也是目前比较流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. 关于 ...
- springMVC 中的restful 架构风格
RESTful架构 : 是一种设计的风格,并不是标准,只是提供了一组设计原则和约束条件,也是目前比较流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. ...
- springMVC框架集成tiles模板
将tiles模板集成到springMVC框架下,大概流程如下: 1.在配置文件中加入tiles支持 我的servlet配置文件名为spring-mvc.xml.具体配置如下: <?xml ver ...
- SpringMVC框架04——RESTful入门
1.RESTful的基本概念 REST(Representational State Transfer)表述性状态转移,REST并不是一种创新技术,它指的是一组架构约束条件和原则,符合REST的约束条 ...
- springMvc框架之Restful风格
method: @Controller @RequestMapping("/test") public String MyController{ @RequestMapping(& ...
- RabittMQ实践(二): RabbitMQ 与spring、springmvc框架集成
一.RabbitMQ简介 1.1.rabbitMQ的优点(适用范围)1. 基于erlang语言开发具有高可用高并发的优点,适合集群服务器.2. 健壮.稳定.易用.跨平台.支持多种语言.文档齐全.3. ...
- Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
- Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
- Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试【转】
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
随机推荐
- 吴裕雄--天生自然 R语言开发学习:方差分析(续一)
#-------------------------------------------------------------------# # R in Action (2nd ed): Chapte ...
- cookie和session实现登录验证
回话技术,比如在做登录功能的时候,需要配合是用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能.在cookie中保存了用户的信息,特别是一个特殊的令牌信息,当用户拿着这个 ...
- 2016/11/10 吃吃喝喝Hacking Thursday Night聚餐活动 at Dunkin Donuts
店名:Dunkin Donuts 唐恩都乐 点评:http://www.dianping.com/shop/21378231 地址:静安区南京西路1649号静安公园内(近静安公园) 走法:地铁2号线静 ...
- Python——用turtle模块画海龟的第一步
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C语言职工信息管理系统
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- JavaScript逻辑分支switch 练习题
1.输入月份,显示当月的天数, 利用case穿透简化代码 var month = prompt("请输入月份"); var year = prompt("请输入年份&q ...
- 简单的员工管理系统(Mysql+jdbc+Servlet+JSP)
员工管理系统 因为学业要求,需要完成一个过关检测,但是因为检测之前没有做好准备,且想到之前用mysql+jdbc+Struts2+bootstrap做成了一个ATM系统(主要有对数据的增删改查操作), ...
- 《前端面试加分项目》系列 企业级Vue瀑布流
本文 GitHub github.com/ponkans/F2E 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习.文末有福利~~ 前言 接水怪又来 ...
- HTTP&ServletContext&Response对象_文件上传
今日内容 1. HTTP协议:响应消息 2. Response对象 3. ServletContext对象 HTTP协议 1. 请求消息:客户端发送给服务器端的数据 * 数据格式: 1. 请求行 2. ...
- Ubuntu gnome 美化与个别组件安装
1. 安装 gnome 工具 sudo apt install gnome-tweaks# 打开时中文直接选择 "优化" 即可 1.1. gnome 官网 # https://ex ...