springmvc第十二个练习(静态资源的两种访问方式)

web.xml文件中的servletMapping的url-pattern配置详解
 
1
*.do
        在没有特殊要求的情况下, SpringMVC 的中央调度器 DispatcherServlet <url-pattern/> 常使用后辍匹配方式,如写为 *.do 或者 *.action, *.mvc 等。
2 /
        可以写为 / ,因为 DispatcherServlet 会将向静态资源的获取请求,例如 .css .js .jpg .png 等资源的获取请求,当作是一个普通的 Controller 请求。中央调度器会调用处理器映射器为 其查找相应的处理器。当然也是找不到的,所以在这种情况下,所有的静态资源获取请求也 均会报 404 错误。
需求:在 index.jsp 页面中存在一个访问图片的链接。该项目用于演示将 <url-pattern/> 写为 *.do可以访问到该图片,而写为 / ,则无法访问。
项目结构

 1.index.jsp页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body>

<p>处理器方法返回String,表示视图名称</p>
<form action="some.do" method="post">
    姓名:<input type="text" name="name"/><br>
    年龄:<input type="text" name="age"/><br>
    <input type="submit" value="提交参数"/>
</form>
<br>
<img src="images/pic2.jpg" alt="我是一个静态资源不能显示=======">

</body>
</html>

2.web.xml,把原来的*.do修改成/

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

<!--
1.声明,注册springmvc核心对象DispatcherServlet
需要在tomcat服务器启动后,创建  DispatcherServlet对象的实例,
因为DispatcherServlet在他的创建过程中,会同时创建springmvc容器对象,
读取springmvc的配置文件时,可以把配置文件都创建好当用户发起请求时就可以直接访问对象


2.servlet初始化会执行init()方法,DispatcherServlet在init()中{
//创建容器,读取配置文件
WebApplicationContext wac=new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,wac);
}
-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!--自定义springmvc读取的配置文件的位置-->
    <init-param>
<!--   springmvc的配置文件的位置属性-->
        <param-name>contextConfigLocation</param-name>
<!--   指定自定义文件的位置-->
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>

<!-- 在tomcat启动后,创建Servlet对象
load-on-startup:表示tomcat启动后创建对象的顺序,它的值是整数,数值越小,tomcat创建对象的时间越早(大于等于0的整数)
-->
    <load-on-startup>1</load-on-startup>

</servlet>
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
<!--
使用框架的时候,url-pattern可以使用两种值
1.使用扩展名的方式,语法 *.xxxx,xxxx是自定义的扩展名,常用的方法 *.do,*.action,*.mvc等等。
2.使用斜杠"/"
-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>


    <!--    注册声明过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--  设置项目中使用的字符编码 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <!-- 强制请求对象(HttpServletRequest)使用 encoding编码的值  -->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <!--强制应答对象(HttpServletResponse)使用encoding编码的值 -->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


</web-app>

3.springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!-- 声明组件扫描器-->
<context:component-scan base-package="com.it.controller"/>


<!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--   前缀:视图文件的路径-->
    <property name="prefix" value="/WEB-INF/view/"/>
    <!--    后缀:视图文件的扩展名-->
    <property name="suffix" value=".jsp"/>
</bean>

<!-- 注解驱动  -->
<mvc:annotation-driven/>



</beans>

4.创建test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        </head>
<body>
test.html是一个静态资源
</body>
</html>

5.MyController类

package com.it.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.it.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

@Controller
public class MyController {

    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(HttpServletRequest request,String name,Integer age){
        ModelAndView mv=new ModelAndView();
        mv.addObject("myName",name);
        mv.addObject("myAge",age);
        mv.setViewName("show");

//        request.getRequestDispatcher("/show.jsp").forward(request,null);

        return mv;
    }


}

运行项目

在index.jsp页面中,图片无法正常显示
保持 <url-pattern/> 的值为 *.do ,扩展名方式,图片会正常显示。
<url-pattern/> 的值修改为 / ,则图片将无法显示。
静态资源访问
          <url-pattern/> 的值并不是说写为 / 后,静态资源就无法访问了。经过一些配置后,该问 题也是可以解决的。
1 ) 使用 <mvc:default-servlet-handler/>
         声 明 了 <mvc:default-servlet-handler /> 后 , springmvc 框 架 会 在 容 器 中 创 建 DefaultServletHttpRequestHandler 处理器对象。它会像一个检查员,对进入 DispatcherServlet URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的 Servlet 处理。一般的服务器都有默认的 Servlet
         在 Tomcat 中,有一个专门用于处理静态资源访问的 Servlet 名叫DefaultServlet。其 <servlet-name/> default 。可以处理各种静态资源访问请求。该 Servlet 注册在 Tomcat 服务 器的 web.xml 中。在 Tomcat 安装目录 /conf/web.xml
只需要在 springmvc.xml 中添加 <mvc:default-servlet-handler/> 标签即可。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!-- 声明组件扫描器-->
<context:component-scan base-package="com.it.controller"/>


<!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--   前缀:视图文件的路径-->
    <property name="prefix" value="/WEB-INF/view/"/>
    <!--    后缀:视图文件的扩展名-->
    <property name="suffix" value=".jsp"/>
</bean>

<!-- 注解驱动  -->
<mvc:annotation-driven/>

<!--  加入后框架会创建控制器对象DefaultServletHttpRequestHandler,
该对象可以把接收的请求转发给tomcat的default这个servlet-->
    <mvc:default-servlet-handler/>

</beans>

运行项目

可以正常接收到静态资源的这些图片和js

2 ) 使用 <mvc:resources/> (掌握)
       在 Spring3.0 版本后, Spring 定义了专门用于处理静态资源访问请求的处理器 ResourceHttpRequestHandler 。并且添加了 <mvc:resources/> 标签,专门用于解决静态资源无 法访问问题。需要在 springmvc 配置文件中添加如下形式的配置

 

location 表示静态资源所在目录。当然, 目录不要使用 /WEB-INF/ 及其子目录
mapping 表 示 对 该 资 源 的 请 求 ( /images/ 开 始 的 请 求 , 如 /image/beauty.jpg ,
/images/car.png )。注意,后面是两个星号 **
修改springmvc.xml文件,其他文件保持不变,为区分第一种方式,第二种方式在首页更换图片
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!-- 声明组件扫描器-->
<context:component-scan base-package="com.it.controller"/>


<!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--   前缀:视图文件的路径-->
    <property name="prefix" value="/WEB-INF/view/"/>
    <!--    后缀:视图文件的扩展名-->
    <property name="suffix" value=".jsp"/>
</bean>

<!-- 注解驱动  -->
<mvc:annotation-driven/>

<!--  第一种处理静态资源的方式:
加入后框架会创建控制器对象DefaultServletHttpRequestHandler,
该对象可以把接收的请求转发给tomcat的default这个servlet-->
<!--    <mvc:default-servlet-handler/>-->

<!--  第二种处理静态资源的方式
mvc:resources加入框架后会创建ResourceHttpRequestHandler这个处理器对象
让这个对象处理静态资源的访问,不依赖于tomcat服务器
mapping:访问静态资源的url地址,使用通配符**,可以表示images文件下的任意目录级别的图片
location:静态资源在你的项目中的目录的位置
-->
<mvc:resources mapping="/images/**" location="/images/"/>
    <mvc:resources mapping="/html/**" location="/html/"/>
    <mvc:resources mapping="/js/**" location="/js/"/>

</beans>

运行效果

3) 声明注解驱动 

解决动态资源和静态资源冲突的问题,在 springmvc 配置文件加入:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一道光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值