学习springmvc的第三天

一、tomcat的defaultServlet,访问静态资源

tomcat本身能够处理静态资源的访问,如html,图片,js文件等静态资源
动态资源由中央调度器访问。

http://localhost:8080/ch05_url_pattern/index.jsp :tomcat(jsp会转为servlet)
http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js : tomcat
http://localhost:8080/ch05_url_pattern/images/p1.jpg : tomcat
http://localhost:8080/ch05_url_pattern/html/test.html: tomcat
http://localhost:8080/ch05_url_pattern/some.doDispatcherServlet(springmvc框架处理的)

tomcat是怎么访问这些静态资源的呢?
查看tomcat源代码,可知是使用web.xml文件中的名为defalue的servlet访问的,服务器启动时创建。
这个名为defalut来自DefaultServlet类的servlet的url-pattern路径是/

 <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
		    <servlet-name>default</servlet-name>
		    <url-pattern>/</url-pattern>
    </servlet-mapping>

default这个servlet作用:

The default servlet for all web applications, that serves static
resources. It processes all requests that are not mapped to other
servlets with servlet mappings (defined either here or in your own
web.xml file).

1、处理静态资源
2、处理未映射其他Servlet的请求。
换句话说就是没有注册到web.xml的Servlet并且没有配置url-patten的Servlet

default中的url-pattern

/ 表示静态资源和未映射的请求都由这个defaultServlet处理。

注意:/*是处理所有文件

有时我们的项目可能会要求我们的中央调度器处理静态资源,也就是使用/这个url-pattern。

注意当你注册的Servlet的项目中使用了 / ,那么这个Servlet会代替以上的defaultServlet,那么这个项目就不能自动访问静态资源。
那么接下来,tomcat接收用户数据后会根数用户提交的静态资源的路径交给DispatcherServlet(中央调度器)来处理,但是默认情况下DispatcherServlet没有处理静态资源的能力。没有控制器对象可以处理静态资源。因此静态资源此时都是404。无法处理请求。

那么控制器对象要怎么处理静态资源呢?

第一种处理静态资源的方式:(必会)

+<mvc:default-servlet-handler><mvc:annotation-driven>

<mvc:default-servlet-handler>

原理:在springmvc.xml文件中加入这个标签后,框架会创建控制器对象DefaultServletHttpRequstHandler(类似于我们创建的Controller处理器对象),DefalutServletHttpRequestHandler会将接收的请求转发给tomcat的default这个servlet

HttpServletRequest  request
request.getRequestDipatcher("请求路径").forward(request,response);

因为defalut-servlet-handler和@RequestMapping有冲突,因此需要加入<mvc annotation-driven >解决问题。

第二种处理静态资源的方式(掌握)

+<mvc:resouces mapping="访问静态资源的uri地址 location = "目录位置""> <mvc:annotation-driven>
<mvc:resources mapping="访问静态资源的uri地址" location="目录位置"> 加入后框架会 创建 ResouceHttpRequstHandler这个处理器对象,该对象不依赖tomcat
mapping="/imgs/**" 表示imgs目录及其子目录下任意文件
location="/images/" /代表应用根路径,/下的文件

webapp
–html
–images
–js

在这里插入图片描述

一条配置处理所有的静态资源(必会)

在webapp目录下开一个static包,将以上的静态资源包都放入static目录下
<mvc:resources mapping="/static/**" location="/static/"/>

webapp
–static
----html
----images
----js

+<mvc:annoation-driven>

二、路径晕晕解决问题

在jsp , html中使用的地址, 都是在前端页面中的地址,都是相对地址

地址分类:

1、绝对地址 ,

带有协议名称的是绝对地址, http://www.baidu.com , ftp://202.122.23.1

2、相对地址

没有协议开头的, 例如 user/some.do , /user/some.do
相对地址不能独立使用,必须有一个参考地址。 通过参考地址+相对地址本身才能指定资源。

3、参考地址

a. 配置Tomcat,/ch06-path,启动tomcat,进入欢迎页面
访问的是: http://localhost:8080/ch06_path/index.jsp
工程路径: http://localhost:8080/ch06_path/
资源: index.jsp

b.接下来在index.jsp中发送user/some.do请求
1) 在你的页面中的,访问地址不加 “/”
① 在首页中发起user/some请求,该请求交给tomcat,tomcat给中央调度器处理,在@Controller中处理请求数据后跳转到show.jsp页面,展示数据

<a href="user/some.do">发起some.do请求</a>

访问地址变为 http://localhost:8080/ch06_path/user/some.do
即访问地址是当前页面的地址(工程路径)+链接的地址(href)
http://localhost:8080/ch06_path/ + user/some.do
那么此时参考地址是当前页面地址(工程路径)。

路径: http://localhost:8080/ch06_path/user/
资源:some.do

②在首页中发起user/some请求,该请求交给tomcat,tomcat给中央调度器处理,在@Controller中处理请求数据后跳转到index,jsp页面,再次点击发起user/some.do请求。
第一次发起请求,访问地址: http://localhost:8080/user/some.do
此时

当前页面的工程地址浏览器默认是http://localhost:8080/user/
资源默认是some.do

当再次发起user/some.do请求时,访问的地址是当前地址+链接的地址
也就是http://localhost:8080/user/user/some.do
错误!!!!
解决方案:
1.加入${pageContext.request.contextPath}
2.加入一个base标签, 是html语言中的标签。 表示当前页面中访问地址的基地址。<base href="http://localhost:8080/ch06_path/">
你的页面中所有 没有“/”开头的地址,都是以base标签中的地址为参考地址
使用base中的地址 + user/some.do 组成访问地址

如何动态获取base?

<%
	String base=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPost()++request.getContextPath()+"/";
%>
<html>
	<head>
		<title>Title</title>
		<base href="<%=basePath%>" />
	</head>
</html>

<%java语句%> 这里的java语句会被Servlet直接翻译到service方法的内部

<%=java变量%> 相当于在service方法内部执行out.write()。
已知在jsp文件中直接编写字符串,相当于直接执行servlet中service方法内部的out.write(),但是如果是java变量的话,就使用标签<%=Java变量%>

2) 在你的页面中的,访问地址加 “/”

<a href="/user/some.do">发起some.do请求</a>

访问的是: http://localhost:8080/ch06_path/index.jsp

路径: http://localhost:8080/ch06_path/
资源: index.jsp

点击 /user/some.do, 访问地址变为 http://localhost:8080/user/some.do
参考地址是 你的服务器地址, 也就是 http://localhost:8080

错误!!!!!
怎么解决呢?
访问的地址应该是服务器地址:服务器端口号+/项目名/+资源路径
解决方案1:
<a href="/ch06/user/some.do">发起user/some.do请求</a>加入项目名/cho6
解决方案2:
当项目名更换时,所有的href的值都需要更换,不符合OCP开闭原则,不可取,我们应该采用EL表达式。
项目名也就是应用根路径采用EL表达式

/项目名等价于
${pageContext.request.contextPath}
<a href="${pageContext.request.contextPath}/user/some.do">发起user/some.do请求</a>`

三、复习jsp基础语法

JSP基础语法总结:

  • JSP中直接编写普通字符串
    • 翻译到service方法的out.write(“这里”)
  • <%%>
    • 翻译到service方法体内部,里面是一条一条的java语句。
  • <%! %>
    • 翻译到service方法之外。
  • <%= %>
    • 翻译到service方法体内部,翻译为:out.print();
  • <%@page contentType=“text/html;charset=UTF-8”%>
    • page指令,通过contentType属性用来设置响应的内容类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值