SpringMVC知识总结

Posted scanner小霸王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC知识总结相关的知识,希望对你有一定的参考价值。

1.运行流程

运行流程
1)客户端发送请求
2)来到tomcat服务器
3)springmvc的前端控制器收到所有请求
4)来看请求地址和@RequestMapping标注的哪个匹配,来找到到底使用哪个类的哪个方法
5)前端控制器找到目标处理器和目标方法,直接利用反射执行目标方法
6)方法执行完成以后会有一个返回值,springMvc认为这个返回值就是要去找的页面地址
7)拿到方法返回值以后,用视图解析器进行拼接得到完整的页面地址
8)拿到页面地址,前端控制器转发到页面

@RequestMapping

这个就是告诉springMVC,这个方法用来处理什么请求,
这个/是可以省略大的,即使省略了也是默认从当前项目下开始,习惯性加上

*/和/的区别
/拦截所有请求,包括拦截jsp页面
/*拦截所有请求,不拦截jsp页面

2.REST

http协议四个表示操作方式的动词:GET、POST。PUT、DELETE;分别表示获取,新建,更新,删除资源
(操作地址URL相同,请求方式不同)

但是页面只能发送GET和POST两种方式;
如何使用REST风格
ii)需要在web.xml写上一个过滤器
(把普通的请求转换为规定形式的请求,配置这个filter)

<!--把普通的请求转换为规定形式的请求,配置这个filter-->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

分析:

ii)jsp代码:

<form action="test/book/1" method="post">
    <input type="submit" value="添加">
  </form>

  <form action="test/book/1" method="post">
    <input name="_method" value="delete"/>
    <input type="submit" value="删除">
  </form>

  <form action="test/book/1" method="post">
    <input name="_method" value="put"/>
    <input type="submit" value="更新">
  </form>
  <form action="test/book/1" method="GET">
    <input type="submit" value="查询">
  </form>

ii)java代码:

 @RequestMapping(value = "/book/id",method = RequestMethod.POST)
    public  String insert(@PathVariable("id") String id)
        System.out.println("增加的请求收到了,,");
        return "success";
    

    @RequestMapping(value = "/book/id",method = RequestMethod.DELETE)
    public  String delete(@PathVariable("id") String id)
        System.out.println("删除的请求收到了,,");
        return "success";
    

    @RequestMapping(value = "/book/id",method = RequestMethod.PUT)
    public  String update(@PathVariable("id") String id)
        System.out.println("更新的请求收到了,,");
        return "success";
    

    @RequestMapping(value = "/book/id",method = RequestMethod.GET)
    public  String get(@PathVariable("id") String id)
        System.out.println("查询的请求收到了,,");
        return "success";
    

高版本tomcat使用put,delete请求方式会报错
SPs only permit GET, POST or HEAD. Jasper also permits OPTIONS;
直接添加一个属性即可isErrorPage=“true”,
如果有错用excetion接收即可


springMVC的执行流程:

参考博客:https://blog.csdn.net/weixin_48922154/article/details/113867510

3.源码分析:

1)前端控制器DispathcherServlet 最主要的方法doDispatch

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception 
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        boolean multipartRequestParsed = false;
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

        try 
            try 
                ModelAndView mv = null;
                Object dispatchException = null;

                try 
					//检查是否文件上传请求
                    processedRequest = this.checkMultipart(request);
                    multipartRequestParsed = processedRequest != request;
					//根据当前请求找到哪个类来处理
                    mappedHandler = this.getHandler(processedRequest);
 
					//如果没有找到哪个处理器能处理这个请求就404或者抛出异常
                    if (mappedHandler == null) 
                        this.noHandlerFound(processedRequest, response);
                        return;
                    
					//拿到能执行这个类的所有方法的适配器:(反射工具)
                    HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
                    String method = request.getMethod();
                    boolean isGet = "GET".equals(method);
                    if (isGet || "HEAD".equals(method)) 
                        long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                        if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) 
                            return;
                        
                    
                    if (!mappedHandler.applyPreHandle(processedRequest, response)) 
                        return;
                    





2)getHandler()细节分析:怎么根据当前请求找到哪个类来处理
handlerMappings:处理器映射,他里面会保存了每一个处理器能处理哪些请求的映射

handlerMapping:ioc容器启动创建Controller对象的时候扫描每一个处理器都能处理什么请求,保存在handlerMapping

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception 
    if (this.handlerMappings != null) 
        Iterator var2 = this.handlerMappings.iterator();

        while(var2.hasNext()) 
            HandlerMapping mapping = (HandlerMapping)var2.next();
            HandlerExecutionChain handler = mapping.getHandler(request);
            if (handler != null) 
                return handler;
            
        
    

    return null;


3)getHandlerAdapter()

如何找到目标处理器的适配器
遍历所有的适配器,找到能解析的适配器

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException 
    if (this.handlerAdapters != null) 
        Iterator var2 = this.handlerAdapters.iterator();

        while(var2.hasNext()) 
            HandlerAdapter adapter = (HandlerAdapter)var2.next();
            if (adapter.supports(handler)) 
                return adapter;
            
        
    

    throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");


以上是关于SpringMVC知识总结的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC知识总结

语法英语初二的

springmvc--注册 知识点总结

springmvc 项目完整示例08 前台页面以及知识点总结

短学期知识总结

Spring开发框架知识篇Spring MVC总结