【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
【Java】Spring Web MVC注意事项的更多相关文章
- 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架构模式,可 ...
- 菜鸟学习Spring Web MVC之二
有文章从结构上详细讲解了Spring Web MVC,我个菜鸟就不引据来讲了.说说强悍的XP环境如何配置运行环境~~ 最后我配好的环境Tomcat.Spring Tool Suites.Maven目前 ...
- Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
之前有一篇<5分钟构建spring web mvc REST风格HelloWorld>介绍了普通方式开发spring web mvc web service.接下来看看使用spring b ...
- [转]Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
Spring Boot——2分钟构建spring web mvc REST风格HelloWorld http://projects.spring.io/spring-boot/ http://spri ...
- Spring Web MVC(一)
[toc] 概述 Spring的web框架围绕DispatcherServlet设计. DispatcherServlet的作用是将请求分发到不同的处理器. Spring的web框架包括可配置的处理器 ...
- Spring Web MVC(三)之注解
[toc] spring web mvc 基于注解的优化 我写的注解是按照spring web的部件分类写的,这样的话比较方便查看,大家感觉有用的话可以分享个别人,希望对对更多的人有帮助.毕竟零基础开 ...
- 菜鸟学习Spring Web MVC之一
---恢复内容开始--- 当当当!!沉寂两日,学习Spring Web MVC去了.吐槽:近日跟同行探讨了下,前端攻城师,左肩担着设计师绘图,右肩担着JAVA代码?!我虽设计过UI,但这只算是PS技巧 ...
- 初试 spring web mvc
作为一名code需要了解更多的知识,编程方面的东西太多了,是个逐渐积累的过程.最近学习一下spring web mvc,写下我个人的一些经验. 1.准备jar包.spring mvc 已经到了版本4, ...
- 12.Spring——Web MVC框架
1.Spring Web MVC 框架 2.Spring MVC Hello World 例子 1.Spring Web MVC 框架 Spring web MVC 框架提供了模型-视 ...
随机推荐
- HDU3001 Travelling
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 【原创】datalist repeater 控件的行鼠标单击 以及 滑过特效
原文发布时间为:2009-05-06 -- 来源于本人的百度文章 [由搬家工具导入] 调用方法如:<tr id="<%# Container.ItemIndex+1 %>& ...
- hdu 1848 Fibonacci again and again 组合游戏 SG函数
题目链接 题意 三堆石子,分别为\(m,n,p\)个,两人依次取石子,每次只能在一堆当中取,并且取的个数只能是斐波那契数.最后没石子可取的人为负.问先手会赢还是会输? 思路 直接按定义计算\(SG\) ...
- PE笔记之NT头PE文件头
typedef struct _IMAGE_FILE_HEADER { WORD Machine; //014C-IMAGE_FILE ...
- boost::thread编程-线程中断(转)
原文转自 http://blog.csdn.net/anda0109/article/details/41943691 thread的成员函数interrupt()允许正在执行的线程被中断,被中断的线 ...
- [wxPython学习]wx.CallAfter和wx.FutureCall
[wxPython学习]wx.CallAfter和wx.FutureCall 今天才学到的两个wxPython中的函数:wx.CallAfter和wx.FutureCall.这是两个无关的函数,但又多 ...
- 小型web项目的模块化(转)
背景 目前团队中新的 Web 项目基本都采用了 Vue 或 React ,加上 RN,这些都属于比较重量级的框架,然而对于小型 Web 页面,又显得过大.早期的一些项目则使用了较原始的 HTML ...
- hdu 1595(最短路变形好题)
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- IE/FF/Chrome下document.documentElement和document.body的 scrollHeight/scrollTop/clientHeight 以及判断滚动条是否已拉到页面最底部
DTD已声明 IE document.documentElement.scrollHeight 浏览器所有内容高度 ,document.body.scrollHeight 浏览器所有内容高度 docu ...
- 修正MYSQL错误数据的一个存储过程
-- 添加索引 CREATE INDEX idx_STRUCTURE_ID ON t_resource_info(STRUCTURE_ID); DROP PROCEDURE IF EXISTS `P_ ...