【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 框架提供了模型-视 ...
随机推荐
- 【HDOJ5527】Too Rich(贪心,构造)
题意:给定10种面额的货币和它们的数量上限,问构造出恰好总额为P的最小张数,无解输出-1 T=2e4,p<=1e9,c[i]<=1e5 思路:From https://blog.csdn. ...
- js scrollTop, 滚动条操作
设置页面加载时滚动条自动滚到底的方法: jQuery: 复制代码 代码如下: $(function(){ var h = $(document).height()-$(window).height() ...
- 使用git快捷方便的保存代码
大家都在使用git保存和备份代码,下面我们就来学习下吧. 一.本地安装和配置git 1.安装git pacman -S git //如果没有问题的话就可以安装成功了 2.验证 git --versio ...
- 分享C#识别图片上的数字
通过Emgu实现对图片上的数字进行识别.前期步骤:1.下载Emgu安装文件,我的版本是2.4.2.1777.3.0版本则实现对中文的支持.2.安装后需填写环境变量,环境变量Path值后加入Emgu安装 ...
- asp.net内置对象 Response对象使用介绍
Response对象是HttpRespone类的一个实例.该类主要是封装来自ASP.NET操作的HTTP相应信息.Response对象将数据作为请求的结果从服务器发送到客户浏览器中,并提供有关响应的消 ...
- hdu 2654(欧拉函数)
Become A Hero Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 在Android 7.0以上PopupWindow.showAsDropDown()不起作用问题
最近优化界面,调用PopupWindow.showAsDropDown()发现,窗口并没有在控件下方显示. 有网友说是7.0以上系统的问题,可以自定义PopupWindow,重写showAsDropD ...
- Shell 括号辨识(转http://blog.csdn.net/taiyang1987912/article/details/39551385)
一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有 ...
- TCP/IP握手协议
转自:http://www.js123.net/t/n/n/2013/4/28/n_272.shtml 这篇介绍的也很棒:http://www.cnblogs.com/rootq/articles/1 ...
- Longest Valid Parentheses - LeetCode
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...