WebXml文件与SpringMVC的联系

无论采用何种框架来进行Java Web的开发,只要是Web项目必须在WEB-INF下有web.xml,这是java规范。 当然,我们最早接触到Java Web容器通常是tomcat,但这并不意味着web.xml是属于Tomcat的,同样,Servlet本身也不属于Tomcat,它与JSP等是Java Web的基础规范。而Servlet的运行需要有Servlet容器的支持,常见的容器有Tomcat、Jetty、JBoss等。

对于一个web.xml文件,比较重要的节点有context-param、listener、filter以及servlet:

<!-- context-param元素声明应用范围内的初始化参数 -->
<context-param></context-param>
<!-- filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。 -->
<filter></filter>
<!-- filter-mapping 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。 -->
<filter-mapping></filter-mapping>
<!-- listener 对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。 -->
<listener></listener>
<!-- servlet 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。 -->
<servlet></servlet>

其他关于web.xml解释可以参考这里,本文不再详细介绍。本文主要是在整理关于Java Web使用SpringMVC过程的心得。

我们知道一个最基本的Spring MVC项目需要在web.xml中区配置如下信息:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-context.xml</param-value>
</context-param> <listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener> <servlet>
<servlet-name>web-app</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:context-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>web-app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

对于这样一份配置,我们不仅要知其然还要知其所以然。这样不仅能够加深对Java web以及web.xml的理解,对于以后排错也会有很大的帮助。

回到一个普通的Java Web项目

为什么要这么配置,首先我们要回到web.xml加载顺序介绍。web.xml基础节点的加载顺序是context-param > listener > filter > serlvet。

context-param节点

context-param节点中的键值对首先会被容器读取并存放到ServletContext对象中,这里面的键值对信息被整个web项目共享。

如何读取context-param中的值呢?我们只要获得ServletContext对象,然后再调用它的getInitParameter提供键名来获得方法就可以获得。在哪些地方能获得SerlvetContext对象呢?我们继承HttpServlet的Serlvet中去调用getServletContext就能获取ServletContext对象;这里我首先来编写一个简单Java web项目来读取相关的参数,首先是配置文件:

<?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">
<context-param>
<param-name>test-param</param-name>
<param-value>this is a test-param string</param-value>
</context-param> <servlet>
<servlet-name>simple-web-app</servlet-name>
<servlet-class>
servlet.SimpleServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>simple-web-app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

在这个配置文件中,我只定义了最简单的两个节点context-param与servlet,对于context-param节点,我定义了"test-param" : "this is a test-param string"键值对,然后定义了servlet相关配置(这一部分我认为你已经明白了)。最后,SimpleServlet中的代码如下:

public class SimpleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp); // 将所有的Get请求转移到Post请求方法
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
String param = context.getInitParameter("test-param");
resp.getWriter().print(param);
}
}

在doPost方法中,我们按照前面说的方式获取ServletContext对象,然后再通过getInitParameter方法获取"test-param"键对应的字符串,然后输出到网页上:

listener节点

web.xml第二步加载就是listener节点,该节点的形式如下:

<listener>
<listener-class>
listener.MyInitListener
</listener-class>
</listener>

而MyInitListener类需要实现ServletContextListener接口,并重写其中的方法:

public class MyInitListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println(new Date() + " contextInitialized....");
} @Override
public void contextDestroyed(ServletContextEvent sce) { }
}

当web.xml在加载监听器节点之后,会创建我们定义的对应的MyInitListener对象,并且会执行其中的contextInitialized方法,在整个项目关闭的时候会执行contextDestroyed方法。上面我们编写了contextInitialized方法中的内容,然后启动项目,会在控制台看到输出:

Sun Aug 26 13:02:19 CST 2018 contextInitialized....

当然,我们也可以ServletContextEvent.getServletContext().getInitParam("xxx")来获取context-param了:

@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println(new Date() + "contextInitialized....");
System.out.println(sce.getServletContext().getInitParameter("test-param") + " in contextInitialized()");
// OUTPUT
// Sun Aug 26 13:19:16 CST 2018 contextInitialized....
// this is a test-param string in contextInitialized()
}

回到Spring MVC配置

回到Spring。为什么想要使用spring mvc,需要设置param-name=contextConfigurationLocation,param-value=xxxx-spring(非mvc部分配置).xml;然后设置listener节点中监听器类是org.springframework.web.context.ContextLoaderListener。其实就比较好理解了,因为在这一步通过首先将spring基础上下文的配置文件通过ContextLoaderListener监听器去加载,然后读取出基础spring IOC以及AOP部分配置,将一些基础组件加载到spring的bean容器中,在接下来的无论是filter节点中的对象还是serlvet节点中的对象需要依赖注入的部分,都已经通过加载context-param中对于spring基础配置文件定位加载好了,后续spring相关的bean的创建以及注入等都交给了spring来进行管理。

同时在加载serlvet时候,因为所有的请求都交给了DispatcherSevlet,且指定了mvc.xml配置文件的路径参数,所以,我们在这个mvc.xml中去设置静态资源的处理规则以及试图和控制器等处理规则。

WebXml文件与SpringMVC的联系的更多相关文章

  1. 无xml文件的springMVC

    使用springMVC我们一般都会在web.xml中配置一个dispatcher,现在我们基于用java代码的方式来使用springMVC import org.springframework.con ...

  2. 使用postman模拟上传文件到springMVC的坑:the request was rejected because no multipart boundary was found

    参考该文解决问题:http://blog.csdn.net/sanjay_f/article/details/47407063 报错 threw exception [Request processi ...

  3. springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置

    前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...

  4. 关于SpringMVC的文件上传

    关于文件的上传,之前写过2篇文章,基于Struts2框架,下面给出文章链接: <关于Struts2的文件上传>:http://www.cnblogs.com/lichenwei/p/392 ...

  5. mybatis 热部署xml文件(spring boot和springmvc两种方式)

    参考:http://thinkgem.iteye.com/blog/2304557 步骤:1.创建两个java类 (1)MapperRefresh.java   :用于刷新mapper (2)SqlS ...

  6. n文件的上传和下载,struts2和springmvc

    首先,struts2的上传下载的配置 因为struts2是配置的上传的拦截器,很简单的步揍就可以上传, 首先是配置struts的action映射 <!-- 4. 修改上传文件的最大大小为30M ...

  7. SpringMVC ajax技术无刷新文件上传下载删除示例

    参考 Spring MVC中上传文件实例 SpringMVC结合ajaxfileupload.js实现ajax无刷新文件上传 Spring MVC 文件上传下载 (FileOperateUtil.ja ...

  8. SpringMVC+ajax文件上传实例教程

    原文地址:https://blog.csdn.net/weixin_41092717/article/details/81080152 文件上传文件上传是项目开发中最常见的功能.为了能上传文件,必须将 ...

  9. 6.学习springmvc的文件上传

    一.文件上传前提与原理分析 1.文件上传必要前提: 2.文件上传原理分析: 3.需要引入的jar包: 二.传统方式文件上传程序 1.pom.xml <dependency> <gro ...

随机推荐

  1. MediaWiki 语法简介

    本文尚在完善中... 图片 图片官方教程 图文并茂的内容读起来总是更加舒服,让我们在wiki里引入图片. 内部图片 上传图片 点击右侧上传文件,上传文件后会获得文件名 编辑图片 文件上传后在编辑框,如 ...

  2. Workflow Core + asp.net core 5.0 实现简单审批工作流

    我们知道企业业务系统到处都可以审批工作流的,但也很少有像OA系统一样复杂多级多条件的审批工作流需要设计,所以我们需要一个轻量级的容易上手的workflow框架,通过GitHub,我发现danielge ...

  3. 小程序跨页面传递data数据的三种方法

    Q:小程序怎么把页面data里的数据传到另外的页面? 或者小程序怎么吧表单里的数据传到另外的页面?A:1.可以使用url传递数据. 例如在A页面中传递数据,需要注意的是,wx.switchTab中的u ...

  4. Vue初体验(一)

    每个 Vue 应用都需要通过实例化 Vue 来实现. 语法格式如下: var vm = new Vue({ // 选项 }) 接下来让我们通过实例来看下 Vue 构造器中需要哪些内容: 可以看到在 V ...

  5. html调用swf的语句

    <div style="width: 1000px; height: 202px; margin-left: auto; margin-right: auto"> &l ...

  6. inotify与rsync实现实时同步记录文档

    目录 安装 配置 参考链接 安装 安装rsync yum -y install rsync 安装inotify-tools 这是一个实时监听文件变换的工具 wget -O /etc/yum.repos ...

  7. 【详细、开箱即用】.NET企业微信回调配置(数据回调URL和指令回调URL验证)

    前言: 前段时间因为公司业务需求,需要将微信小程序与企业微信对接通,也就是把小程序绑定到对应的企业微信账号下,在该企业微信的用户可以将该小程序绑定到工作台中,然后可以在工作台中打开该小程序并授权.不过 ...

  8. 学习笔记之IdentityServer4(一)

    快速入门IdentityServer4 概述 将 IdentityServer 添加到 ASP.NET Core 应用程序 配置 IdentityServer 为各种客户发行代币 保护 Web 应用程 ...

  9. HTML一小时入门,半天掌握

    还没有写完,后续持续更新 首先来熟悉一下html的基本结构 <!DOCTYPE HTML> <html> <head> <meta charset=" ...

  10. 20210714 noip15

    考前 mtr 中午拿着笔记本改题(Orz),一点多发现 13.50 有比赛(截止 12 点都没放出来),赶紧睡.13.40 到了学校,巨瞌睡,洗了把脸到机房发现推迟到 14.30 了,wcnm 趴在桌 ...