之前尝试过手动在tomcat下部署简单的只含有HelloServlet的动态web项目。配置有三种方法:
1.整个项目放在tomcat的webapps下。
2.修改sever.xml,添加 <Context docBase="绝对路径" path="/" reloadable="true">
path:浏览器访问时的路径名,设成/可以直接访问
http://localhost:8080/hello
3.在Catalina文件夹中创建aaa.xml,添加 <Context docBase="绝对路径" reloadable="true" >
context的内容一定要注意注意再注意,后面有例子。
在配置了项目的web.xml文件和tomcat的Catalina文件夹中aaa.xml后。
可以实现通过访问http://localhost:8080/aaa/hello而运行HelloServlet,并输出Html页面。
访问http://localhost:8080/aaa/addHero.html可以访问project下,与WEB-INF平级的html和jsp。不要把html和jsp放在WEB-INF里,因为这个文件夹是受保护的,无法直接访问。
继续学习,在eclipse里创建动态web项目,通过eclipse里配置的tomcat,运行jsp和html都能成功。但是手动运行tomcat,并试图访问eclipse动态项目WEB-INF下的hello.html和hello.jsp都失败了,只有通过xml运行的HelloServlet能成功。但是把项目移动到tomcat的webapps又都能正常访问,这是为什么呢?
总结原因:其实tomcat没那么复杂,能在eclipse和webapps里运行说明文件本身没问题,就是路径错了。两个低级错误:
1.文件绝对路径错误,检查你的docbase,不要访问不存在文件的路径。如我的文件路径是/Users/yuqian/Eclipse-EE/d/web/addHero.html,绝对路径应为/Users/yuqian/Eclipse-EE/d/web/,但我写成了/Users/yuqian/Eclipse-ee/d/web/,访问了根本不存在的路径。自然http://localhost:8080/aaa/addHero.html 访问会失败。根本就不存在嘛。
2.检查context的拼写,由于我之前尝试的时候复制了tomcat里server的context,而server的context是这样的<Context docBase="j2ee" path="/j2ee" reloadable="true" source="org.eclipse.jst.jee.server:j2ee"/>
当我把context的docbase改为绝对路径,path删除。之后 由于source还没删除,导致不能访问。并且最后的>前面的/也一定要删除掉。否则访问失败。
虽然花费了很多时间,但是钻研tomcat源码也让我受益良多。无论是win还是os,放在websapp下或者使用xml,方法总是相通的,没有能访问servlet却无法访问html的,能在eclipse里手动tomcat却无法启动的道理。出现问题先自己找原因,多半就是自己拼写错了。
问题定位也很重要,早想通是context的问题,就会省出很多到处撒网排错的时间。