编译及执行有依赖类的java程序
Servletr接口源程序:
package server;
import java.io.*;
public interface Servlet{
public void init()throws Exception;
public void service(byte[] requestBuffer, OutputStream out)throws Exception;
}
HTTPServer1源程序:
package server;
import java.io.*;
import java.net.*;
import java.util.*;
public class HTTPServer1{
private static Map<string,servlet> servletCache=new HashMap<string,servlet>();
public static void main(String args[]) {
int port;
ServerSocket serverSocket;
try {
port = Integer.parseInt(args[0]);
}catch (Exception e) {
System.out.println("port = 8080 (默认)");
port = 8080; //默认端口为8080
}
try{
serverSocket = new ServerSocket(port);
System.out.println("服务器正在监听端口:" + serverSocket.getLocalPort());
while(true) { //服务器在一个无限循环中不断接收来自客户的TCP连接请求
try{
//等待客户的TCP连接请求
final Socket socket = serverSocket.accept();
System.out.println("建立了与客户的一个新的TCP连接,该客户的地址为:"+
socket.getInetAddress()+":" + socket.getPort());
service(socket); //响应客户请求
}catch(Exception e){
System.out.println("客户端请求的资源不存在");}
} //#while
}catch (Exception e) {e.printStackTrace();}
}
/** 响应客户的HTTP请求 */
public static void service(Socket socket)throws Exception{
/*读取HTTP请求信息*/
InputStream socketIn=socket.getInputStream(); //获得输入流
Thread.sleep(500); //睡眠500毫秒,等待HTTP请求
int size=socketIn.available();
byte[] requestBuffer=new byte[size];
socketIn.read(requestBuffer);
String request=new String(requestBuffer);
System.out.println(request); //打印HTTP请求数据
/*解析HTTP请求*/
//获得HTTP请求的第一行
int endIndex=request.indexOf("\r\n");
if(endIndex==-1)
endIndex=request.length();
String firstLineOfRequest=
request.substring(0,endIndex);
//解析HTTP请求的第一行
String[] parts=firstLineOfRequest.split(" ");
String uri="";
if(parts.length>=2)
uri=parts[1]; //获得HTTP请求中的uri
/*如果请求访问Servlet,则动态调用Servlet对象的service()方法*/
if(uri.indexOf("servlet")!=-1){
//获得Servlet的名字
String servletName=null;
if(uri.indexOf("?")!=-1)
servletName=uri.substring(uri.indexOf("servlet/")+8,uri.indexOf("?"));
else
servletName=uri.substring(uri.indexOf("servlet/")+8,uri.length());
//尝试从Servlet缓存中获取Servlet对象
Servlet servlet=servletCache.get(servletName);
//如果Servlet缓存中不存在Servlet对象,就创建它,并把它存放在Servlet缓存中
if(servlet==null){
servlet=(Servlet)Class.forName("server."+servletName).getDeclaredConstructor().newInstance();
servlet.init();//先调用Servlet对象的init()方法
servletCache.put(servletName,servlet);
}
//调用Servlet的service()方法
servlet.service(requestBuffer,socket.getOutputStream());Thread.sleep(1000);//睡眠1秒,等待客户接收HTTP响应结果
socket.close();//关闭TCP连接 return;}/*决定HTTP响应正文的类型*/String contentType;if(uri.indexOf("html")!=-1|| uri.indexOf("htm")!=-1)
contentType="text/html";elseif(uri.indexOf("jpg")!=-1|| uri.indexOf("jpeg")!=-1)
contentType="image/jpeg";elseif(uri.indexOf("gif")!=-1)
contentType="image/gif";else
contentType="application/octet-stream";/*创建HTTP响应结果 *///HTTP响应的第一行String responseFirstLine="HTTP/1.1 200 OK\r\n";//HTTP响应头String responseHeader="Content-Type:"+contentType+"\r\n\r\n";//获得读取响应正文数据的输入流InputStream in=HTTPServer1.class.getResourceAsStream("root/"+uri);/*发送HTTP响应结果 */OutputStream socketOut=socket.getOutputStream();//获得输出流//发送HTTP响应的第一行
socketOut.write(responseFirstLine.toString().getBytes());//发送HTTP响应的头
socketOut.write(responseHeader.toString().getBytes());//发送HTTP响应的正文int len=0;byte[] buffer=newbyte[128];while((len=in.read(buffer))!=-1)
socketOut.write(buffer,0,len);Thread.sleep(1000);//睡眠1秒,等待客户接收HTTP响应结果
socket.close();//关闭TCP连接 }}
HTTPServer1.java程序中引用了Servlet接口。因此,编译时仅编译HTTPServer1.java(javac HTTPServer1.java
)程序会报找不到Serlet符号的错误:

在编译有依赖关系的java程序时,需要同时编译被依赖的源程序: javac Servlet.java HTTPServer1.java
:

而在执行编译生成的字节码文件时,则必须包含完整的包名(删除了被依赖的Servlet.class貌似没影响):
未按完整包名.类:java HTTPServer1
或者在server包路径下执行java server.HTTPServer1
:

在server包的上一层路径中执行java server.HTTPServer1
:

参考文档:Tomcat与Java Web开发技术详解 www.javathinker.net