本文内容可能是书上没有的,至少是《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. HDU3001 Travelling

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  2. 【原创】datalist repeater 控件的行鼠标单击 以及 滑过特效

    原文发布时间为:2009-05-06 -- 来源于本人的百度文章 [由搬家工具导入] 调用方法如:<tr id="<%# Container.ItemIndex+1 %>& ...

  3. hdu 1848 Fibonacci again and again 组合游戏 SG函数

    题目链接 题意 三堆石子,分别为\(m,n,p\)个,两人依次取石子,每次只能在一堆当中取,并且取的个数只能是斐波那契数.最后没石子可取的人为负.问先手会赢还是会输? 思路 直接按定义计算\(SG\) ...

  4. PE笔记之NT头PE文件头

    typedef struct _IMAGE_FILE_HEADER {       WORD    Machine;                         //014C-IMAGE_FILE ...

  5. boost::thread编程-线程中断(转)

    原文转自 http://blog.csdn.net/anda0109/article/details/41943691 thread的成员函数interrupt()允许正在执行的线程被中断,被中断的线 ...

  6. [wxPython学习]wx.CallAfter和wx.FutureCall

    [wxPython学习]wx.CallAfter和wx.FutureCall 今天才学到的两个wxPython中的函数:wx.CallAfter和wx.FutureCall.这是两个无关的函数,但又多 ...

  7. 小型web项目的模块化(转)

    背景   目前团队中新的 Web 项目基本都采用了 Vue 或 React ,加上 RN,这些都属于比较重量级的框架,然而对于小型 Web 页面,又显得过大.早期的一些项目则使用了较原始的 HTML ...

  8. hdu 1595(最短路变形好题)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  9. IE/FF/Chrome下document.documentElement和document.body的 scrollHeight/scrollTop/clientHeight 以及判断滚动条是否已拉到页面最底部

    DTD已声明 IE document.documentElement.scrollHeight 浏览器所有内容高度 ,document.body.scrollHeight 浏览器所有内容高度 docu ...

  10. 修正MYSQL错误数据的一个存储过程

    -- 添加索引 CREATE INDEX idx_STRUCTURE_ID ON t_resource_info(STRUCTURE_ID); DROP PROCEDURE IF EXISTS `P_ ...