业务型网站首页,企业文化标语,房产中介网站建设技巧,100款应用软件免费大全文章目录 1、RESTful简介a资源b资源的表述c状态转移 2、RESTful的实现HiddenHttpMethodFilterRESTful案例 1、RESTful简介
REST#xff1a;Representational State Transfer#xff0c;表现层资源状态转移。
a资源
资源是一种看待服务器的方式#xff0c… 文章目录 1、RESTful简介a资源b资源的表述c状态转移 2、RESTful的实现HiddenHttpMethodFilterRESTful案例 1、RESTful简介
RESTRepresentational State Transfer表现层资源状态转移。
a资源
资源是一种看待服务器的方式即将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西可以将资源设计的要多抽象有多抽象只要想象力允许而且客户端应用开发者能够理解。与面向对象设计类似资源是以名词为核心来组织的首先关注的是名词。一个资源可以由一个或多个URI来标识。URI既是资源的名称也是资源在Web上的地址。对某个资源感兴趣的客户端应用可以通过资源的URI与其进行交互。
b资源的表述
资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移交换。资源的表述可以有多种格式例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述格式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。
c状态转移
状态转移说的是在客户端和服务器端之间转移transfer代表资源状态的表述。通过转移和操作资源的表述来间接实现操作资源的目的。
2、RESTful的实现
具体说就是 HTTP 协议里面四个表示操作方式的动词GET、POST、PUT、DELETE。
它们分别对应四种基本操作GET 用来获取资源POST 用来新建资源PUT 用来更新资源DELETE 用来删除资源。
REST 风格提倡 URL 地址使用统一的风格设计从前到后各个单词使用斜杠分开不使用问号键值对方式携带请求参数而是将要发送给服务器的数据作为 URL 地址的一部分以保证整体风格的一致性。
操作传统方式REST风格查询操作getUserById?id1user/1–get请求方式保存操作saveUseruser–post请求方式删除操作deleteUser?id1user/1–delete请求方式更新操作updateUseruser–put请求方式
HiddenHttpMethodFilter
由于浏览器只支持发送get和post方式的请求那么该如何发送put和delete请求呢
SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求
HiddenHttpMethodFilter 处理put和delete请求的条件
a当前请求的请求方式必须为post
b当前请求必须传输请求参数_method
满足以上条件HiddenHttpMethodFilter 过滤器就会将当前请求的请求方式转换为请求参数_method的值因此请求参数_method的值才是最终的请求方式
在web.xml中注册HiddenHttpMethodFilter
filterfilter-nameHiddenHttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class
/filter
filter-mappingfilter-nameHiddenHttpMethodFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping注 目前为止SpringMVC中提供了两个过滤器CharacterEncodingFilter和HiddenHttpMethodFilter 在web.xml中注册时必须先注册CharacterEncodingFilter再注册HiddenHttpMethodFilter 原因 在 CharacterEncodingFilter 中通过 request.setCharacterEncoding(encoding) 方法设置字符集的 request.setCharacterEncoding(encoding) 方法要求前面不能有任何获取请求参数的操作 而 HiddenHttpMethodFilter 恰恰有一个获取请求方式的操作 String paramValue request.getParameter(this.methodParam);RESTful案例
和传统 CRUD 一样实现对员工信息的增删改查。 1.搭建环境 web.xml
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--配置编码过滤器--filterfilter-nameCharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-paraminit-paramparam-nameforceResponseEncoding/param-nameparam-valuetrue/param-value/init-param/filterfilter-mappingfilter-nameCharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--配置处理请求方式put和delete的HiddenHttpMethodFilter--filterfilter-nameHiddenHttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class/filterfilter-mappingfilter-nameHiddenHttpMethodFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--配置SpringMVC的前端控制器DispatcherServlet--servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:springMVC.xml/param-value/init-paramload-on-startup1/load-on-startup/servletservlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mapping/web-appdelete put 方法需要过滤器org.springframework.web.filter.HiddenHttpMethodFilter 记得添加 springMVC.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://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-packagecom.restful.demo_restful/context:component-scan!--配置Thymeleaf视图解析器--bean idviewResolver classorg.thymeleaf.spring5.view.ThymeleafViewResolverproperty nameorder value1/property namecharacterEncoding valueUTF-8/property nametemplateEnginebean classorg.thymeleaf.spring5.SpringTemplateEngineproperty nametemplateResolverbean classorg.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver!-- 视图前缀 --property nameprefix value/WEB-INF/templates//!-- 视图后缀 --property namesuffix value.html/property nametemplateMode valueHTML5/property namecharacterEncoding valueUTF-8 //bean/property/bean/property/bean!--配置视图控制器--mvc:view-controller path/ view-nameindex/mvc:view-controllermvc:view-controller path/toAdd view-nameemployee_add/mvc:view-controller!--开放对静态资源的访问--mvc:default-servlet-handler /!--开启mvc注解驱动--mvc:annotation-driven //beansMycontroller.java
package com.restful.demo_restful.controller;import com.restful.demo_restful.dao.EmployeeDao;
import com.restful.demo_restful.pro.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import java.util.Collection;/*** ClassName: MyController* Package: com.restful.demo_restful.controller* Description:** Author Thmiao* Create 2023/10/24 17:21* Version 1.0*/Controller
public class MyController {AutowiredEmployeeDao employeeDao;// 获取所有的员工RequestMapping(value /employee, method RequestMethod.GET)public String getEmployeeList(Model model){CollectionEmployee employeeList employeeDao.getAll();model.addAttribute(employeeList, employeeList);return employee_list;}// 删除员工RequestMapping(value /employee/{id}, method RequestMethod.DELETE)public String deleteEmployee(PathVariable(id) Integer id){employeeDao.delete(id);return redirect:/employee;}// 添加员工信息RequestMapping(value /employee, method RequestMethod.POST)public String addEmployee(Employee employee){employeeDao.save(employee);return redirect:/employee;}// 修改页面RequestMapping(value /employee/{id}, method RequestMethod.GET)public String getEmployeeById(PathVariable(id) Integer id, Model model){Employee employee employeeDao.get(id);model.addAttribute(employee, employee);return employee_update;}// 修改员工信息RequestMapping(value /employee, method RequestMethod.PUT)public String updateEmployee(Employee employee){employeeDao.save(employee);return redirect:/employee;}
}
EmpolyeeDao.java
package com.restful.demo_restful.dao;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.restful.demo_restful.pro.Employee;
import org.springframework.stereotype.Repository;Repository
public class EmployeeDao {private static MapInteger, Employee employees null;static{employees new HashMapInteger, Employee();employees.put(1001, new Employee(1001, E-AA, aa163.com, 1));employees.put(1002, new Employee(1002, E-BB, bb163.com, 1));employees.put(1003, new Employee(1003, E-CC, cc163.com, 0));employees.put(1004, new Employee(1004, E-DD, dd163.com, 0));employees.put(1005, new Employee(1005, E-EE, ee163.com, 1));}private static Integer initId 1006;public void save(Employee employee){if(employee.getId() null){employee.setId(initId);}employees.put(employee.getId(), employee);}public CollectionEmployee getAll(){return employees.values();}public Employee get(Integer id){return employees.get(id);}public void delete(Integer id){employees.remove(id);}
}Employee.java
package com.restful.demo_restful.pro;public class Employee {private Integer id;private String lastName;private String email;//1 male, 0 femaleprivate Integer gender;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName lastName;}public String getEmail() {return email;}public void setEmail(String email) {this.email email;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender gender;}public Employee(Integer id, String lastName, String email, Integer gender) {super();this.id id;this.lastName lastName;this.email email;this.gender gender;}public Employee() {}
}myjs.js
var vue new Vue({el:#dataTable,methods:{//event表示当前事件deleteEmployee:function (event) {//阻止超链接的默认跳转行为event.preventDefault();//通过id获取表单标签var delete_form document.getElementById(delete_form);//将触发事件的超链接的href属性为表单的action属性赋值delete_form.action event.target.href;//提交表单delete_form.submit();}
}
});
employee_add.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleAdd Employee/title
/head
bodyform th:action{/employee} methodpostlastName:input typetext namelastNamebremail:input typetext nameemailbrgender:input typeradio namegender value1maleinput typeradio namegender value0femalebrinput typesubmit valueaddbr
/form/body
/htmlemployee_list.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleEmployee Info/titlescript typetext/javascript th:src{/static/js/vue.js}/script/head
bodytable iddataTable border1 cellpadding0 cellspacing0 styletext-align: center; trth colspan5Employee Info/th/trtrthid/ththlastName/ththemail/ththgender/ththoptions(a th:href{/toAdd}add/a)/th/trtr th:eachemployee : ${employeeList}td th:text${employee.id}/tdtd th:text${employee.lastName}/tdtd th:text${employee.email}/tdtd th:text${employee.gender}/tdtda classdeleteA clickdeleteEmployee th:href{/employee/${employee.id}}delete/aa th:href{/employee/${employee.id}}update/a/td/tr
/table!-- 作用通过超链接控制表单的提交将post请求转换为delete请求 --
form iddelete_form methodpost!-- HiddenHttpMethodFilter要求必须传输_method请求参数并且值为最终的请求方式 --input typehidden name_method valueDELETE/
!-- input typehidden name_method valuedelete/--
/form
/body
script typetext/javascript th:src{/static/js/myjs.js}/script
/htmlemployee_update.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleUpdate Employee/title
/head
bodyform th:action{/employee} methodpostinput typehidden name_method valueputinput typehidden nameid th:value${employee.id}lastName:input typetext namelastName th:value${employee.lastName}bremail:input typetext nameemail th:value${employee.email}br!--th:field${employee.gender}可用于单选框或复选框的回显若单选框的value和employee.gender的值一致则添加checkedchecked属性--gender:input typeradio namegender value1 th:field${employee.gender}maleinput typeradio namegender value0 th:field${employee.gender}femalebrinput typesubmit valueupdatebr
/form/body
/htmlindex.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8 titleTitle/title
/head
body
h1首页/h1
a th:href{/employee}访问员工信息/a
/body
/html spring 环境 。还有vue.js记得导入 功能清单
功能URL 地址请求方式访问首页√/GET查询全部数据√/employeeGET删除√/employee/2DELETE跳转到添加数据页面√/toAddGET执行保存√/employeePOST跳转到更新数据页面√/employee/2GET执行更新√/employeePUT