SpringMVC之web.xml,了解必要配置项-阿里云开发者社区

开发者社区> 沉默王二> 正文

SpringMVC之web.xml,了解必要配置项

简介: SpringMVC之web.xml,了解必要配置项
+关注继续查看

现代Web应用程序广泛使用MVC(model、view、controller)模式,那么SpringMVC就恰好可以轻松帮我们搭建一个Web开发环境。而要搭好开发环境,熟知SpringMVC的三个XML(web.xml、application-context.xml、context-dispatcher.xml)就显得必不可少。而我呢,虽然前前后后左左右右也大见过三次Web框架,但每次都纠结的要了老命,那么痛定思痛,我决定下功夫把三个XML给搞得有条理些。


不过呢,作为一个软件开发的全栈工程师(自黑不是自夸,身为创业团队的负责人,打杂工的角色我就只能勉为其难),对于三个XML的见解只停留在认知的层面,整篇文章的叙述难免有不专业的地方,各位光临的朋友尽管指摘,我将虚心接受。


本篇先来介绍web.xml,了解其中必要的配置项,为以后顺利开发打下坚实基础。


###①、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">
  <display-name>ymeng</display-name>
  
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
    </context-param>
    
    <!-- set character encoding spring -->
    <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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <filter>
        <filter-name>sessionValidate</filter-name>
        <filter-class>
            com.honzh.common.filter.SessionValidateFilter
        </filter-class>
        <init-param>
            <param-name>uri</param-name>
            <param-value>/deal/</param-value>
        </init-param>
        <init-param>
            <param-name>loginUrl</param-name>
            <param-value>/login</param-value>
        </init-param>
        <init-param>
            <param-name>backToUrl</param-name>
            <param-value>/</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <!-- 把需要进行check登陆的请求放到此处 -->
    <filter-mapping>
        <filter-name>sessionValidate</filter-name>
        <url-pattern>/deal/*</url-pattern>
    </filter-mapping>
    
    <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-dispatcher.xml</param-value>
        </init-param>
        <!-- 使系统在启动时装在servlet而不是第一个servlet被访问 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>web-app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!-- 配置session过期时间120分钟 -->
    <session-config>  
        <session-timeout>120</session-timeout>  
    </session-config>
    
    <error-page>
        <error-code>404</error-code>
        <location>/404.jsp</location>
    </error-page>
</web-app>


###②、重点内容介绍

####1、contextConfigLocation


<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>


指定web项目从项目的src路径下加载application-context.xml,这是springMVC所必不可少的配置项,classpath前缀指定xml的路径在src下,这是我所喜爱的方式。

通过ContextLoaderListener自动装配ApplicationContext的配置信息,这里可以参照Spring中的ContextLoaderListener使用。

####2、characterEncodingFilter

关于字符集过滤器,就无需多言,从xml配置上就可以看得出来,其作用就是为了防止乱码,当然最开始在接触struts2的时候,被中文乱码困扰的心里都有了挫败感,但springMVC轻轻松松搞定了这个烦恼。


配置的方式基本固定如下:

<!-- set character encoding spring -->
<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>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


当然了,如果你还有更多的兴趣,可以参照

Spring字符集过滤器CharacterEncodingFilter


####3、sessionValidate

sessionValidate的过滤器对于我的项目来说就很关键了,其主要作用就是为了在页面跳转时检查session有没有失效(包含超时、未登陆),然后呢,如果验证失败,可以跳转到首页登陆,登陆完成呢,又可以回到原始的页面(如下图所示,点击我的资源,系统发现我没有登陆,那么弹出登陆窗口,当我登陆完成后,显示我的资源页面)。

image.png



<filter>
    <filter-name>sessionValidate</filter-name>
    <filter-class>
  com.honzh.common.filter.SessionValidateFilter
    </filter-class>
    <init-param>
  <param-name>uri</param-name>
  <param-value>/deal/</param-value>
    </init-param>
    <init-param>
  <param-name>loginUrl</param-name>
  <param-value>/login</param-value>
    </init-param>
    <init-param>
  <param-name>backToUrl</param-name>
  <param-value>/</param-value>
    </init-param>
    <init-param>
  <param-name>debug</param-name>
  <param-value>true</param-value>
    </init-param>
</filter>
<!-- 把需要进行check登陆的请求放到此处 -->
<filter-mapping>
    <filter-name>sessionValidate</filter-name>
    <url-pattern>/deal/*</url-pattern>
</filter-mapping>

####4、DispatcherServlet

DispatcherServlet是springMVC自带的一个开箱即用的调度员,这个调度员就和context-dispatcher.xml联系起来了。

<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-dispatcher.xml</param-value>
    </init-param>
    <!-- 使系统在启动时装在servlet而不是第一个servlet被访问 -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>web-app</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

load-on-startup参数,按照《SpringMVC学习指南》所说的意思是:“如果它存在,则它将在应用程序启动时状态servlet并调用它的init方法,若不存在,则在该servlet的第一个请求时被加载”。这里我就不多做深究了,说白了,就是我还深究不到什么玩意。

url-pattern参数,这里我使用了"/"。按照《Spring实战》所说,url-pattern的匹配模式通常有“*.html”、“/*”等等,而他们各有各的弊端,而“/”模式声明它会作为默认的servlet并且会处理所有的请求,包括静态资源(关于静态资源,在稍候讲context-dispatcher.xml会详细说明)。

*.html 只能响应html格式的请求。

/*模式表示没有映射特定类型的响应,这会在处理图片或者样式css时带来不必要的麻烦。

####5、session-timeout


<!-- 配置session过期时间120分钟 -->

<session-config>  

 <session-timeout>120</session-timeout>  

</session-config>


session-timeout就不做详细说明了,很直白,多说无益。有兴趣的话可以继续了解Java Web开发Session超时设置。


####6、404


<error-page>

<error-code>404</error-code>

<location>/404.jsp</location>

</error-page>


通过该配置,当服务端出现404错误时就会跳转到404.jsp页面。


那么首先,我们来看一下普通的404页面写法。


<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%><%@ include file="/components/common/taglib.jsp"%>

<!DOCTYPE HTML>

<html>

<head>

<meta http-equiv='Refresh' content='3;URL=${ctx}/'>

<title>404 错误</title>

</head>


<body>

<p>此页面正在开发中...</p>

<p>系统将在 <span style="color:red;">3</span> 秒后跳转到首页,或者直接点击 <a href="javascript:history.back()">返回</a></p>

</body>

</html>



当出现404时,首先提示用户页面访问不到,然后手动跳转到首页或者3秒后跳转到首页。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
案例_点菜| 学习笔记
快速学习案例_点菜
13 0
我为什么要放弃 RESTful,选择拥抱 GraphQL
REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广大Web开发者的喜爱。
6 0
这样统计代码执行耗时,才足够优雅!
代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时。 可能也是受限于 Java 的语言特性,总觉得代码写起来不够优雅,大量的耗时统计代码,干扰了业务逻辑。特别是开发功能的时候,有个感受就是刚刚开发完代码很清爽优雅,结果加了一大堆辅助代码后,整个代码就变得臃肿了,自己看着都挺难受。因此总想着能不能把这块写的更优雅一点,今天本文就尝试探讨下“代码耗时统计”这一块。
6 0
Google 开源的依赖注入库,比 Spring 更小更快!
Guice是Google开源的一个依赖注入类库,相比于Spring IoC来说更小更快。Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式。
9 0
Slf4j 包老冲突,每次排查半天,是什么原因?怎么解决?
一、前言 在进行 Java 开发时,通常我们会选择 Slf4j 作为日志门面,但日志实现却不尽相同。如果系统运行中同时存在多个日志实现,就会出现类似下图的 Warning。
7 0
说好今年交付的这些智能车,谁比较容易跳票?
说好今年交付的这些智能车,谁比较容易跳票?
8 0
听说 Spring AOP 有坑?那就来踩一踩
前言 前几日,有朋友分享了这样一个案例: 原来的项目一直都正常运行,突然
5 0
我为什么要放弃 RESTful,选择拥抱 GraphQL
REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广大Web开发者的喜爱。
8 0
【保姆级教程】Spring Boot 单元测试
【保姆级教程】Spring Boot 单元测试 一、 单元测试的概念 概念: \1. 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在Java中单元测试的最小单元是类。
6 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载