配置好 jsp 服务器后, 如果网站程序使用到 Servlet ,就要进行对 Servlet 部署才能访问,
事实上 servlet 是用的很广泛的,关于 servlet 的一些资料,自己可以上网看。
首先我们会编写一个 servlet 来作为测试。
先看看我的 tomcat 的路径 /usr/local/tomcat/
介绍一下我的环境版本吧,CentOS 5.4 apache2.2.11 tomcat6.0.18
webapps目录下,创建一个我的工作目录 myServlets
# mkdir myServlets
跟着在myServlets下创建
WEB-INF目录,在WEB-INF目录下再创建 classes 目录,
# cd myServlets
# mkdir WEB-INF
# mkdir WEB-INF/classes
这个classes 目录是用来存放你编译好的.class(即是你要运行的servelt文件)
下面编写一个 servlet 文件,
vi HelloWorld.java
下面是内容,复制过去就可以了, HelloWorld.java 放在什么地方无所谓了。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World! - www.17rumen.com</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World! - www.17rumen.com</h1>");
out.println("</body>");
out.println("</html>");
}
}
下面进行编译,也就是把 .java 文件 编译成 .classes 文件。
#javac HelloWorld.java
[root@localhost myServlets]# javac HelloWorld.java
HelloWorld.java:2: package javax.servlet does not exist
import javax.servlet.*;
^
HelloWorld.java:3: package javax.servlet.http does not exist
import javax.servlet.http.*;
^
HelloWorld.java:6: cannot find symbol
public class HelloWorld extends HttpServlet {
^
symbol: class HttpServlet
HelloWorld.java:8: cannot find symbol
public void doGet(HttpServletRequest request, HttpServletResponse response)
^
symbol: class HttpServletRequest
location: class HelloWorld
HelloWorld.java:8: cannot find symbol
public void doGet(HttpServletRequest request, HttpServletResponse response)
^
symbol: class HttpServletResponse
location: class HelloWorld
HelloWorld.java:9: cannot find symbol
throws IOException, ServletException
^
symbol: class ServletException
location: class HelloWorld
6 errors
出现6个错误, 注意:编译 servlet 只有 JDK这些包是不够的,还要加入 servlet 的相关包
才能编译,tomcat 目录下 有相关的包,现在配置一下。
servlet-api.jar 看到 lib 目录下的这个包, 现在加入到 classpath 里面
[root@localhost ~]# vi ~/.bash_profile
添加的内容, 当然前提你要配置 好 TOMCAT_HOME 的路径,如果不会的话可以看以前的视频。
$TOMCAT_HOME/lib/servlet-api.jar
加入后 保存退出, 然后
[root@localhost ~]# source ~/.bash_profile
使刚才的配置 生效
再次进入刚才的目录进行编译
javac HelloWorld.java
编译后,看到 HelloWorld.class 说明编译成功了。
将HelloWorld.class文件都复制到刚才新建好的 webapps/myServlets/WEB-INF/classes目录下
========================
编写 web.xml , web.xml 保存路径 webapps/myServlets/WEB-INF
下面是内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>
保存退出
===============================
修改server.xml文件, 在 conf 目录下
添加, 注意 添加的位置,可以参考我的。
<Context path="/myServlets" docBase="myServlets" debug="0"
reloadable="true" crossContext="true"/>
然后保存,重启 tomcat
[root@localhost bin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.7.0
[root@localhost bin]# ./startup.sh
然后就可以进行测试访问 servlet 了。
http://192.168.138.128:8080/myServlets/HelloWorld
虽然可以正常访问,不过是通过 tomcat 的 8080 端口的,
我们一般做网站服务器 只开放 apache 的 80 端口!
如果你目的为了 学习 servlet ,这样配置已经可以了,呵呵。
===============================================
下面结合 apache ,也就是当apache 接受到 访问serlvet 的时候
自动转发给 tomcat 来处理。
vi /usr/local/apache2/conf/mod_jk.conf
加入
JkMount /myServlets/* worker1
然后保存, 简单说一些这句话意思,当用户访问地址中含有 /myServlets 这个路径的
不管后面是什么东西 全部交给 tomcat 来处理
下面重启 apache
# /usr/local/apache2/bin/apachectl stop
# /usr/local/apache2/bin/apachectl start
然后测试
http://192.168.138.128/myServlets/HelloWorld
好了, 没有问题了, 这说明 可以通过 apache 来访问 servlet 了,
=================================================
下面问题又来了,如果我们的 mySerlvet 不是放在 tomcat 的 webapps 目录下呢 ?
我们尝试移动 刚才的 myServlets 到 apache 目录下, 不再使用 tomcat 的虚拟目录
mv /usr/local/tomcat/webapps/myServlets /usr/local/apache2/htdocs/
然后进行访问一下
HTTP Status 404 -
-----------------------------------------
type Status report
message
description The requested resource () is not available.
----------------------------------------
Apache Tomcat/6.0.18
呵呵,马上出错了, 出现 404 说明找不到网页。
下面来进行一些配置修改
把 server.xml 刚才添加的语句进行修改
<Context path="/myServlets" docBase="/usr/local/apache2/htdocs/myServlets" debug="0"
reloadable="true" crossContext="true"/>
然后重启 tomcat
再刷新访问
http://192.168.138.128/myServlets/HelloWorld
发现可以正常访问了。呵呵, 好了这样就配置完成了 servlet ,包括
apache 的转发访问 servlet 还有目录的改变。。。 视频到这里了 8
11月 10th, 2009 at 18:57:11 #yzhkpli
跟着在myServlets下创建
WEB-INF目录,在WEB-INF目录下再创建 classes 目录,
# cd myServlets
# mkdir WEB-INF
# mkdir WEB-INF/classes
用
mkdir -p /usr/local/webapps/WEB-INF/classes/
就可以了
[回复]
adminreply on 2009-11-12 10:07:02:
呵呵, 的确这样方便, 谢谢
11月 10th, 2009 at 23:44:00 #yzhkpli
添加了
后,重启tomcat,发现是报错!!
我的地址:http://192.168.1.55:8080/myServlets/HelloWorld
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Error allocating a servlet instance
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
java.lang.Thread.run(Thread.java:717)
root cause
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:764)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
java.net.URLClassLoader.access$100(URLClassLoader.java:75)
java.net.URLClassLoader$1.run(URLClassLoader.java:294)
java.net.URLClassLoader$1.run(URLClassLoader.java:288)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:287)
java.lang.ClassLoader.loadClass(ClassLoader.java:399)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:325)
java.lang.ClassLoader.loadClass(ClassLoader.java:332)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1302)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
java.lang.Thread.run(Thread.java:717)
root cause
java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
java.net.URLClassLoader$1.run(URLClassLoader.java:299)
java.net.URLClassLoader$1.run(URLClassLoader.java:288)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:287)
java.lang.ClassLoader.loadClass(ClassLoader.java:399)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:325)
java.lang.ClassLoader.loadClass(ClassLoader.java:332)
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:764)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
java.net.URLClassLoader.access$100(URLClassLoader.java:75)
java.net.URLClassLoader$1.run(URLClassLoader.java:294)
java.net.URLClassLoader$1.run(URLClassLoader.java:288)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:287)
java.lang.ClassLoader.loadClass(ClassLoader.java:399)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:325)
java.lang.ClassLoader.loadClass(ClassLoader.java:332)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1302)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
java.lang.Thread.run(Thread.java:717)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.
[回复]
adminreply on 2009-11-12 10:08:54:
java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
有可能是你没有配置好 classpath ,把tomcat 的 lib 目录添加到 classpath 里面, 现在这个错误可能是 没有找到 servlet 相关的 .jar 导致的。
01月 27th, 2010 at 17:02:46 #匿名
配置成功,谢谢!
[回复]