工具 & 环境
- Ubuntu-16.04 64-bit
- Java 1.8.0
- Tomcat 9.0.0
WEB 开发
首先,需要安装Java开发环境,接着下载Tomcat软件包。在终端中利用tar -zxvf apache-tomcat-version.tar.gz
命令解压文件,解压后目录如下:
- /bin: 存放启动和关闭Tomcat的脚本文件。
- /lib: 存放Tomcat服务器及所有Web应用程序都可以访问的JAR文件。
- /conf: 存放Tomcat服务器的各种配置文件。
- /logs: 存储Tomcat的日志文件。
- /temp: 存放Tomcat运行时产生的临时文件。
- /webapps: 当发布Web应用程序时,通常把Web应用程序的目录及文件存放在这个目录。
- /work: Tomcat将JSP生成的Servlet源文件和字节码文件放到这个目录。
备注:version对应于Tomcat的版本。
测试Tomcat是否能正常运行:
$ cd apache-tomcat-version
$ bin/startup.sh
Using CATALINA_BASE: /home/japin/Code/Java/NetDisk/apache-tomcat-9.0.0.M8
Using CATALINA_HOME: /home/japin/Code/Java/NetDisk/apache-tomcat-9.0.0.M8
Using CATALINA_TMPDIR: /home/japin/Code/Java/NetDisk/apache-tomcat-9.0.0.M8/temp
Using JRE_HOME: /opt/jdk
Using CLASSPATH: /home/japin/Code/Java/NetDisk/apache-tomcat-9.0.0.M8/bin/bootstrap.jar:/home/japin/Code/Java/NetDisk/apache-tomcat-9.0.0.M8/bin/tomcat-juli.jar
Tomcat started.
如果出现上面提示则说明Tomcat测试正常运行。
一个简单的Java WEB程序需要以下几步:
- 编写源文件
- 编译源文件
- 部署程序
- 测试访问
编写程序
新建NetDisk.java文件,代码如下:
package netdisk;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NetDisk extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>NetDisk</title></head>");
out.println("<body>");
out.println("Welcome to NetDisk! This is a test.");
out.println("</body>");
out.println("</html>");
}
}
编译程序
若直接通过javac NetDisk.java
编译程序,会得到如下错误:
NetDisk.java:4: 错误: 程序包javax.servlet不存在
import javax.servlet.*;
^
NetDisk.java:5: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.*;
^
NetDisk.java:7: 错误: 找不到符号
public class NetDisk extends HttpServlet {
^
符号: 类 HttpServlet
NetDisk.java:8: 错误: 找不到符号
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
^
符号: 类 HttpServletRequest
位置: 类 NetDisk
NetDisk.java:8: 错误: 找不到符号
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
^
符号: 类 HttpServletResponse
位置: 类 NetDisk
NetDisk.java:8: 错误: 找不到符号
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
^
符号: 类 ServletException
位置: 类 NetDisk
6 个错误
这是由于在编译时未能找到javax.servlet
和javax.servlet.http
这两个包及包中的类。通过在编译时指定servlet-api.jar
路径及文件名即可解决。
例如,默认servlet-api.jar
在apache-tomcat-version/lib/
目录下,我将其解压到当前工作目录,即与NetDisk.java
在同一目录,则编译命令如下:
$ javac -cp .:./apache-tomcat-version/lib/servlet-api.jar NetDisk.java
当然,更为简单的做法是将servlet-api.jar
指定到系统的CLASSPATH
环境变量中,这些样就可以通过javac NetDisk.java
命令直接编译。
经过上述步骤后,就会在当前路径下生成NetDisk.class文件。
程序部署
Tomcat服务器通常需要将Web应用程序放在webapps目录下。在这个例子中netdisk应用程序的目录如下:
- /netdisk: Web应用程序的根目录,属于此应用程序的所有文件都放在该目录下。
- /netdisk/WEB-INF: 存放Web应用程序部署的描述文件web.xml。
- /netdisk/WEB-INF/classes: 存放Web应用程序用到的类文件。
- /netdisk/WEB-INF/lib: 存放Web应用用到的jar文件。
- /netdisk/WEB-INF/web.xml: 该文件是Web应用程序部署的描述文件,用来存放整个应用程序的配置和部署信息。
下面是web.xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
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">
<servlet>
<servlet-name>NETDISK</servlet-name>
<servlet-class>netdisk.NetDisk</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>NETDISK</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
</web-app>
web.xml文件必须是格式良好的XML。其中第一行是xml版本和编码的声明,第二行在根元素上声明了XML Schema的名称空间。
代码中的和元素以及它们的子元素,用来部署NetDisk。元素用于声明一个servlet。其中用于指定Servlet的名字。虽然子元素可以任意指定一个Servlet名字,但在同一个Web应用程序中,每一个Servlet的名字必须是唯一的,而且不能为空。上述例子中的Servlet取名为NETDISK。由于子元素用于指定Servlet类时要给出完整的限定名,如果有包名,同时要给出包名,因此上述Servlet的完整限定名是netdisk.NetDisk。
元素用于在Servlet和URL样式之间定义一个映射。它的子元素指定的Servlet名字必须与元素的子元素给出的名字相同。子元素用于指定对应Servlet的URL路径,该路径是相对于Web应用程序的路径,配置为/welcom,这样就可以通过http://localhost:8080/netdisk/welcome
来访问。
访问测试
在浏览器中访问http://localhost:8080/netdisk/welcome
,页面显示Welcome to NetDisk! This is a test.
。默认采用的是8080
端口,如果修改了默认端口,则需要进行相应的修改。
参考
[1] 朱福喜,《面向对象的Java程序设计》