栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java从零到架构师第③季】【28】SpringMVC-Servlet的URL匹配

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java从零到架构师第③季】【28】SpringMVC-Servlet的URL匹配


持续学习&持续更新中…

守破离


【Java从零到架构师第③季】【28】SpringMVC-Servlet的URL匹配

Servlet的URL匹配

*.do//*总结 Tomcat是如何匹配请求的

/—DefaultServlet*.jsp—JspServlet 新的问题静态资源被拦截的解决方案1静态资源被拦截的解决方案2path-matching参考

Servlet的URL匹配

*.do

只会匹配以.do为结尾的请求

*.controller
*.action
*.access

可以自定义后缀
这里使用.do



    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:applicationContext.xml
        
        0
    
    
        springmvc
        
        
        *.do
    

@Controller
public class DoController {
//    @RequestMapping(value = "/test.do")
    @RequestMapping(value = "/test/test.do")
    @ResponseBody
    public String test(String username, String password) {
        System.out.println("username : " + username + ", password : " + password);
        return "

热爱Coding,热爱Programming。"; } }

/

除了动态资源(例如.jsp文件)以外

会匹配所有请求(静态资源(.css、.js、.png…)、自定义的URL请求、…)

/*

真正意义上的匹配所有请求(动态资源、静态资源、自定义的URL请求、…)一般用于Filter 总结

可以理解为:/ + *.jsp = /* Tomcat是如何匹配请求的

在Tomcat的confweb.xml中可以找到,例如:D:apache-tomcat-8.5.70confweb.xml

/—DefaultServlet

org.apache.catalina.servlets.DefaultServlet用于处理除过动态资源(例如JSP文件)以外的所有请求,当然会包括静态资源(.css、.png、…)。

也就是说,DefaultServlet就是Tomcat用来处理静态资源的。

DefaultServlet会将静态资源解析处理后,返回(写出)给客户端。

  
    
        default
        org.apache.catalina.servlets.DefaultServlet
		
    
    
    
        default
        /
    
*.jsp—JspServlet

org.apache.jasper.servlet.JspServlet用于处理以.jsp为结尾的请求。

也就是说,JspServlet就是Tomcat用来处理JSP文件的。

JspServlet可以将JSP文件解析处理后,返回(写出)给客户端。

    
        jsp
        org.apache.jasper.servlet.JspServlet
		
    
    
    
        jsp
        *.jsp
        *.jspx
    
新的问题

现在我们已经知道了*.do、/、/*的区别。

也已经知道了Tomcat是如何处理静态资源和JSP文件的。

那么,使用SpringMVC,在平时开发中,我们应该如何去匹配请求呢?

    首先,肯定不能使用/*,因为/*会匹配到所有的请求,当然也会将JSP文件也给匹配到,但是我们的DispatcherServlet却不能够解析处理JSP文件。其次,在开发中,我们肯定也不想为每个请求都在后面加上一个.do、.action之类的后缀。那么,只能使用/来匹配请求了。

问题来了,如果使用/来匹配请求的话,我们知道,/是会匹配到除了JSP文件以外的所有请求的,但是静态资源(.css、.png、*.js、…)的请求怎么办呢?我们的DispatcherServlet也不能够解析这些静态资源呀。

静态资源被拦截的解决方案1

交给Tomcat去处理

applicationContext.xml:



    
    
    
        
            
                
            
        
    

    
    
    
    

web.xml:



    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:applicationContext.xml
        
        0
    
    
        springmvc
        /
    
    
    
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
    
    
        CharacterEncodingFilter
        /*
    

静态资源被拦截的解决方案2

交给SpringMVC去处理

	    
	
    
    
	
path-matching

在SpringMVC中默认:访问URL,加任意后缀名都能访问。
比如:你想访问/login,但是通过/login.do、/login.action、/login.json、…都能访问

webapp目录下,有一个hello.html:

这个html文件的访问路径应该是:

http://host:port/context_path/hello.html

有一个Controller:

@Controller
public class MyController {
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "

Controller-hello"; } }

这个Controller的访问路径应该是:

http://host:port/context_path/hello

但是当我们使用浏览器访问的时候,发现访问hello.html时却访问的是Controller:

为了解决这个问题,我们需要在applicationContext.html中配置如下:


    

配置好后,重新部署项目,我们就可以看到hello.html可以正常访问了:

参考

小码哥-李明杰: Java从0到架构师③进阶互联网架构师.

脚本之家: SpringMVC URL匹配—禁用后缀访问操作.


本文完,感谢您的关注支持!


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/711009.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号