前面说到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中的各种工具和技术。书中的内容丰富多样,涵盖了从基础语法到高级特性的各个方面,以下是各部分的主要知识点: 1...
《精通Java--JDK、数据库系统开发、Web开发基础与实例》是一本全面覆盖Java编程技术及应用实践的书籍。本书旨在帮助读者深入理解和熟练掌握Java语言,从基础到高级,从理论到实践,全方位提升Java开发技能。 首先,...
文件名列表中包含的关键词“session共享”、“支持tomcat6”和“jdk6.x”进一步强调了这个解决方案的主要目标是为Tomcat6和JDK1.6环境提供Redis支持的Session管理。这通常涉及到配置Redis服务器、安装和配置Tomcat ...
5. 部署服务:使用JDK的`com.sun.net.httpserver.HttpServer`或Tomcat等应用服务器部署Web服务。 三、客户端调用Web服务 1. 生成客户端代理类:使用JAX-WS的`wsimport`工具,根据WSDL文件生成客户端所需的Java类。 ...
1. **准备软件**:首先,需要确保已安装JDK、Apache HttpServer、Tomcat以及mod_jk连接模块。这些软件是构建分布式环境的基础。 2. **安装mod_jk连接模块**:mod_jk是Apache的一个模块,用于Apache与Tomcat之间的...
本教程将深入讲解如何在Linux环境(CentOS)下配置Wildfly9的多实例,以及使用JDK8和shell脚本来管理这些实例。 首先,确保你已经安装了CentOS操作系统,并且系统中已经部署了JDK8或更高版本。Java Development Kit...
### 一台机器上部署不同版本JDK及两个Tomcat实例的解决方案 #### 一、背景介绍 在实际项目开发和运维过程中,有时会遇到需要在同一台机器上部署不同版本的Java Development Kit (JDK) 和多个Apache Tomcat服务器的...
6. **部署Web应用**:如果你有自己的Web应用,可以将其WAR文件放入Tomcat的`webapps`目录下,或者在`conf/server.xml`中配置Context元素来指定应用的位置,然后重新启动Tomcat。 7. **监控和调试**:在运行过程中,...
每当接收到一个请求时,HttpServer会调用相应的`HttpHandler`实例的回调方法。 - **扩展性**:对于未实现的功能,开发者可以通过扩展现有的HttpServerAPI来完成。 综上所述,JDK1.6中的这些新特性极大地提高了Java...
在IT行业中,尤其是在服务器管理和运维领域,部署多个Tomcat实例是一项常见的任务,目的是为了实现服务隔离,提高系统可用性和稳定性。本教程将详细介绍如何在一台服务器上部署双实例的Tomcat,分别使用Tomcat ...
书中通过209个精心设计的实例,深入浅出地讲解了Java语言的基础和高级特性,以及如何在实际项目中运用这些知识。 Java JDK(Java Development Kit)是Java编程的基础,包含了编译器、调试器、JRE(Java Runtime ...
【Linux下Java Web服务器搭建(JDK6 + Apache + 2个...以上就是Linux环境下搭建Java Web服务器的基本流程,涉及了JDK6、Apache、双实例Tomcat6和SVN的配置。注意,实际部署时需要根据具体需求和系统环境进行调整。
在Linux环境下,搭建Web服务通常涉及三个核心组件:Apache HTTP Server、Java Development Kit (JDK) 和 Apache Tomcat。以下是对这些组件安装过程的详细解释: **一、JDK的安装** 1. 首先,以root权限登录Linux...
JDK8可以在多种Windows操作系统上运行,包括Windows 7、Windows 10以及Windows Server 2003和2008等。但需要注意的是,不同版本的Windows可能需要不同的兼容性设置或者更新,确保操作系统能够支持64位应用程序。 **...
StackOverflowError 示例:...以上就是JDK6中的五个主要新特性及其实战示例。这些特性极大地增强了Java的开发能力和对操作系统集成的深度,使得Java开发者能够更高效地处理XML数据、动态编译代码以及构建轻量级Web服务。
在IT行业中,JDK(Java Development Kit)和Tomcat是两个关键组件,分别用于Java应用程序的开发和运行。本文将详细介绍如何在Windows XP系统上配置JDK 1.5和Tomcat 5.0。 **JDK 1.5配置** JDK 1.5是Java语言的一个...
4. **添加到托盘**:最后将`TrayIcon`对象添加到`SystemTray`实例中。 这些功能极大地增强了桌面应用程序的功能性和可用性,特别是在需要长期驻留在后台的应用程序中。 #### 二、其他重要新特性 除了`Desktop`和`...
通常,开发者会将JDK安装到系统路径中,然后配置环境变量,确保Tomcat可以找到JDK。接着,解压Tomcat服务器,配置相关的服务器端口、Context路径等,最后通过Manager App或命令行管理工具部署Web应用的WAR文件。 ...