`
mj4d
  • 浏览: 302598 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK6中httpserver实例

    博客分类:
  • java
阅读更多

前面说到HttpServer是JDK6提供的一个轻量的http server,位于

  • com.sun.net.httpserver
  • com.sun.net.httpserver.spi

主要的接口或类如下

Class/interface What does it do?
HttpServer Listens on a particular port number and address for incoming Http requests
HttpsServer Same as for HttpServer except for Https requests
HttpHandler Programmer implements this. Handler is called to handle each incoming Http request
HttpExchange Encapsulates all of the information about a Http request and the corresponding response
HttpContext Represents one Http application on a HttpServer instance. It is identified by the URI path to the application, and has a HttpHandler associated

更多的详情见这里。下面来见一个简单的例子

1、创建一个HttpServer实例

InetSocketAddress addr = new InetSocketAddress(8080);
//创建一个httpserver实例,0表示开启服务
HttpServer server = HttpServer.create(addr, 0);
//HttpContext与servlet中的ServletContext类似
//这里指定了ContextPath(/get/user),以及相应的Handler(Servlet)
HttpContext context = server.createContext("/get/user", new ParameterHandler());
//这里指定了Filter
context.getFilters().add(new ParameterFilter());
server.setExecutor(Executors.newCachedThreadPool());
server.start();

 这样就创建了一个端口8080的http server当前对其中注册的Handler和Filter接下来需要说明

 

2、这里的ParameterHandler需要实现HttpHandler用来处理请求。这里实现一个简单用例:打印headers和将请求中的参数作为string返回

public class ParameterHandler implements HttpHandler {

    public void handle(HttpExchange exchange) throws IOException {

        String requestMethod = exchange.getRequestMethod();
        if (requestMethod.equalsIgnoreCase("GET")) {
            Headers responseHeaders = exchange.getResponseHeaders();
            responseHeaders.set("Content-Type", "text/plain");
            exchange.sendResponseHeaders(200, 0);

            OutputStream responseBody = exchange.getResponseBody();
            Headers requestHeaders = exchange.getRequestHeaders();
            Set<String> keySet = requestHeaders.keySet();
            Iterator<String> iter = keySet.iterator();
            //print headers info
            responseBody.write("headers: \n".getBytes());
            while (iter.hasNext()) {
                String key = iter.next();
                List<?> values = requestHeaders.get(key);
                String s = key + " = " + values.toString() + "\n";
                responseBody.write(s.getBytes());
            }

            //print parameters
            responseBody.write("parameters: \n".getBytes());
            @SuppressWarnings("unchecked")
            Map<String, String> params = (Map<String, String>) exchange.getAttribute("parameters");
            for (Map.Entry<String, String> entry : params.entrySet()) {
                responseBody.write((entry.getKey() + " = " + entry.getValue() + "\n").getBytes());
            }

            responseBody.close();
        }
    }

}

 

3、在上面的ParameterHandler中我们用到了

exchange.getAttribute("parameters");

 但是parameters并没有处理,这就需要在Filter中来实现。也是在HttpContext 中加入的Filter,需要继承Filter。这和Servlet规范中很类似吧

public class ParameterFilter extends Filter {

    @Override
    public String description() {
        return "description...";
    }

    @Override
    public void doFilter(HttpExchange exchange, Chain chain) throws IOException {
        URI uri = exchange.getRequestURI();
        String rawQuery = uri.getRawQuery();
        if (null != rawQuery) {
            Map<String, String> map = new HashMap<String, String>();
            String[] params = rawQuery.split("&");
            for (String param : params) {
                String[] paras = param.split("\\=");
                map.put(paras[0], paras[1]);
            }
            exchange.setAttribute("parameters", map);
        }
        chain.doFilter(exchange);
    }
}

 这里只是把请求(GET)中的参数做简单的处理并设置到HttpContext中。

 

4、到这一步这个例子也已差不多了,运行1中的代码即可在浏览器中访问,比如我们的访问及结果如下:

//RequestUrl
http://localhost:8080/get/user?name=robin&gender=male
headers: 
Host = [localhost:8080]
Accept-charset = [GBK,utf-8;q=0.7,*;q=0.3]
Accept-encoding = [gzip,deflate,sdch]
Connection = [keep-alive]
Accept-language = [zh-CN,zh;q=0.8]
User-agent = [Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.96 Safari/537.4]
Accept = [text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
parameters: 
name = robin
gender = male

 DONE!

分享到:
评论

相关推荐

    JAVA JDK实例宝典

    《JAVA JDK实例宝典》是一本全面覆盖Java开发核心领域的指南,旨在帮助开发者深入理解和熟练应用JDK中的各种工具和技术。书中的内容丰富多样,涵盖了从基础语法到高级特性的各个方面,以下是各部分的主要知识点: 1...

    精通Java--JDK、数据库系统开发、Web开发基础与实例

    《精通Java--JDK、数据库系统开发、Web开发基础与实例》是一本全面覆盖Java编程技术及应用实践的书籍。本书旨在帮助读者深入理解和熟练掌握Java语言,从基础到高级,从理论到实践,全方位提升Java开发技能。 首先,...

    redis jar JDK1.6

    文件名列表中包含的关键词“session共享”、“支持tomcat6”和“jdk6.x”进一步强调了这个解决方案的主要目标是为Tomcat6和JDK1.6环境提供Redis支持的Session管理。这通常涉及到配置Redis服务器、安装和配置Tomcat ...

    WebService使用JDK发布

    5. 部署服务:使用JDK的`com.sun.net.httpserver.HttpServer`或Tomcat等应用服务器部署Web服务。 三、客户端调用Web服务 1. 生成客户端代理类:使用JAX-WS的`wsimport`工具,根据WSDL文件生成客户端所需的Java类。 ...

    Apache_HttpServer与Tomcat分布式配置

    1. **准备软件**:首先,需要确保已安装JDK、Apache HttpServer、Tomcat以及mod_jk连接模块。这些软件是构建分布式环境的基础。 2. **安装mod_jk连接模块**:mod_jk是Apache的一个模块,用于Apache与Tomcat之间的...

    wildfly9 多实例的配置实例(有说明)

    本教程将深入讲解如何在Linux环境(CentOS)下配置Wildfly9的多实例,以及使用JDK8和shell脚本来管理这些实例。 首先,确保你已经安装了CentOS操作系统,并且系统中已经部署了JDK8或更高版本。Java Development Kit...

    一台机器上部署不同版本JDK,两个Tomcat的解决方案

    ### 一台机器上部署不同版本JDK及两个Tomcat实例的解决方案 #### 一、背景介绍 在实际项目开发和运维过程中,有时会遇到需要在同一台机器上部署不同版本的Java Development Kit (JDK) 和多个Apache Tomcat服务器的...

    tomcat绑定配置jdk

    6. **部署Web应用**:如果你有自己的Web应用,可以将其WAR文件放入Tomcat的`webapps`目录下,或者在`conf/server.xml`中配置Context元素来指定应用的位置,然后重新启动Tomcat。 7. **监控和调试**:在运行过程中,...

    JDK1.6的九大新特性

    每当接收到一个请求时,HttpServer会调用相应的`HttpHandler`实例的回调方法。 - **扩展性**:对于未实现的功能,开发者可以通过扩展现有的HttpServerAPI来完成。 综上所述,JDK1.6中的这些新特性极大地提高了Java...

    双实例tomcat部署(tomcat7.0.82+jdk1.7和8.5.20+jdk1.8)

    在IT行业中,尤其是在服务器管理和运维领域,部署多个Tomcat实例是一项常见的任务,目的是为了实现服务隔离,提高系统可用性和稳定性。本教程将详细介绍如何在一台服务器上部署双实例的Tomcat,分别使用Tomcat ...

    javaJDK数据库开发web开发

    书中通过209个精心设计的实例,深入浅出地讲解了Java语言的基础和高级特性,以及如何在实际项目中运用这些知识。 Java JDK(Java Development Kit)是Java编程的基础,包含了编译器、调试器、JRE(Java Runtime ...

    Linux下java web服务器搭建(jdk6 apache+2Tomcat6+svn).doc

    【Linux下Java Web服务器搭建(JDK6 + Apache + 2个...以上就是Linux环境下搭建Java Web服务器的基本流程,涉及了JDK6、Apache、双实例Tomcat6和SVN的配置。注意,实际部署时需要根据具体需求和系统环境进行调整。

    linux下apache、tomcat及JDK安装过程图解

    在Linux环境下,搭建Web服务通常涉及三个核心组件:Apache HTTP Server、Java Development Kit (JDK) 和 Apache Tomcat。以下是对这些组件安装过程的详细解释: **一、JDK的安装** 1. 首先,以root权限登录Linux...

    模块1+jdk-8u111-windows-x64.rar

    JDK8可以在多种Windows操作系统上运行,包括Windows 7、Windows 10以及Windows Server 2003和2008等。但需要注意的是,不同版本的Windows可能需要不同的兼容性设置或者更新,确保操作系统能够支持64位应用程序。 **...

    JDK1.6新特性与实战例子

    StackOverflowError 示例:...以上就是JDK6中的五个主要新特性及其实战示例。这些特性极大地增强了Java的开发能力和对操作系统集成的深度,使得Java开发者能够更高效地处理XML数据、动态编译代码以及构建轻量级Web服务。

    JDK1.5配置+Tomcat5.0配置

    在IT行业中,JDK(Java Development Kit)和Tomcat是两个关键组件,分别用于Java应用程序的开发和运行。本文将详细介绍如何在Windows XP系统上配置JDK 1.5和Tomcat 5.0。 **JDK 1.5配置** JDK 1.5是Java语言的一个...

    jdk1.6 九大新特性

    4. **添加到托盘**:最后将`TrayIcon`对象添加到`SystemTray`实例中。 这些功能极大地增强了桌面应用程序的功能性和可用性,特别是在需要长期驻留在后台的应用程序中。 #### 二、其他重要新特性 除了`Desktop`和`...

    jdk8+tomcat9.rar

    通常,开发者会将JDK安装到系统路径中,然后配置环境变量,确保Tomcat可以找到JDK。接着,解压Tomcat服务器,配置相关的服务器端口、Context路径等,最后通过Manager App或命令行管理工具部署Web应用的WAR文件。 ...

Global site tag (gtag.js) - Google Analytics