三门峡网站网站建设,鄂州手机网站设计,北京网站建设的公司哪家好,大连企业网站建设定制RESTFUL简介#xff1a;
Restful是我们看待服务器的一种方式#xff0c;我们都知道Java一切皆对象#xff0c;因此在Java中#xff0c;我们可以将所有的内容都看成对象#xff0c;而在这里#xff0c;RESTFUL是我们看待服务器的一种方式#xff0c;我们可将服务器中的所…RESTFUL简介
Restful是我们看待服务器的一种方式我们都知道Java一切皆对象因此在Java中我们可以将所有的内容都看成对象而在这里RESTFUL是我们看待服务器的一种方式我们可将服务器中的所有内容看成资源一切皆资源每个资源是服务器上一个可命名的抽象概念例如一张图片一个文件一首歌,数据库中的一张表等等这些都可以是资源那么我们该如何表示这个资源呢在Restful中我们可通过一个名词进行表示其实也就是该资源的名字就比如在现实生活中我们需要去一个班级寻找一个学生那么就需要通过其名字名字就是学生作为资源的名称因此在服务器中我们寻找一个资源也是需要通过其名称进行寻找
RESTFUL的模拟实现
在服务器中需要某一个资源我们可通过其名称但同一个资源又有不同的操作方式那么该如何表示对同一个资源的不同操作方式呢 在Restful中我们可通过四个表示操作方式的动词GET[查询资源获取资源],POST[新建资源],PUT[修改资源],DELETE[删除资源]REST风格与传统方式不同的是它提倡URL地址使用统一的风格设计从前到后各个单词使用斜杠分开不使用传统的问号键值对方式携带请求参数而是将要发送给服务器的数据作为URL地址的一部分以保证整体风格的一致性如下所示为传统方式与REST风格的对比 使用RESTFUL实现对信息的操作的准备工作
第一步创建新的maven项目–指定打包的方式并且导入依赖 packagingwar/packagingdependencies!-- SpringMVC--dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.1/version/dependency!-- 日志--dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.3/version/dependency!-- ServletAPI--dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/version/dependency!-- Spring和Thymeleaf整合包--dependencygroupIdorg.thymeleaf/groupIdartifactIdthymeleaf-spring5/artifactIdversion3.0.12.RELEASE/version/dependency/dependencies第二步在项目结构中添加web模块如下所示 第三步在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!--设置Spring的编码过滤器 --filterfilter-nameCharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param!--过滤器将强制使用指定的字符编码无论请求中是否指定了其他编码--init-paramparam-nameforceEncoding/param-nameparam-valuetrue/param-value/init-param/filterfilter-mappingfilter-nameCharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--设置SpringMVC的前端控制器 --servletservlet-nameSpringMVC/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:restful.xml/param-value/init-paramload-on-startup1/load-on-startup/servletservlet-mappingservlet-nameSpringMVC/servlet-nameurl-pattern//url-pattern/servlet-mapping
/web-app注意如果web.xml文件中含有多个过滤器那么编码过滤器需要放在最前面原因是编码过滤器设置的是编码而在设置编码之前我们不能获取任何的请求参数否则会导致设置的编码无效果
第四步创建控制层Controller
第五步在resources目录下创建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.xsdcontext:component-scan base-packageController /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/beanmvc:annotation-driven/mvc:view-controller path/ view-nameindex/mvc:view-controller
/beans第六步在WEB-INF目录下创建templates子目录并且创建index.html和success.html
index.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleindex/title
/head
body
h1欢迎进入首页/h1
/body
/htmlsuccess.html:
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleSuccess/title
/head
body
h1Success.html/h1
/body
/html使用RESTFUL实现对信息的查询操作
创建控制器方法
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;Controller
public class RestfulTestController {RequestMapping(value /user, method RequestMethod.GET)public String getUser() {System.out.println(查询所有的用户信息--/user-get);return success;}
}index.html文件中添加如下超链接
a th:href{/user}查询用户信息/a浏览器中运行如下所示 控制台输出 使用RESTFUL实现对信息的条件查询操作
创建控制器方法
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;Controller
public class RestfulTestController {RequestMapping(value /user/{id},method RequestMethod.GET)public String getUserId(PathVariable(id) Integer id){System.out.println(通过id查询用户信息--/user/id-get);return success;}
}index.html文件中添加如下超链接
a th:href{/user/1}查询id为1的用户信息/a浏览器中运行如下所示 控制台输出 使用RESTFUL实现对信息的添加操作
创建控制器方法
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;Controller
public class RestfulTestController {RequestMapping(value /user,method RequestMethod.POST)public String insertUser(){System.out.println(添加用户信息---/user-post);return success;}
}index.html文件中添加如下超链接
form th:action{/user} methodpostinput typesubmit value添加用户信息
/form浏览器中运行如下所示 控制台输出 注意浏览器目前只能发送get和post请求若要发送put和delete请求需要在web.xml中配置一个过滤器HiddenHttpMethodFilter处理隐藏的 HTTP 方法如下所示在web.xml文件中设置请求方式的过滤器
隐藏的 HTTP 方法是一种在 HTML 表单中使用 POST 方法来模拟其他 HTTP 方法如 PUT、DELETE、PATCH的技术。通过在表单中添加一个name为 _method 的隐藏字段(typehidden)并将其value设置为要模拟的 HTTP 方法(如delete/put)可以实现对应的操作。通过配置隐藏 HTTP 方法过滤器可以在 Spring MVC 应用程序中使用 POST 方法来模拟其他 HTTP 方法以便支持 RESTful 风格的请求。
filterfilter-nameHiddenHttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class/filterfilter-mappingfilter-nameHiddenHttpMethodFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping使用RESTFUL实现对信息的修改操作
在index.html中添加form表单实现修改操作
form th:action{/user} methodpostinput typehidden name_method valueputinput typesubmit value修改用户信息
/form编写控制器方法 RequestMapping(value /user,method RequestMethod.PUT)public String updateUser(){System.out.println(修改用户信息---/user-put);return success;}重新部署项目运行结果如下所示 控制台输出如下所示 使用RESTFUL实现对信息的删除操作
在index.html中添加form表单实现删除操作
form th:action{/user} methodpostinput typehidden name_method valuedeleteinput typesubmit value删除用户信息
/form编写控制器方法
RequestMapping(value /user,method RequestMethod.DELETE)public String deleteUser(){System.out.println(删除用户信息---/user-delete);return success;}重新部署项目运行结果如下所示 控制台输出如下所示 Restful案例准备工作
第一步创建实体类
package Pojo;public class Employee {private Integer id;private String lastName;private 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 Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender gender;}Overridepublic String toString() {return Employee{ id id , lastName lastName \ , gender gender };}public Employee(Integer id, String lastName, Integer gender) {this.id id;this.lastName lastName;this.gender gender;}public Employee() {}
}第二步创建实体类DAO层
package Dao;import Pojo.Employee;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;Repository
public class EmployeeDao {private static MapInteger,Employee employeeMapnull;//初始化数据static {employeeMapnew HashMapInteger,Employee();employeeMap.put(1001,new Employee(1001,E-AA,1));employeeMap.put(1002,new Employee(1002,E-BB,1));employeeMap.put(1003,new Employee(1003,E-CC,0));employeeMap.put(1004,new Employee(1001,E-DD,0));employeeMap.put(1005,new Employee(1005,E-EE,1));}private static Integer initID1006;public void save(Employee employee){//设置当前的用户id自增if(employee.getId()null){employee.setId(initID);}employeeMap.put(employee.getId(),employee);}//获得用户的所有信息public CollectionEmployee getAll(){return employeeMap.values();}//根据id获取用户信息public Employee get(Integer id){return employeeMap.get(id);}//根据id删除用户信息public void delete(Integer id){employeeMap.remove(id);}
}第三步创建实体类控制层
package Controller;import org.springframework.stereotype.Controller;Controller
public class EmployeeController {
}实现列表功能
package Controller;import Dao.EmployeeDao;
import Pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import java.util.Collection;Controller
public class EmployeeController {Autowired//注意如果这里的employeeDao报错那么有两个原因1DAO层未添加Repository注解 2DAO层的类未被XML文件扫描到private EmployeeDao employeeDao;RequestMapping(value /employee,method RequestMethod.GET)public String getAllEmployee(Model model ){//获取所有的用户信息CollectionEmployee employeeCollectionemployeeDao.getAll();//将所有员工的信息在请求域中共享model.addAttribute(employeeCollection,employeeCollection);return employee_list;}
}employee_list.html
在 Thymeleaf 中th:each 是一个迭代器属性用于循环遍历集合或数组。它的语法是 th:eachitem : ${collection} 其中 item 是每次迭代的元素${collection} 是要遍历的集合或数组将每个元素赋值给名为 item 的变量。通常这个循环语句会嵌套在 HTML 的表格table中以便在每次迭代中生成表格的行tr。
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleemployee_list/title
/head
body
tabletrth colspan5employee list/th/trtrthid/ththlastName/ththemail/ththgender/ththoptions/th/tr!--由于表格中的信息需要我们从集合中一个个拿取因此需要使用到迭代器来遍历 --tr th:eachemployee:${employeeCollection}td th:text${employee.id}/tdtd th:text${employee.LastName}/tdtd th:text${employee.email}/tdtd th:text${employee.gender}/tdtda hrefdelete/aa hrefupdate/a/td/tr
/table
/body
/htmlindex.html:
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleindex/title
/head
body
h1欢迎进入首页/h1
a th:href{/employee}查询所有的员工信息 /a
/body
/html重新部署项目运行如下所示 RestFul处理静态资源
什么是静态资源
静态资源是指在Web应用程序中不经常变化的文件如HTML、CSS、JavaScript、图像、字体文件等。这些文件在服务器上存储为静态文件并在客户端请求时直接返回给浏览器不需要经过服务器端的处理。
静态资源通常用于呈现网页的外观和功能如布局、样式、交互行为等。它们不包含动态生成的内容而是在开发过程中预先创建和维护的文件。
与动态资源相比静态资源的特点是内容相对稳定不需要经常变化。由于不需要服务器端的处理静态资源的响应速度通常更快可以有效地减轻服务器的负载。
在Web开发中静态资源通常存储在服务器的特定目录下并通过URL路径来访问。例如一个CSS文件可以通过link标签的href属性引入一个JavaScript文件可以通过script标签的src属性引入。
在工程中使用静态资源
第一步将静态资源放置当前目录的webapp下注意不要放在WEB-INF目录下了如下所示 第二步
在html文件的head标签中通过link标签引入该静态资源如下所示
!--注意这里的路径不需要加webapp,因为webapp只是用来存放静态资源的具体的路径看target中的目录如下所示target中是以static直接开头的 --
link relstylesheet th:href{/static/css/index_work.css}第三步在XML文件中添加如下所示两个标签否则静态资源不会被应用的到当前项目并且打开浏览器的检查页面会出现404错误
mvc:annotation-driven/
mvc:default-servlet-handler/原因是如果当前工程和tomcat配置了同样的资源那么以工程的为准由于当前工程的web.xml配置的前端控制器DispatcherServlet的url-pattern是/tomcat的web.xml配置的DefaultServlet的url-pattern也是/此时浏览器发送的请求会优先被DispatcherServlet进行处理但是DispatcherServlet无法处理静态资源这就导致我们引入的静态资源发生404错误
解决方法为我们需要同时配置mvc:default-servlet-handler/和mvc:annotation-driven/这表示浏览器发送的请求会先被DispatcherServlet处理无法处理再交给DefaultServlet处理
引入静态资源后我们需要先对当前项目进行清理再对其重新进行打包防止target中没有该静态资源
此时部署项目显示如下所示 实现添加功能
第一步配置关于添加功能的视图控制器如下所示:
mvc:view-controller path/to/add view-nameemployee_add/mvc:view-controller第二步创建对应的视图添加页面的视图employee_add.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleadd employee/titlelink relstylesheet th:href{/static/css/index_work.css}
/head
body
form th:action{/employee} methodpost
tabletrth colspan2add employee/th/trtrtdlastName/tdtdinput typetext namelastName/td/trtrtdemail/tdtdinput typetext nameemail/td/trtrtdgender/tdtdinput typeradio namegender value1maleinput typeradio namegender value0famale/td/trtrtd colspan2input typesubmit valueadd/td/tr
/table
/form
/body
/html第三步实现点击添加功能即跳转到该页面如下所示在employee_list.html中进行如下修改 第二步编写控制器方法处理添加的请求
//虽然这里的路径具体信息也是/employee但是二者的请求方式不同而我们在index.html中是以超链接也就是get方式对请求进行处理因此会匹配到查询的控制器方法
RequestMapping(value /employee,method RequestMethod.POST)public String addEmployee(Employee employee){//直接获取实体类对象employeeDao.save(employee);//使用户看到添加完成之后的页面因此继续访问列表功能return redirect:/employee;}实现修改功能
修改功能为什么不使用视图控制器呢
原因是视图控制器只适用于简单的请求处理场景对于复杂的业务逻辑可能还需要编写自定义的控制器来处理请求对于上述的添加功能我们只需要跳转到添加用户信息的页面即可而修改功能业务逻辑就复杂了一些我们需要先根据id获取需要修改的用户信息再进行修改
第一步创建处理修改用户信息的控制器方法
RequestMapping(value /employee,method RequestMethod.PUT)public String updateEmployee(Employee employee){employeeDao.save(employee);return redirect:/employee;}第二步在employee_list.html中添加有关修改功能的超链接
!--正确写法 --a th:href{/employee/${employee.id}}update/a!--错误写法${employee.id}是请求参数不能直接以路径的形式进行传输 --
!-- a th:href{/employee/${employee.id}}update/a--第二步编写控制器方法处理修改的请求
RequestMapping(value /employee/{id},method RequestMethod.GET)public String toupdateEmployee(PathVariable(id) Integer id,Model model){//修改功能Employee employee employeeDao.get(id);model.addAttribute(employee,employee);//跳转到上文获取到的id的修改页面return employee_update;}第三步创建修改功能的视图
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleupdate employee/titlelink relstylesheet th:href{/static/css/index_work.css}
/head
body
form th:action{/employee} methodpostinput typehidden name_method valueputinput typehidden nameid th:value${employee.id}tabletrth colspan2add employee/th/trtrtdlastName/tdtdinput typetext namelastName th:value${employee.lastName}/td/trtrtdemail/tdtdinput typetext nameemail th:value${employee.email}/td/trtrtdgender/tdtdinput typeradio namegender value1 th:field${employee.gender}maleinput typeradio namegender value0 th:field${employee.gender}famale/td/trtrtd colspan2input typesubmit valueupdate/td/tr/table
/form
/body
/html实现删除功能
删除功能的麻烦之处在于需要使用超链接来控制表单的提交因为删除功能要发送的请求是delete因此我们需要一个表单将其请求方式设置为post再传递请求参数为_method,其值为delete让其表单提交我们才能发送delete请求
但是不能如下所示这样写 a th:href{/employee/${employee.id}}delete/a原因是当前的超链接功能相同那么都会跳转到修改的页面因此需要重新设置请求方式为delete的表单
form methodpostinput typehidden name_method valuedelete
/form点击该超链接控制该表单的提交把当前的href属性赋值给下面表单的action属性
script typetext/javascript th:src{/static/js/vue.js}/script
script typetext/javascriptvar vuenew Vue({el:#app,methods:{deleteEmployee(){//获取form表单var formdocument.getElementsByTagName(form)[0];//将超链接的href属性值赋值给form表单的action属性,event.target表示当前触发时间的标签form.actionevent.target.href;//表单提交form.submit();//阻止超链接的默认行为event.preventDefault();}}});
/script
注意超链接都有默认行为点击超链接一定会将请求发送到当前href所设置的请求地址当前我们是通过表单提交的我们不能让超链接执行其默认行为因此需要通过preventDefault()去阻止其行为。
employee_list.html完整代码如下所示
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleemployee_list/titlelink relstylesheet th:href{/static/css/index_work.css}
/head
body
div idapp
table trth colspan5employee list/th/trtrthid/ththlastName/ththemail/ththgender/ththoptions(a th:href{/to/add}add/a)/th/trtr th:eachemployee:${employeeCollection}td th:text${employee.id}/tdtd th:text${employee.LastName}/tdtd th:text${employee.email}/tdtd th:text${employee.gender}/tdtda th:href{/employee/${employee.id}}update/aa clickdeleteEmployee() th:href{/employee/${employee.id}}delete/a/td/tr/table
form methodpostinput typehidden name_method valuedelete
/form
/div
script typetext/javascript th:src{/static/js/vue.js}/script
script typetext/javascriptvar vuenew Vue({el:#app,methods:{deleteEmployee(){//获取form表单var formdocument.getElementsByTagName(form)[0];//将超链接的href属性值赋值给form表单的action属性,event.target表示当前触发时间的标签form.actionevent.target.href;//表单提交form.submit();//阻止超链接的默认行为event.preventDefault();}}});
/script/body/html编写其对应的控制器方法
RequestMapping(value /employee/{id}, method RequestMethod.DELETE)public String deleteEmployee(PathVariable(id) Integer id){employeeDao.delete(id);return redirect:/employee;}