实现Http Server的三种方法

一、使用SUN公司在JDK6中提供的新包com.sun.net.httpserver 


  JDK6提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法. 
实现Http Server 


  实现Http Server比较简单,我就不我做解释,只要看下面的代码就能明白。 
实现Https Server 


  HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,SSL 使用证书来进行验证。对于需要使用 SSL 来保证通信安全的客户端和服务器,都必须创建证书。JSSE 使用的证书要用与 J2SE 一起发布的 Java keytool 来创建。用下列命令来为 HTTP 服务器创建一个 RSA 证书。 
prompt> keytool -genkey -keystore serverkeys -keyalg rsa -alias qusay 
这个命令会产生一个由别名 qusay 引用的证书,并将其保存在一个名为 serverkeys 的文件中。产生证书的时候,这个工具会提示我们输入一些信息。 

下面代码演示了怎样创建自己的Http Server 和Https Server: 

 

Java代码   收藏代码
  1. import java.io.IOException;   
  2. import java.io.InputStream;   
  3. import java.io.OutputStream;   
  4. import java.net.InetSocketAddress;   
  5. import com.sun.net.httpserver.HttpExchange;   
  6. import com.sun.net.httpserver.HttpHandler;   
  7. import com.sun.net.httpserver.HttpServer;   
  8. public class MyHTTPServer {   
  9.   public static void main(String[] args)   
  10.   {   
  11.     try {   
  12.       //实现HTTP SERVER   
  13.       HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);// 设置HttpServer的端口为80   
  14.       hs.createContext("/hujun"new MyHandler());// 用MyHandler类内处理到/的请求   
  15.       hs.setExecutor(null); // creates a default executor   
  16.       hs.start();   
  17.   
  18.       //实现HTTPS SERVER   
  19.       HttpsServer hss = HttpsServer.create(new InetSocketAddress(443),0);  //设置HTTPS端口这443   
  20.       KeyStore ks = KeyStore.getInstance("JKS");   //建立证书库   
  21.       ks.load(new FileInputStream("证书名" ), "密码");  //载入证书   
  22.       KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");  //建立一个密钥管理工厂   
  23.       kmf.init(ks, "密码");  //初始工厂   
  24.       SSLContext sslContext = SSLContext.getInstance("SSLv3");  //建立证书实体   
  25.       sslContext.init(kmf.getKeyManagers(), nullnull);   //初始化证书   
  26.       HttpsConfigurator conf = new HttpsConfigurator(sslContext);  //在https配置   
  27.       hss.setHttpsConfigurator(conf);   //在https server载入配置   
  28.       hss.setExecutor(null); // creates a default executor     
  29.       hss.createContext("/"new MyHandler());// 用MyHandler类内处理到/的请求   
  30.       hss.start();   
  31.     } catch (Exception e){   
  32.       e.printStackTrace();   
  33.     }   
  34.   }   
  35. }   
  36.   
  37. class MyHandler implements HttpHandler {   
  38.   public void handle(HttpExchange t) throws IOException {   
  39.     InputStream is = t.getRequestBody();   
  40.     String response = "<font color='#ff0000'>come on baby</font>";   
  41.     t.sendResponseHeaders(200, response.length());   
  42.     OutputStream os = t.getResponseBody();   
  43.     os.write(response.getBytes());   
  44.     os.close();   
  45.   }   
  46. }   

 

 

 

 

 

二、使用Jetty 


  Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。 


  需要最少的包: 
  commons-logging.jar 
  javax.servlet.jar 
  org.mortbay.jetty.jar 
  org.mortbay.jmx.jar 

下面直接看代码,以嵌入模式启动Jetty,目前貌似不支持HTTPS 

 

Java代码   收藏代码
  1. import org.mortbay.http.HttpContext;   
  2. import org.mortbay.http.HttpServer;   
  3. import org.mortbay.http.SocketListener;   
  4. import org.mortbay.http.handler.ResourceHandler;   
  5. public class JettySample {   
  6.   public static void main(String[] args) throws Exception   
  7.   {   
  8.     //创建Jetty HttpServer对象   
  9.     HttpServer server = new HttpServer();   
  10.     //在端口8080上给HttpServer对象绑上一个listener,使之能够接收HTTP请求   
  11.     SocketListener listener = new SocketListener();   
  12.     listener.setPort(8080);   
  13.     server.addListener(listener);   
  14.      
  15.     //创建一个HttpContext,处理HTTP请求。   
  16.     HttpContext context = new HttpContext();   
  17.     //用setContextPath把Context映射到(/web)URL上。   
  18.     context.setContextPath("/web");   
  19.     //setResourceBase方法设置文档目录以提供资源   
  20.     context.setResourceBase("C:\\j2sdk1.4.1_05");   
  21.     //添加资源处理器到HttpContext,使之能够提供文件系统中的文件   
  22.     context.addHandler(new ResourceHandler());   
  23.     server.addContext(context);   
  24.     //启动服务器   
  25.     server.start();   
  26.   }   
  27. }   
 

 

Jetty的运行速度较快,而且是轻量级的,可以在Java中可以从test case中控制其运行。从而可以使自动化测试不再依赖外部环境,顺利实现自动化测试。 

 

 

 

 

三、使用tomcat embedded 


  Tomcat5中的Embeded版本,为大家在应用中集成完整的Web服务提供了尽可能大的空间,不仅使开发者容易获得对标准HTTP的处理,还有SSL的通讯处理,使开发者很容易就可以对原有非Web系统进行扩展以支持瘦客户端应用,通向Web大门的钥匙已经放在这里,剩下的就是看你怎样来发挥了。下面是示例代码: 

 

Java代码   收藏代码
  1. package tomcat;   
  2. import java.io.File;   
  3. import java.net.InetAddress;   
  4. import org.apache.catalina.Context;   
  5. import org.apache.catalina.Engine;   
  6. import org.apache.catalina.Host;   
  7. import org.apache.catalina.connector.Connector;   
  8. import org.apache.catalina.startup.Embedded;   
  9. public class EmbeddedTomcat {   
  10.   public static void main(String args[]) {   
  11.    try {   
  12.      // Create an embedded server   
  13.      Embedded embedded = new Embedded();   
  14.      String path = new File(".").getCanonicalPath();   
  15.      embedded.setCatalinaHome(path);   
  16.      // Create an engine   
  17.      Engine engine = embedded.createEngine();   
  18.      // Create a default virtual host   
  19.      Host host = embedded.createHost("localhost", path + "/webapps");   
  20.      engine.addChild(host);   
  21.      engine.setDefaultHost(host.getName());   
  22.      // Create the ROOT context   
  23.      Context rootCxt = embedded.createContext("", path + "/webapps/ROOT");   
  24.      rootCxt.setPrivileged(true);   
  25.      host.addChild(rootCxt);   
  26.      // Install the assembled container hierarchy   
  27.      embedded.addEngine(engine);   
  28.      // Assemble and install a default HTTP connector   
  29.      embedded.addConnector(embedded.createConnector(InetAddress.getByName("127.0.0.1"), 8080false));   
  30.      // Start the embedded server   
  31.      embedded.start();   
  32.    }catch( Exception e ) {   
  33.      e.printStackTrace();   
  34.       }   
  35.   }   
  36. }  

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL SERVER 2008 中常见的三种分页方法是使用 OFFSET-FETCH、ROW_NUMBER() 和 TOP 子句。这些方法可以帮助我们在结果集中选择指定数量的行。 1. OFFSET-FETCH 分页方法:OFFSET-FETCH 子句是 SQL SERVER 2012 引入的,它可以用于从查询结果集中选择一段连续的行。例如,以下语句将从 employees 表中选择前 10 行: ``` SELECT * FROM employees ORDER BY employee_id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY; ``` 2. ROW_NUMBER() 分页方法:ROW_NUMBER() 函数是 SQL SERVER 中一个强大的函数,它可以为结果集中的每一行分配一个唯一的数字。我们可以利用这个函数来实现分页。例如,以下语句将从 employees 表中选择第 11 到第 20 行: ``` SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY employee_id) AS row_num FROM employees ) AS T WHERE T.row_num BETWEEN 11 AND 20; ``` 3. TOP 分页方法:TOP 子句可以用来选择结果集中的前 N 行。例如,以下语句将从 employees 表中选择前 10 行: ``` SELECT TOP 10 * FROM employees ORDER BY employee_id; ``` 总结: 以上三种方法实现分页时都可以起到作用,但各有优缺点。OFFSET-FETCH 分页方法是最简单、最直接的,但在处理大数据量时可能会出现性能问题。ROW_NUMBER() 分页方法可以更精确地选择指定行数,但也会增加查询的复杂度。TOP 分页方法最适合选择较少的行,但对于大数据量的表来说,它的性能也会受到影响。因此,在实际应用中,我们需要根据具体情况选择最合适的分页方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值