Spring MVC -- 4 种 HandlerAdapter 实例及介绍

Handler 的类型:

Spring MVC -- 4 种 HandlerAdapter 实例及介绍_第1张图片

Spring MVC -- 4 种 HandlerAdapter 实例及介绍_第2张图片

spring mvc 采用适配器模式来适配调用指定Handler,根据Handler的不同种类采用不同的Adapter,其Handler与 HandlerAdapter 对应关系如下:

Handler类别

对应适配器

描述

Controller

SimpleControllerHandlerAdapter

标准控制器,返回ModelAndView

HttpRequestHandler

 

HttpRequestHandlerAdapter

业务自行处理 请求,不需要通过modelAndView 转到视图

Servlet

SimpleServletHandlerAdapter

基于标准的servlet 处理

HandlerMethod

RequestMappingHandlerAdapter

基于@requestMapping对应方法处理

默认支持的handler adapter 有:

DispatcherServlet.properties 配置中:

org.springframework.web.servlet.HandlerAdapter=
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
   org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
   org.springframework.web.servlet.function.support.HandlerFunctionAdapter

如果自己添加了Adapter就不会在加载springMVC默认的这些Adapter了。

如果找不到对应的adapter就会报一下错误:

javax.servlet.ServletException: No adapter for handler

依赖包:

    
      org.springframework
      spring-webmvc
      5.2.0.RELEASE
    

web.xml




    SpringMVC
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation
        classpath:/spring-mvc-handler-adapter.xml
    

    
        SpringMVC
        /
    

    
        /index.jsp
    

user.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


Hello ${name}

一下实例hander mapping采用 beanUrlHandlerMapping。

Handler 类型 1 -- Controller:

Controller java file,

package com.allen.spring;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BeanNameControl implements Controller
{
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView("/WEB-INF/pages/user.jsp");
        mv.addObject("name","Bean Name Handler Mapping");
        return mv;
    }
}

Spring mvc配置:

注意下面的SimpleControllerHandlerAdapter类可以不用些在bean里面, 因为spring mvc已经为我们默认加入了,如前面提到的DispatcherServlet.properties配值中:




    
    

结过展示:

Spring MVC -- 4 种 HandlerAdapter 实例及介绍_第3张图片

Handler 类型 2 -- HttpRequestHandler :

Handler java file:

package com.allen.spring;

import org.springframework.web.HttpRequestHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HttpRequestHandlerSimple implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("hello HttpRequestHandler");
    }
}

spring-mvc-handler-adapter-http-request.xml




    
    

结果展示:

Spring MVC -- 4 种 HandlerAdapter 实例及介绍_第4张图片

Handler 类型 3 -- HttpServlet :

handler java file.

package com.allen.spring;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class SampleServlertHandlerSimple extends HttpServlet
{
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().println("Hello HttpServlet !!!");
    }
}

spring-mvc-handler-adapter-servlet.xml, 注意这里一定要显示加入bean SimpleServletHandlerAdapter, 因为spring mvc 默认加载的bean中没有配置该bean。而且一旦加入了非默认的adapter其他的默认的adapter就不会加入了。




    
    

结果展示:

Spring MVC -- 4 种 HandlerAdapter 实例及介绍_第5张图片

Handler 类型 4 -- @requestMapping:

基于RequestMapping 的java handler文件: 

package com.allen.spring;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class RequestMappingControl {

    @RequestMapping("/hello.do2")
    public ModelAndView helloWorld1(HttpServletRequest request, HttpServletResponse response){
        ModelAndView mv = new ModelAndView("/WEB-INF/pages/user.jsp");
        mv.addObject("name","RequestMappingControl");
        return mv;
    }
}

spring-mvc-handler-adapter-annotation.xml




    
    

结果展示:

Spring MVC -- 4 种 HandlerAdapter 实例及介绍_第6张图片

所以当遇到那个类似错误,根据你使用的handler类型加入对应的handler adapter就行了。

HTTP Status 500 – Internal Server Error


Type Exception Report

Message No adapter for handler [com.allen.spring.RequestMappingControl@63057698]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: No adapter for handler [com.allen.spring.RequestMappingControl@63057698]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
	org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1275)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1023)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Note The full stack trace of the root cause is available in the server logs.

你可能感兴趣的:(Spring,MVC)