




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- ui外包合同范例
- 个人服装代工合同范例
- 幼儿园安全专项整顿工作总结模版
- 产科的医院感染管理
- 医疗大数据驱动的德阳城市居民健康管理服务创新
- 企业健康管理的大数据应用与创新实践
- 专业技术团队的管理与建设研究
- 公司买断合同范例
- 医疗AI临床应用的商业化路径与挑战
- 医疗设备采购与供应的智能化管理研究
- TSG ZF001-2006《安全阀安全技术监察规程》
- 2024-2030年中国隐私计算行业发展模式及战略规划分析研究报告
- (高清版)DB42T 2179-2024 装配式建筑评价标准
- 矫形鞋垫产品技术要求标准2024年版
- 多旋翼无人机驾驶员执照(CAAC)备考试题库大全-上部分
- DL∕T 796-2012 风力发电场安全规程
- JGJ120-2012 建筑基坑支护技术规程
- DL-T+5220-2021-10kV及以下架空配电线路设计规范
- 居住区规划智慧树知到期末考试答案章节答案2024年湖南师范大学
- 2024年福建省三明市中考数学二检试卷(含解析)
- JT-T-1004.1-2015城市轨道交通行车调度员技能和素质要求第1部分:地铁轻轨和单轨
评论
0/150
提交评论