Java 内置Http Server构建web应用案例详解_第1页
Java 内置Http Server构建web应用案例详解_第2页
Java 内置Http Server构建web应用案例详解_第3页
Java 内置Http Server构建web应用案例详解_第4页
Java 内置Http Server构建web应用案例详解_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Java内置HttpServer构建web应用案例详解使用Java技术构建Web应用时,我们通常离不开tomcat和jetty之类的servlet容器,这些Web服务器功能强大,性能强劲,深受欢迎,是运行大型Web应用的必备神器。

虽然Java的设计初衷就是用来开发大型应用的,然而有时候我们开发的程序只是简单的小型应用,对于功能的需求和性能的要求并不高,可能仅仅就几百行甚至几十行代码,这个时候使用tomcat之类的Web服务器去运行就显得有点大材小用了。比如说只是将数据库中的数据读出来转换成JSON,以Web服务的形式吐给调用方这样的阉割型Web应用。如下图所示

二、最简单的JavaHttp服务器

其实在jdk中已经内置了用于此类简单Web应用构建需求的类库了,sun公司提供的.httpserver包就是用来帮助我们解决这类问题的

import.httpserver.HttpExchange;

import.httpserver.HttpHandler;

import.httpserver.HttpServer;

importjava.io.IOException;

importjava.io.OutputStream;

import.InetSocketAddress;

publicclassMain{

publicstaticvoidmain(String[]arg)throwsException{

HttpServerserver=HttpServer.create(newInetSocketAddress(8001),0);

server.createContext("/test",newTestHandler());

server.start();

staticclassTestHandlerimplementsHttpHandler{

@Override

publicvoidhandle(HttpExchangeexchange)throwsIOException{

Stringresponse="helloworld";

exchange.sendResponseHeaders(200,0);

OutputStreamos=exchange.getResponseBody();

os.write(response.getBytes());

os.close();

}

如上代码清单所示,仅仅几行代码就可以构建一个五脏俱全的Web应用了。执行代码,在浏览器地址栏里代开链接

http://localhost:8001/test

就能运行这个段程序,输入的结果为helloworld

三、获得外部数据

那在这个程序中如何获取到外部传递过来的数据呢?比如说URL上的查询字符串,POST提交的数据等,其实也很简单

import.httpserver.HttpExchange;

import.httpserver.HttpHandler;

import.httpserver.HttpServer;

importmons.io.IOUtils;

importjava.io.IOException;

importjava.io.OutputStream;

importjava.io.UnsupportedEncodingException;

import.InetSocketAddress;

import.URLDecoder;

importjava.util.Arrays;

importjava.util.HashMap;

importjava.util.Map;

publicclassMain{

publicstaticvoidmain(String[]arg)throwsException{

HttpServerserver=HttpServer.create(newInetSocketAddress(8001),0);

server.createContext("/test",newTestHandler());

server.start();

staticclassTestHandlerimplementsHttpHandler{

@Override

publicvoidhandle(HttpExchangeexchange){

Stringresponse="helloworld";

try{

//获得查询字符串(get)

StringqueryString=exchange.getRequestURI().getQuery();

MapString,StringqueryStringInfo=formData2Dic(queryString);

//获得表单提交数据(post)

StringpostString=IOUtils.toString(exchange.getRequestBody());

MapString,StringpostInfo=formData2Dic(postString);

exchange.sendResponseHeaders(200,0);

OutputStreamos=exchange.getResponseBody();

os.write(response.getBytes());

os.close();

}catch(IOExceptionie){

}catch(Exceptione){

publicstaticMapString,StringformData2Dic(StringformData){

MapString,Stringresult=newHashMap();

if(formData==null||formData.trim().length()==0){

returnresult;

finalString[]items=formData.split("

Arrays.stream(items).forEach(item-{

finalString[]keyAndVal=item.split("=");

if(keyAndVal.length==2){

try{

finalStringkey=URLDecoder.decode(keyAndVal[0],"utf8");

finalStringval=URLDecoder.decode(keyAndVal[1],"utf8");

result.put(key,val);

}catch(UnsupportedEncodingExceptione){}

returnresult;

}

上面的代码清单标识了实现的方法。

注意,要保证上面代码编译通过,需要引入commons-io.jar,此包中提供将InputStream转换成String的方法。

四、并发处理

.httpserver似乎默认不支持同时处理多个请求,一旦有并行的请求涌入,需要排队等待程序处理,导致Web程序响应卡顿。自定义实现的方法也很简单,为每个请求开一个新的线程处理即可,如下代码清单所示

import.httpserver.HttpExchange;

import.httpserver.HttpHandler;

import.httpserver.HttpServer;

importmons.io.IOUtils;

importjava.io.IOException;

importjava.io.OutputStream;

importjava.io.UnsupportedEncodingException;

import.InetSocketAddress;

import.URLDecoder;

importjava.util.Arrays;

importjava.util.HashMap;

importjava.util.Map;

publicclassMain{

publicstaticvoidmain(String[]arg)throwsException{

HttpServerserver=HttpServer.create(newInetSocketAddress(8001),0);

server.createContext("/test",newTestHandler());

server.start();

staticclassTestHandlerimplementsHttpHandler{

@Override

publicvoidhandle(HttpExchangeexchange){

newThread(newRunnable(){

@Override

publicvoidrun(){

try{

Stringresponse="helloworld";

//获得查询字符串(get)

StringqueryString=exchange.getRequestURI().getQuery();

MapString,StringqueryStringInfo=formData2Dic(queryString);

//获得表单提交数据(post)

StringpostString=IOUtils.toString(exchange.getRequestBody());

MapString,StringpostInfo=formData2Dic(postString);

exchange.sendResponseHeaders(200,0);

OutputStreamos=exchange.getResponseBody();

os.write(response.getBytes());

os.close();

}catch(IOExceptionie){

ie.printStackTrace();

}catch(Exceptione){

e.printStackTrace();

}).start();

publicstaticMapString,StringformData2Dic(StringformData){

MapString,Stringresult=newHashMap();

if(formData==null||formData.trim().length()==0){

returnresult;

finalString[]items=formData.split("

Arrays.stream(items).forEach(item-{

finalString[]keyAndVal=item.split("=");

if(keyAndVal.length==2){

try{

finalStringkey=URLDecoder.decode(keyAndVal[0],"utf8");

finalStringval=URLDecoder.decode(keyAndVal[1],"utf8");

result.put(key,val);

}catch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论