建个网站多少钱,源码下载网站有哪些,网站让女友做网站模特,网站建设好公司一、概述
1.1简介 Restful就是一个资源定位及资源操作的风格。不是标准也不是协议#xff0c;只是一种风格。基于这个风格设计的软件可以更简洁#xff0c;更有层次#xff0c;更易于实现缓存等机制。 1.2功能 资源#xff1a;互联网所有的事物都可以被抽象为资源 资源操作…一、概述
1.1简介 Restful就是一个资源定位及资源操作的风格。不是标准也不是协议只是一种风格。基于这个风格设计的软件可以更简洁更有层次更易于实现缓存等机制。 1.2功能 资源互联网所有的事物都可以被抽象为资源 资源操作使用POST、DELETE、PUT、GET使用不同方法对资源进行操作。 分别对应 添加、 删除、修改、查询。 1.3优点 隐藏资源的访问行为无法通过地址得知对资源是何种操作书写简化 1.4RESTful入门案例 //设置当前请求方法为DELETE表示REST风格中的删除操作//PathVariable注解用于设置路径变量路径参数要求路径上设置对应的占位符并且占位符名称与方法形参名称相同RequestMapping(value /users/{id},method RequestMethod.DELETE)ResponseBodypublic String delete(PathVariable Integer id){System.out.println(user delete... id);return {module:user delete};}
DELETE http://localhost:8080/users/1 类型形参注解 位置SpringMVC控制器方法形参定义前面 作用用于将URL中的路径变量绑定到方法参数上。这样当用户访问一个包含路径变量的URL时这些路径变量的值将被自动传递给相应的方法参数 RequestBody RequestParam PathVariable的区别 区别 RequestParam用于接收url地址传参或表单传参RequestBody用于接收json数据PathVariable用于接收路径参数使用{参数名称}描述路径参数 应用 后期开发中发送请求参数超过1个时以json格式为主RequestBody应用较广如果发送非json格式数据选用RequestParam接收请求参数采用RESTful进行开发当参数数量较少时例如1个可以采用PathVariable接收请求路径变量通常用于传递id值 1.5RESTful快速开发 改进
package com.yanyu.controller;import com.yanyu.pojo.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;//Controller
//ResponseBody配置在类上可以简化配置表示设置当前每个方法的返回值都作为响应体
//ResponseBody
RestController //使用RestController注解替换Controller与ResponseBody注解简化书写
RequestMapping(/books)
public class BookController {// RequestMapping( method RequestMethod.POST)PostMapping //使用PostMapping简化Post请求方法对应的映射配置public String save(RequestBody Book book){System.out.println(book save... book);return {module:book save};}// RequestMapping(value /{id} ,method RequestMethod.DELETE)DeleteMapping(/{id}) //使用DeleteMapping简化DELETE请求方法对应的映射配置public String delete(PathVariable Integer id){System.out.println(book delete... id);return {module:book delete};}// RequestMapping(method RequestMethod.PUT)PutMapping //使用PutMapping简化Put请求方法对应的映射配置public String update(RequestBody Book book){System.out.println(book update...book);return {module:book update};}// RequestMapping(value /{id} ,method RequestMethod.GET)GetMapping(/{id}) //使用GetMapping简化GET请求方法对应的映射配置public String getById(PathVariable Integer id){System.out.println(book getById...id);return {module:book getById};}// RequestMapping(method RequestMethod.GET)GetMapping //使用GetMapping简化GET请求方法对应的映射配置public String getAll(){System.out.println(book getAll...);return {module:book getAll};}
}RestController 类型类注解 位置基于SpringMVC的RESTful开发控制器类定义上方 作用 是Spring框架中的一个注解用于标识一个类是一个RESTful风格的控制器。它是Controller和ResponseBody注解的组合表示这个类中的方法返回的是数据而不是视图。使用RestController注解可以简化代码不需要在每个方法上添加ResponseBody注解同时也可以让Spring自动将方法返回的数据转换为JSON格式。这样就可以方便地构建RESTful风格的API。 GetMapping PostMapping
PutMapping DeleteMapping 类型方法注解 位置基于SpringMVC的RESTful开发控制器方法定义上方 作用设置当前控制器方法请求访问路径与请求动作每种对应一个请求动作例如GetMapping对应GET请求 属性 value默认请求访问路径 1.6案例实现
实体类
package com.yanyu.pojo;import lombok.*;Data
Builder
AllArgsConstructor
NoArgsConstructor
ToString
public class Book {private Integer id;private String type;private String name;private String description;}控制类
package com.yanyu.controller;import com.yanyu.pojo.Book;
import org.springframework.web.bind.annotation.*;import java.util.ArrayList;
import java.util.List;RestController
RequestMapping(/books)
public class BookController {PostMappingpublic String save(RequestBody Book book){System.out.println(book save book);return {module:book save success};}GetMappingpublic ListBook getAll(){System.out.println(book getAll is running ...);ListBook bookList new ArrayListBook();Book book1 new Book();book1.setType(计算机);book1.setName(SpringMVC入门教程);book1.setDescription(小试牛刀);bookList.add(book1);Book book2 new Book();book2.setType(计算机);book2.setName(SpringMVC实战教程);book2.setDescription(一代宗师);bookList.add(book2);Book book3 new Book();book3.setType(计算机丛书);book3.setName(SpringMVC实战教程进阶);book3.setDescription(一代宗师呕心创作);bookList.add(book3);return bookList;}}
测试
POST http://localhost:8080/books
Content-Type: application/json{id : 11111,type : 计算机丛书,name : Springmvc,description : 好书}GET http://localhost:8080/books
配置类-过滤器
package com.itheima.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {//设置静态资源访问过滤当前类需要设置为配置类并被扫描加载Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {//当访问/pages/????时候从/pages目录下查找内容registry.addResourceHandler(/pages/**).addResourceLocations(/pages/);registry.addResourceHandler(/js/**).addResourceLocations(/js/);registry.addResourceHandler(/css/**).addResourceLocations(/css/);registry.addResourceHandler(/plugins/**).addResourceLocations(/plugins/);}
}二、拦截器
2.1概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 **过滤器与拦截器的区别**拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分任何java web工程都可以使用在url-pattern中配置了/*之后可以对所有要访问的资源进行拦截 拦截器 拦截器是SpringMVC框架自己的只有使用了SpringMVC框架的工程才能使用拦截器只会拦截访问的控制器方法 如果访问的是jsp/html/css/image/js是不会进行拦截的 浏览器发送一个请求会先到Tomcat的web服务器Tomcat服务器接收到请求以后会去判断请求的是静态资源还是动态资源如果是静态资源会直接到Tomcat的项目部署目录下去直接访问如果是动态资源就需要交给项目的后台代码进行处理在找到具体的方法之前我们可以去配置过滤器(可以配置多个)按照顺序进行执行然后进入到到中央处理器(SpringMVC中的内容)SpringMVC会根据配置的规则进行拦截如果满足规则则进行处理找到其对应的controller类中的方法进行执行,完成后返回结果如果不满足规则则不进行处理这个时候如果我们需要在每个Controller方法执行的前后添加业务具体该如何来实现?这个就是拦截器要做的事。 2.2入门案例
拦截器配置
package com.yanyu.interceptor;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;Component
//定义拦截器类实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {Override//原始方法调用前执行的内容//返回值类型可以拦截控制的执行true放行false终止public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String contentType request.getHeader(Content-Type);HandlerMethod hm (HandlerMethod)handler;System.out.println(preHandle...contentType);return true;}Override//原始方法调用后执行的内容public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(postHandle...);}Override//原始方法调用完成后执行的内容public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(afterCompletion...);}
}这段代码是一个基于Spring MVC的拦截器。它实现了HandlerInterceptor接口并重写了preHandle、postHandle和afterCompletion三个方法。在preHandle方法中首先获取请求头中的Content-Type然后将其与处理器对象进行类型转换最后输出preHandle...。postHandle方法中只输出postHandle...。afterCompletion方法中只输出afterCompletion...。这个拦截器的作用是在请求处理过程中对请求进行预处理、后处理和完成处理。 监听器
package com.yanyu.config;import com.yanyu.interceptor.ProjectInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {Autowiredprivate ProjectInterceptor projectInterceptor;//设置静态资源访问过滤当前类需要设置为配置类并被扫描加载Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {//当访问/pages/????时候从/pages目录下查找内容registry.addResourceHandler(/pages/**).addResourceLocations(/pages/);}Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(projectInterceptor).addPathPatterns(/books,/books/*);}
}
测试
POST http://localhost:8080/books
Content-Type: application/json{id : 11111,type : 计算机丛书,name : Springmvc,description : 好书}
2.3运行流程 2.4拦截器参数
前置处理方法
原始方法之前运行preHandle
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {//handler:被调用的处理器对象本质上是一个方法对象对反射中的Method对象进行了再包装return true;
}使用handler参数可以获取方法的相关信息,例如
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HandlerMethod hm (HandlerMethod)handler;String methodName hm.getMethod().getName();//可以获取方法的名称return true;
}后置处理方法
Override//原始方法调用后执行的内容public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(postHandle...);} 前三个参数和上面的是一致的。 modelAndView: 如果处理器执行完成具有返回结果可以读取到对应数据与页面信息并进行调整 因为咱们现在都是返回 json 数据所以该参数的使用率不高。 完成处理方法
拦截器最后执行的方法无论原始方法是否执行 public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception {System.out.println(afterCompletion);
}
//ex:如果处理器执行过程中出现异常对象可以针对异常情况进行单独处理
//因为我们现在已经有全局异常处理器类所以该参数的使用率也不高。2.5拦截器链配置 拦截器执行的顺序是和配置顺序有关。就和前面所提到的运维人员进入机房的案例先进后出。 当配置多个拦截器时形成拦截器链 拦截器链的运行顺序参照拦截器添加顺序为准 当拦截器中出现对原始处理器的拦截后面的拦截器均终止运行 当拦截器运行中断仅运行配置在前面的拦截器的 afterCompletion 操作