【Java】Spring Web MVC注意事项

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

 

原文地址:https://www.cnblogs.com/zhchngzng/p/4523208.html