Handler 的类型:
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。
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配值中:
结过展示:
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
结果展示:
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就不会加入了。
结果展示:
基于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
结果展示:
所以当遇到那个类似错误,根据你使用的handler类型加入对应的handler adapter就行了。
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.