本文内容可能是书上没有的,至少是《Java Web整合开发实践》这本书上没有的。这是初学Spring的笔者走过的弯路,谨记以自勉。

这两天学习Spring WebMVC,照着书依葫芦画瓢写了一个demo,却运行不起来,现象如下:

1  服务器启动后,访问页面一直返回404错误;

2  检查服务器日志,日志里完全没有spring的信息

几经周折之后终于修复好,现在将重要的注意事项以及“不这样做会怎么样”(后果)罗列如下以自勉:

1 web.xml的位置

这一点对于做web的人应该都是清楚的,写在这里强调一下,实则是为了引出下文。web.xml必须放在/WEB-INF/目录下。/WEB-INF/目录下的东西是客户端无法直接访问的,除非在web.xml进行了一些配置。起初写在这个目录下,却一直不行,将web.xml移除后,WebContent下的index.jsp方可正常显示。后来发现是因为web.xml有“一点点”问题,真的是一点点问题。所以,要自信地认定web.xml就是放在WEB-INF目录下,如果出了问题,那一定是其他毛病,比如web.xml写错了。

2 web.xml开头的正确写法

我新建一个xml文件,然后开始写关键内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<welcome-file-list>...</welcome-file-list> <servlet>
....
</servlet>
</web-app>

写完后xml文件的开头出现了一个讨厌的黄色感叹号。我是个有处女座属性的天秤座,自然对那个讨厌的黄色感叹号难以忍受。查到有人说加上这一行就好了:

<!--
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd">
-->

是的!我已经把它注释了。因为我的“拿来主义”和这一行错误的DOCTYPE,服务器报了这样一个错:

严重:Parse error in application web.xml file at /Users/chng/..../... java.io.FileNotFoundException ...

这里虽然写的是FileNotFoundException,但实际上是因为DOCTYPE写错了,导致XML完全不能解析。(对Java神经质的Exception系统也是醉了。)

而给我出这个馊主意的人,估计和我一样不理解XML文件这个DOCTYPE的含义。Microsoft的文档里说:

--

DOCTYPE 声明为文档提供一个空间,通过引用外部文件、通过直接声明或通过这两种方式来标识其根元素和文档类型定义 (DTD)。

DOCTYPE 声明可以包含下列内容:

  • 文档或根元素的名称。

    如果使用 DOCTYPE 声明,此内容是必选项。

  • 可以用于验证文档结构的 DTD 系统标识符和公共标识符。

    如果使用公共标识符,必须同时提供系统标识符。

  • DTD 声明的内部子集。

    内部子集出现在方括号 ([ ]) 之间。

如果文档要在验证环境中进行处理,DOCTYPE 声明是必选项。 要生效,DOCTYPE 声明必须标识与文档的文档结构对应的 DTD。 非验证分析器将接受没有 DOCTYPE 声明的文档。

--

所以,这个DOCTYPE要么写对,要么不写,反正就一个黄色感叹号的事而已。

3  把jar包复制到WebContent/WEB-INF/lib下。对,仅仅复制过去就可以了。对,一定要复制,即使这个project的Library都配置好了。

作为C++程序员,我难以习惯Java这种动则把XXX工程中的lib目录下所有jar包复制到“你的自定义目录下”这种行为,这看起来是某种设计上的缺陷,就像是指导程序员“写程序之前,请插上内存条”一样。但是,把jar当成动态链接库看待的话,这一行为就容易接受多了,动态链接库寓示着组件级别的高度可重用性。

经过前面几步,已经写好一个正确的web.xml文件,这时启动服务器,依旧404。而在服务器的启动日志里,终于出现了springframework相关的信息。检查发现。服务器启动过程中报Exception 了(为什么Exception不能正常点?为什么不告诉我是ClassNotFoundException呢!为什么我们总是要忍受那些泛泛的废话呢!)

 Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
at XXXXX
at XXXXX

因为Eclipse把WebContent里面的东西交给Tomcat 之后,Tomcat还要根据用户的请求来执行servlet,最终执行的是一堆class。而那些class是依赖于库文件jar包的。而jar包在Java 中是相当于 动态链接库 的存在。注意,是动态链接库,而不是静态链接库这样,在编译期间就链接到Java程序里了。NONONO。

把spring-lib和commonloggings-lib之类程序依赖的jar包,统统拷贝到lib目录,服务器终于正常启动。

4  @RequestMapping("/index")。在这个Annountation里,value的字符串是要加上斜杆的。

服务器启动之后,敲入URL,继续404。发现是@RequestMapping的value中没有写斜杆。嗯,spring中可以配置URL的地方很多,有@RequestMapping这个标记,有web.xml里配置servlet映射的<url-pattern>,还有DispatcherServlet的配置中设置bean的配置文件路径的<param-value>。许多地方是支持简单的正则表达式(最常用的是通配符*)的。但是,Spring如何匹配这些正则表达式,有待在后面的日子里仔细推敲。

最后附上久经折腾才做好的那个Spring WebMVC Demo工程:http://github.com/chng/JavaDemoSpringWebMVC

To be continued

【Java】Spring Web MVC注意事项的更多相关文章

  1. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中的spring web MVC模块

    spring framework中的spring web MVC模块 1.概述 spring web mvc是spring框架中的一个模块 spring web mvc实现了web的MVC架构模式,可 ...

  2. 菜鸟学习Spring Web MVC之二

    有文章从结构上详细讲解了Spring Web MVC,我个菜鸟就不引据来讲了.说说强悍的XP环境如何配置运行环境~~ 最后我配好的环境Tomcat.Spring Tool Suites.Maven目前 ...

  3. Spring Boot——2分钟构建spring web mvc REST风格HelloWorld

    之前有一篇<5分钟构建spring web mvc REST风格HelloWorld>介绍了普通方式开发spring web mvc web service.接下来看看使用spring b ...

  4. [转]Spring Boot——2分钟构建spring web mvc REST风格HelloWorld

    Spring Boot——2分钟构建spring web mvc REST风格HelloWorld http://projects.spring.io/spring-boot/ http://spri ...

  5. Spring Web MVC(一)

    [toc] 概述 Spring的web框架围绕DispatcherServlet设计. DispatcherServlet的作用是将请求分发到不同的处理器. Spring的web框架包括可配置的处理器 ...

  6. Spring Web MVC(三)之注解

    [toc] spring web mvc 基于注解的优化 我写的注解是按照spring web的部件分类写的,这样的话比较方便查看,大家感觉有用的话可以分享个别人,希望对对更多的人有帮助.毕竟零基础开 ...

  7. 菜鸟学习Spring Web MVC之一

    ---恢复内容开始--- 当当当!!沉寂两日,学习Spring Web MVC去了.吐槽:近日跟同行探讨了下,前端攻城师,左肩担着设计师绘图,右肩担着JAVA代码?!我虽设计过UI,但这只算是PS技巧 ...

  8. 初试 spring web mvc

    作为一名code需要了解更多的知识,编程方面的东西太多了,是个逐渐积累的过程.最近学习一下spring web mvc,写下我个人的一些经验. 1.准备jar包.spring mvc 已经到了版本4, ...

  9. 12.Spring——Web MVC框架

    1.Spring Web MVC 框架 2.Spring MVC Hello World 例子 1.Spring Web MVC 框架 Spring web         MVC 框架提供了模型-视 ...

随机推荐

  1. 洛谷P1279 字串距离

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...

  2. 【转】SqlCacheDependency的使用 强大的功能

    原文发布时间为:2009-10-25 -- 来源于本人的百度文章 [由搬家工具导入]     最近我在忙于研究负载平衡、并发性容错性等性能优化问题,ASP.NET有太多强大的功能等待学习和挖掘。今天, ...

  3. ASP.NET MVC 1.0 哈哈。。转过来,还没学。。

    原文发布时间为:2009-06-13 -- 来源于本人的百度文章 [由搬家工具导入] ASP.NET MVC 1.0 发布了投递人 itnews 发布于 2009-03-19 00:46 评论(8) ...

  4. Python连接MySQL数据库操作

    一.创建数据库及表 CREATE DATABASE testdb; USE testdb; CREATE TABLE `tb_user` ( `id` INT (11) NOT NULL AUTO_I ...

  5. java通过反射获取私有的构造方法,及反射擦除泛型数据类型约束

    /* * 反射获取私有的构造方法运行 * 不推荐,破坏了程序的安全性,封装性 * 暴力私有 */ public class ReflectDemo4 { public static void main ...

  6. Codeforces Gym100735 I.Yet another A + B-Java大数 (KTU Programming Camp (Day 1) Lithuania, Birˇstonas, August 19, 2015)

    I.Yet another A + B You are given three numbers. Is there a way to replace variables A, B and C with ...

  7. CentOS 7下安装配置FTP

    安装vsftpd yum install -y vsftpd 编辑ftp配置文件 vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO #anonymous_e ...

  8. java值传递和引用传递的理解

    java的基础数据类型有:(byte.short.int.long.float.double.char.boolean)八种 基础数据都是值传递,其他都是引用传递.但是引用传递要特别注意:String ...

  9. ie8 不能加载dll的问题解决

    请问是在打开IE的时候提示无法加载DLL文件吗? 请尝试重置IE: 1. 关闭所有Internet Explorer窗口. 2. 单击开始,点击运行,输入inetcpl.cpl,按回车. 3. 点击高 ...

  10. AMD 的 CommonJS wrapping

    其实本文的标题应该是「为什么我不推荐使用 AMD 的 Simplified CommonJS wrapping」,但太长了不好看,为了美观我只能砍掉一截. 它是什么? 为了复用已有的 CommonJS ...