Active el proceso de implementación de mapeo de estilo SpringBoot Restful y solicite el principio de mapeo

Solicitar mapeo

@xxxMapping;

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping

Soporte de estilo de descanso (usando verbos de solicitud HTTP para expresar operaciones en recursos)

antes de:

/getUser 获取用户
/deleteUser 删除用户
/editUser 修改用户
/saveUser保存用户

Ahora: / usuario

GET-获取用户
DELETE-删除用户
PUT-修改用户
POST-保存用户

核心 Filtro ; HiddenHttpMethodFilter

uso

Active la función Resto del
formulario de la página. El atributo del formulario de la página es método = publicar, dominio oculto _metodo = poner, eliminar, etc. (si obtiene o publica directamente, no necesita ocultar el dominio).
Asignación de solicitud de escritura

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true   #开启页面表单的Rest功能

<form action="/user" method="get">
    <input value="REST-GET提交" type="submit" />
</form>

<form action="/user" method="post">
    <input value="REST-POST提交" type="submit" />
</form>

<form action="/user" method="post">
    <input name="_method" type="hidden" value="DELETE"/>
    <input value="REST-DELETE 提交" type="submit"/>
</form>

<form action="/user" method="post">
    <input name="_method" type="hidden" value="PUT" />
    <input value="REST-PUT提交"type="submit" />
<form>

@GetMapping("/user")
//@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getUser(){
    
    
    return "GET-张三";
}

@PostMapping("/user")
//@RequestMapping(value = "/user",method = RequestMethod.POST)
public String saveUser(){
    
    
    return "POST-张三";
}

@PutMapping("/user")
//@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String putUser(){
    
    
    return "PUT-张三";
}

@DeleteMapping("/user")
//@RequestMapping(value = "/user",method = RequestMethod.DELETE)
public String deleteUser(){
    
    
    return "DELETE-张三";
}

Principio de reposo

(Cuando se usa REST para el
envío del formulario ) El envío del formulario traerá la
solicitud _method = PUT y será interceptado por HiddenHttpMethodFilter. Si la
solicitud es normal y es POST

  1. Obtenga el valor de _method.
  2. Compatible con las siguientes solicitudes; PUT.DELETE.PATCH
  3. Solicitud nativa (publicación), el modo de envoltura requestWrapper reescribe el método getMethod y devuelve el valor pasado.
  4. Utilice una envoltura cuando se suelte la cadena del filtro. La siguiente llamada al método getMethod es llamar a requesWrapper.
public class HiddenHttpMethodFilter extends OncePerRequestFilter {
    
    

	private static final List<String> ALLOWED_METHODS =
			Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(),
					HttpMethod.DELETE.name(), HttpMethod.PATCH.name()));

	/** Default method parameter: {@code _method}. */
	public static final String DEFAULT_METHOD_PARAM = "_method";

	private String methodParam = DEFAULT_METHOD_PARAM;


	/**
	 * Set the parameter name to look for HTTP methods.
	 * @see #DEFAULT_METHOD_PARAM
	 */
	public void setMethodParam(String methodParam) {
    
    
		Assert.hasText(methodParam, "'methodParam' must not be empty");
		this.methodParam = methodParam;
	}

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
    
    

		HttpServletRequest requestToUse = request;

		if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
    
    
			String paramValue = request.getParameter(this.methodParam);
			if (StringUtils.hasLength(paramValue)) {
    
    
				String method = paramValue.toUpperCase(Locale.ENGLISH);
				if (ALLOWED_METHODS.contains(method)) {
    
    
					requestToUse = new HttpMethodRequestWrapper(request, method);
				}
			}
		}

		filterChain.doFilter(requestToUse, response);
	}


	/**
	 * Simple {@link HttpServletRequest} wrapper that returns the supplied method for
	 * {@link HttpServletRequest#getMethod()}.
	 */
	private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {
    
    

		private final String method;

		public HttpMethodRequestWrapper(HttpServletRequest request, String method) {
    
    
			super(request);
			this.method = method;
		}

		@Override
		public String getMethod() {
    
    
			return this.method;
		}
	}

}

Cómo cambiar el método _ predeterminado

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({
    
     Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({
    
     DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
    
    

    ...
    
    @Bean
    @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
    @ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)
    public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
    
    
        return new OrderedHiddenHttpMethodFilter();
    }
    
    ...
}
    

@ConditionalOnMissingBean (HiddenHttpMethodFilter.class) significa que hiddenHttpMethodFilter () se ejecuta cuando no hay HiddenHttpMethodFilter. Por lo tanto, podemos personalizar el filtro y cambiar el método _ predeterminado. P.ej:

@Configuration(proxyBeanMethods = false)
public class WebConfig{
    
    
    //自定义filter
    @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
    
    
        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
        methodFilter.setMethodParam("_m");
        return methodFilter;
    }    
}

Cambie _method a _m.

<form action="/user" method="post">
    <input name="_m" type="hidden" value="DELETE"/>
    <input value="REST-DELETE 提交" type="submit"/>
</form>

Solicitar principio de mapeo

  • SpringBoot configura automáticamente el WelcomePageHandlerMapping de la página de bienvenida. Acceder / puede acceder a index.html;

  • SpringBoot configura automáticamente el RequestMappingHandlerMapping predeterminado

  • Cuando llegue la solicitud, pruebe todos los HandlerMapping uno por uno para ver si hay alguna información de solicitud.

  • Si es así, busque el controlador correspondiente a esta solicitud

  • Si no, es el próximo HandlerMapping

  • Necesitamos un procesamiento de mapeo personalizado, también podemos poner HandlerMapping en el contenedor nosotros mismos. HandlerMapping personalizado

Teclas de atajo de IDEA:

  1. Ctrl + Alt + U: los diagramas de clases UML muestran qué clases heredadas, clases derivadas y qué interfaces implementa la clase.
  2. Crtl + Alt + Shift + U: Igual que el anterior, la diferencia es que el resultado de la tecla de método abreviado anterior se muestra en la nueva página, mientras que el resultado de esta tecla de método abreviado se muestra en la ventana emergente.
  3. Ctrl + H: muestra el diagrama de jerarquía de clases en forma de árbol.

Supongo que te gusta

Origin blog.csdn.net/david2000999/article/details/115261090
Recomendado
Clasificación