servlet配置总结

使用servlet也有月余,回想起来磕磕碰碰其实走了不少弯路,现在总结一下,备忘。

开始具体写servlet程序前还需将tomcat的servlet包导入
common\lib\servlet-api.jar
才能编译成功.
tomcat配置
webapps下新建一文件夹放置将project放在的文件既可,里面至少需要一个WEB-INF文件夹,这个文件夹是不可通过网址直接访问的,WEB-INF下面一般建两个文件夹classes和lib,classes放置编译好的class文件,lib则放其他第三方库,比如mysql的jdbc库,WEB-INF下面应有个web.xml配置文件叫做Deployment Descriptor,一个典型的web.xml应该是这样的。
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
   version="2.4">
 <!–设置该project的名称和描述,可在tomcat管理器中看到–>
 <display-name>demo</display-name>
 <description>
    demo project
 </description>

<!– JSPC servlet mappings start –>

   <servlet>
       <!–url上显示的名字–>
       <servlet-name>Content2</servlet-name>
       <!–实际的类名–>
       <servlet-class>Content2Servlet</servlet-class>
   </servlet>
   <servlet>
       <servlet-name>Login</servlet-name>
       <servlet-class>SessionLoginServlet</servlet-class>
       <!–还可给某一servlet附加参数,可用在动态配置中–>
       <init-param>
           <!–参数名–>
           <param-name>dbhost</param-name>
           <!–参数内容–>
           <param-value>db4free.org</param-value>
       </init-param>
   </servlet>
   <!–设置url映射–>
   <servlet-mapping>
       <servlet-name>Login</servlet-name>
       <!–设为/*表示将此servlet设为默认首页–>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
       <servlet-name>Content2</servlet-name>
       <!–这样映射得到的网址就是 主机名/webapps下的文件夹名/content2–>
       <url-pattern>/Content2</url-pattern>
   </servlet-mapping>

<!– JSPC servlet mappings end –>

</web-app>

tomcat里面这里面地址很是有学问,刚学的时候很容易搞混
网页放在工程的根目录下面,编译好的class文件放在WEB-INF/classes下面
而url是这样的.在web.xml中类名和显示名做了定义那么url中用的是定义后的servlet-name
如果没有做servlet-mapping那么执行的路径就是
http://主机名:端口/工程文件夹名/servlet/servlet-name
如果做了servlet-mapping将class映射为/servlet-name,
按照html的习惯写出'/'了就应该在根目录下,结果该是
http://主机名:端口/servlet-name 这样执行,但是servlet中不是这样.而应该是
http://主机名:端口/工程文件夹名/servlet-name
少了中间的servlet这段.
当然如果是html文件什么写/的话url还是从根开始算的.

弄明白网址后面编译执行就很容易了,但是还有个问题,启动tomcat以后如果你重新编译了servlet文件生成了新的class,但是却不会自动加载修改后重新编译后的class,tomcat中看的还是启动时的class,这个问题很严重,尤其是调试的时候,每次都需要重启tomcat已使它加载新class,这个过程真会让人抓狂,不过还是有让tomcat自动加载新class的方法的.在tomcat的\conf\Catalina\localhost新建一xml文件.文件名同工程文件夹名.内容可参考如下
<Context path="/demo" reloadable="true" docBase="M:\Tomcat 5.5\webapps\demo" workDir="M:\Tomcat 5.5\webapps\demo\work"/>
可将demo替换实际工程文件夹名既可.使用这个context设置还有一个方便,就是可以不用把程序放在tomcat的文件夹中。将docBase和workdir改成实际在硬盘上的位置就可以了。实际运用在也是很方便的。

在servlet中读写一个文件,比如写File f=new File("dbconfig.xml");那么应该把这个文件放哪呢?
这个问题还困惑我一阵,先是手工试了一下,放在class文件夹,WEB-INF文件夹,工程根目录,webapps根目录,却都不对,写行程序输出路径才知道应该放在tomcat的根目录下面,但是把文件放在工程外面始终不是好选择,也不便于程序的移动移植,倘若程序在tomcat的webapps里面这个好办,用相对路径就能搞定,如果我们用了context配置,工程不在tomcat里面呢?能否得到路径呢?其实是可以的。
getServletContext().getRealPath("/")返回一个String。里面就是docBase的实际路径,这样就解决这个路径问题。所以读取工程根目录下面的dbconfig.xml文件就应该是
File f=new File(getServletContext().getRealPath("/")+"dbconfig.xml");

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据