java HttpServer构建http服务器

java HttpServer构建http服务器

    package com.tdt.server.httpserver;  
      
    import java.io.IOException;  
    import java.net.InetSocketAddress;  
      
    import com.sun.net.httpserver.HttpServer;  
    import com.sun.net.httpserver.spi.HttpServerProvider;  
    /**
     *  
     * @author chuer
     * @Description: 服务器启动类
     * @date 2014年11月12日 下午3:53:38  
     * @version V1.0
     */  
    public class MyHttpServer {  
        //启动服务,监听来自客户端的请求  
        public static void start() throws IOException {  
            Context.load();  
              
            HttpServerProvider provider = HttpServerProvider.provider();  
            HttpServer httpserver =provider.createHttpServer(new InetSocketAddress(8080), 100);//监听端口8080,能同时接 受100个请求  
            httpserver.createContext(Context.contextPath, new MyHttpHandler());   
            httpserver.setExecutor(null);  
            httpserver.start();  
            System.out.println("server started");  
        }  
          
          
        public static void main(String[] args) throws IOException {  
            start();  
        }  
    }  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver;  
      
    import java.io.IOException;  
      
    import com.sun.net.httpserver.HttpExchange;  
    import com.sun.net.httpserver.HttpHandler;  
    import com.tdt.server.httpserver.core.Handler;  
    import com.tdt.server.httpserver.core.impl.HttpRequest;  
    import com.tdt.server.httpserver.core.impl.HttpResponse;  
      
    /**
     * @author chuer
     * @Description: 内部消息处理类
     * @date 2014年11月12日 下午3:53:44  
     * @version V1.0
     */  
    public class MyHttpHandler implements HttpHandler {  
      
        public void handle(HttpExchange httpExchange) throws IOException {  
            HttpRequest request = new HttpRequest(httpExchange);  
            HttpResponse response = new HttpResponse(httpExchange);  
            Handler handler = Context.getHandler(request.getReuestURI().getPath());  
            handler.service(request, response);  
      
        }  
    }  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver;  
      
    import java.util.HashMap;  
    import java.util.Map;  
      
    import org.w3c.dom.Document;  
    import org.w3c.dom.Element;  
      
    import com.tdt.server.httpserver.core.impl.HttpHandler;  
    import com.tdt.server.httpserver.utils.XmlUtils;  
    /**
     *  
     * @author chuer
     * @Description: 上下文  
     * @date 2014年11月12日 下午3:53:48  
     * @version V1.0
     */  
    public class Context {  
        private static Map<String,HttpHandler> contextMap = new HashMap<String,HttpHandler>();  
        public static String contextPath = "";  
        public static void load(){  
            try{  
                Document doc = XmlUtils.load(Context.class.getResource("/").getPath()+"context.xml");  
                Element root = doc.getDocumentElement();  
                  
                contextPath = XmlUtils.getAttribute(root,"context");  
                Element[] handlers = XmlUtils.getChildrenByName(root, "handler");  
                for(Element ele : handlers){  
                    String handle_class = XmlUtils.getChildText(ele, "handler-class");  
                    String url_pattern = XmlUtils.getChildText(ele, "url-pattern");  
                      
                    Class<?> cls = Class.forName(handle_class);  
                    Object newInstance = cls.newInstance();  
                    if(newInstance instanceof HttpHandler){  
                        contextMap.put(contextPath+url_pattern, (HttpHandler)newInstance);  
                    }  
                }  
            }catch(Exception e){  
                e.printStackTrace();  
            }  
        }  
          
        /**
         *  
         * @param key
         * @return
         */  
        public static HttpHandler getHandler(String key){  
            return contextMap.get(key);  
        }  
          
    }  


[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    <?xml version="1.0" encoding="UTF-8"?>  
    <httpServer context="/myApp">  
        <handler>  
            <handler-class>com.tdt.server.httpserver.sample.FirstHandler</handler-class>  
            <url-pattern>/firstHandler</url-pattern>  
        </handler>  
          
          
    </httpServer>  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.core;  
    /**
     *  
     * @author chuer
     * @Description: 相应类接口
     * @date 2014年11月12日 下午3:54:02  
     * @version V1.0
     */  
    public interface Response {  
          
        public void write(String result);  
          
    }  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.core;  
      
    import java.net.URI;  
    /**
     * @author chuer
     * @Description: 请求接口
     * @date 2014年11月12日 下午3:54:58  
     * @version V1.0
     */  
    public interface Request {  
        public final static String GET = "GET";  
        public final static String POST = "POST";  
      
        public String getParamter(String param);  
      
        public String getMethod();  
      
        public URI getReuestURI();  
      
        public void initRequestHeader();  
          
        public void initRequestParam();  
      
        public void initRequestBody();  
      
        public String getRequestBody();  
    }  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.core;  
    /**
     * @author chuer
     * @Description: 消息处理接口
     * @date 2014年11月12日 下午3:55:10  
     * @version V1.0
     */  
    public interface Handler {  
        public void service(Request request, Response response);  
      
        public void doGet(Request request, Response response);  
      
        public void doPost(Request request, Response response);  
      
    }  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.core.impl;  
      
    import com.tdt.server.httpserver.core.Handler;  
    import com.tdt.server.httpserver.core.Request;  
    import com.tdt.server.httpserver.core.Response;  
      
    public abstract class HttpHandler implements Handler {  
      
        @Override  
        public void service(Request request, Response response) {  
            request.initRequestHeader();  
            request.initRequestParam();  
            if(request.getMethod().equals(Request.GET)){  
                doGet(request,response);  
            }else if(request.getMethod().equals(Request.POST)){  
                request.initRequestBody();  
                doPost(request,response);  
            }  
        }  
      
        @Override  
        public abstract void doGet(Request request, Response response);  
      
        @Override  
        public abstract void doPost(Request request, Response response);  
      
          
    }  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.core.impl;  
      
    import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.InputStreamReader;  
    import java.net.URI;  
    import java.util.HashMap;  
    import java.util.List;  
    import java.util.Map;  
      
    import com.sun.net.httpserver.HttpExchange;  
    import com.tdt.server.httpserver.core.Request;  
      
    public class HttpRequest implements Request {  
        private HttpExchange httpExchange;  
        private Map<String, String> paramMap = new HashMap<String, String>();  
        private Map<String, List<String>> headMap = new HashMap<String, List<String>>();  
        private String requestBody = "";  
      
        public HttpRequest(HttpExchange httpExchange) {  
            this.httpExchange = httpExchange;  
        }  
      
        @Override  
        public String getParamter(String param) {  
            return paramMap.get(param);  
        }  
      
        @Override  
        public String getMethod() {  
            return httpExchange.getRequestMethod().trim().toUpperCase();  
        }  
      
        @Override  
        public URI getReuestURI() {  
            return httpExchange.getRequestURI();  
        }  
      
        @Override  
        public void initRequestParam() {  
            String query = getReuestURI().getQuery();  
            String [] arrayStr = query.split("&");  
            for(String str : arrayStr){  
                paramMap.put(str.split("=")[0], str.split("=")[1]);  
            }  
              
        }  
      
        @Override  
        public void initRequestHeader() {  
            for(String s : httpExchange.getRequestHeaders().keySet()){  
                headMap.put(s, httpExchange.getRequestHeaders().get(s));  
            }  
        }  
      
        @Override  
        public void initRequestBody() {  
            InputStream in = httpExchange.getRequestBody(); // 获得输入流  
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));  
            String temp = null;  
            try {  
                while ((temp = reader.readLine()) != null) {  
                    requestBody += temp;  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
      
        @Override  
        public String getRequestBody() {  
            return requestBody;  
        }  
          
        public static void main(String[] args) {  
              
            String query = "aaa=aaa&bbb=bbb";  
            String [] a = query.split("&");  
            for(String s : a){  
                System.out.print(s.split("=")[0]+"=");  
                System.out.println(s.split("=")[1]);  
                  
            }  
              
              
              
        }  
      
    }  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.core.impl;  
      
    import java.io.IOException;  
    import java.io.OutputStream;  
      
    import com.sun.net.httpserver.HttpExchange;  
    import com.tdt.server.httpserver.core.Response;  
      
    public class HttpResponse implements Response{  
        private HttpExchange httpExchange;  
        public HttpResponse(HttpExchange httpExchange){  
            this.httpExchange = httpExchange;  
        }  
          
          
        @Override  
        public void write(String result) {  
            try {  
                httpExchange.sendResponseHeaders(200, result.length());// 设置响应头属性及响应信息的长度  
                OutputStream out = httpExchange.getResponseBody(); // 获得输出流  
                out.write(result.getBytes());  
                out.flush();  
                httpExchange.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }   
              
        }  
      
          
    }  


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.sample;  
      
    import com.tdt.server.httpserver.core.Request;  
    import com.tdt.server.httpserver.core.Response;  
    import com.tdt.server.httpserver.core.impl.HttpHandler;  
      
    public class FirstHandler extends HttpHandler{  
      
        @Override  
        public void doGet(Request request, Response response) {  
            System.out.println("doGet");  
              
            System.out.println(request.getParamter("aaa"));  
            System.out.println(request.getParamter("bbb"));  
              
            response.write("helloWorld.....");  
        }  
      
          
        @Override  
        public void doPost(Request request, Response response) {  
            System.out.println("doPost");  
            System.out.println(request.getRequestBody());  
              
            response.write("helloWorld.....");  
        }  
      
          
    }  


启动服务器类,浏览器输出http://localhost:8080/myApp/firstHandler?aaa=aaa&bbb=bbb

显示hello world....

 

XmlUtils类是用来解析xml文件的,没有放到这里.

 

重定向代码实例:
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    <pre class="java" name="code">Headers responseHeaders = httpExchange.getResponseHeaders();  
                responseHeaders.add("location", "http://www.baidu.com");  
                httpExchange.sendResponseHeaders(302, 0);  
                httpExchange.close();  
                OutputStream out = httpExchange.getResponseBody();   
                out.write(result.getBytes());  
                out.flush();  

 

 

工具类:
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.utils;  
      
    import java.io.CharArrayReader;  
    import java.io.File;  
    import java.lang.reflect.Constructor;  
    import java.lang.reflect.Field;  
    import java.lang.reflect.Method;  
    import java.util.HashMap;  
    import java.util.Iterator;  
    import java.util.LinkedList;  
    import java.util.Map;  
    import java.util.Properties;  
    import java.util.regex.Matcher;  
    import java.util.regex.Pattern;  
      
    import javax.xml.parsers.DocumentBuilder;  
    import javax.xml.transform.OutputKeys;  
    import javax.xml.transform.Transformer;  
    import javax.xml.transform.TransformerConfigurationException;  
    import javax.xml.transform.TransformerException;  
    import javax.xml.transform.TransformerFactory;  
    import javax.xml.transform.dom.DOMSource;  
    import javax.xml.transform.stream.StreamResult;  
      
    import org.w3c.dom.Comment;  
    import org.w3c.dom.Document;  
    import org.w3c.dom.Element;  
    import org.w3c.dom.Node;  
    import org.w3c.dom.NodeList;  
    import org.xml.sax.InputSource;  
      
    /**
     * <p>
     * Title: XmlUtils
     * </p>
     * <p>
     * Description: XML文件处理工具
     * </p>
     * <p>
     * Copyright: Copyright (c) 2008
     * </p>
     * <p>
     * Company: Ocean Blue Mobile Tech.
     * </p>
     *  
     * @author chur
     * @version 1.0
     */  
    public class XmlUtils {  
        public static final String BR = System.getProperty("line.separator");  
      
        /**
         * load a xml file from OS file system and interpret it into a Document no
         * charset limited
         *  
         * @param xmlfile
         *            String 文件路径名
         * @return Document
         * @throws Exception
         */  
        public static Document load(String xmlfile) throws Exception {  
            javax.xml.parsers.DocumentBuilderFactory factory =  
      
            javax.xml.parsers.DocumentBuilderFactory.newInstance();  
            factory.setIgnoringComments(false);  
            factory.setIgnoringElementContentWhitespace(false);  
            factory.setValidating(false);  
            factory.setCoalescing(false);  
            DocumentBuilder builder = factory.newDocumentBuilder();  
      
            return builder.parse(xmlfile);  
        }  
      
        /**
         * load a xml file from OS file system and interpret it into a Document no
         * charset limited
         *  
         * @param xmlfile
         *            String 文件路径名
         * @return Document
         * @throws Exception
         */  
        public static Document load(File xmlfile) throws Exception {  
            javax.xml.parsers.DocumentBuilderFactory factory =  
      
            javax.xml.parsers.DocumentBuilderFactory.newInstance();  
            factory.setIgnoringComments(false);  
            factory.setIgnoringElementContentWhitespace(false);  
            factory.setValidating(false);  
            factory.setCoalescing(false);  
            DocumentBuilder builder = factory.newDocumentBuilder();  
      
            return builder.parse(xmlfile);  
        }  
      
        /**
         * 取得文件名
         *  
         * @param filePath
         *            String
         * @return String
         */  
        public static String getFileName(String filePath) {  
            Pattern p = Pattern.compile("[^\\" + File.separator + "]+.xml");  
            Matcher m = p.matcher(filePath);  
            if (m.find()) {  
                return m.group().substring(0, m.group().length() - 4);  
            }  
            return "";  
        }  
      
        /**
         * 验证文件名是否合法
         *  
         * @param filePath
         *            String
         * @return String
         */  
        public static boolean checkValidity(String filePath) {  
            String[] array = filePath.split(".");  
            if (array[array.length - 1].equals("xml")) {  
                return true;  
            } else {  
                return false;  
            }  
        }  
      
        public static boolean isXml(String file) {  
            if (file.toLowerCase().endsWith("xml")) {  
                return true;  
            } else {  
                return false;  
            }  
        }  
      
        /**
         * load a String without the title tag of xml into a Document
         *  
         * @param domContent
         *            String 没有head的XML内容
         * @return Document
         * @throws Exception
         */  
        public static Document loadStringWithoutTitle(String domContent)  
                throws Exception {  
            domContent = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + BR  
                    + domContent;  
            return XmlUtils.loadString(domContent);  
        }  
      
        /**
         * load a String with a title tag of xml into a Document
         *  
         * @param domContent
         *            String XML内容
         * @return Document
         * @throws Exception
         */  
        public static Document loadString(String domContent) throws Exception {  
            javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();  
            factory.setIgnoringComments(false);  
            factory.setIgnoringElementContentWhitespace(false);  
            factory.setValidating(false);  
            factory.setCoalescing(false);  
            DocumentBuilder builder = factory.newDocumentBuilder();  
      
            char[] chars = new char[domContent.length()];  
            domContent.getChars(0, domContent.length(), chars, 0);  
            InputSource is = new InputSource(new CharArrayReader(chars));  
            return (builder.parse(is));  
        }  
      
        /**
         * 根据完整路径得到整个文档的一个子节点的文字
         *  
         * @param doc
         *            Document 文档
         * @param fullname
         *            String 子节点完整路径
         * @return String
         */  
        public static String getTextByFullName(Document doc, String fullname) {  
            String path[] = StringUtils.toStringArray(fullname, ".");  
            Element e = doc.getDocumentElement();  
            for (int i = 1; i < path.length; i++) {  
                e = getChildByName(e, path[i]);  
            }  
            return getText(e);  
        }  
      
        /**
         * 根据完整路径得到某个节点的一个子节点的文字
         *  
         * @param parent
         *            Element 父节点
         * @param fullname
         *            String 子节点完整路径
         * @return String
         */  
        public static String getTextByFullName(Element parent, String fullname) {  
            String path[] = StringUtils.toStringArray(fullname, ".");  
            Element e = parent;  
            for (int i = 0; i < path.length; i++) {  
                e = getChildByName(e, path[i]);  
            }  
            return getText(e);  
        }  
      
        /**
         * 根据一个document对象获取某节点下的property的内容
         * @param parent
         *            Element
         * @param name
         *            String
         * @return String
         */  
        public static String getChildText(Element parent, String name) {  
            Element e = getChildByName(parent, name);  
            if (e == null) {  
                return "";  
            }  
            return getText(e);  
        }  
      
        /**
         * 根据名称得到一个父节点下所有的子节点
         *  
         * @param e
         *            Element
         * @param name
         *            String
         * @return Element[]
         */  
        public static Element[] getChildrenByName(Element e, String name) {  
            NodeList nl = e.getChildNodes();  
            int max = nl.getLength();  
            LinkedList<Node> list = new LinkedList<Node>();  
            for (int i = 0; i < max; i++) {  
                Node n = nl.item(i);  
                if (n.getNodeType() == Node.ELEMENT_NODE  
                        && n.getNodeName().equals(name)) {  
                    list.add(n);  
                }  
            }  
            return list.toArray(new Element[list.size()]);  
        }  
      
        /**
         * 根据名字查找某个节点下的符合该名字的节点
         *  
         * @param e
         *            Element 父节点
         * @param name
         *            String 子节点名称
         * @return Element
         */  
        public static Element getChildByName(Element e, String name) {  
            Element[] list = getChildrenByName(e, name);  
            if (list.length == 0) {  
                return null;  
            }  
            if (list.length > 1) {  
                throw new IllegalStateException("Too many (" + list.length + ") '"  
                        + name + "' elements found!");  
            }  
            return list[0];  
        }  
      
        /**
         * 得到一个节点的文字
         *  
         * @param e
         *            Element
         * @return String
         */  
        public static String getText(Element e) {  
            NodeList nl = e.getChildNodes();  
            int max = nl.getLength();  
            for (int i = 0; i < max; i++) {  
                Node n = nl.item(i);  
                if (n.getNodeType() == Node.TEXT_NODE) {  
                    return n.getNodeValue();  
                }  
            }  
            return "";  
        }  
      
        public static String getAttribute(Element e, String name) {  
            return e.getAttribute(name);  
        }  
      
        /**
         * get Int value
         *  
         * @param player
         * @param name
         * @return
         */  
        public static int getIntValue(Element e) {  
            return Integer.valueOf(getText(e));  
        }  
      
        /**
         * get byte value
         *  
         * @param player
         * @param name
         * @return
         */  
        public static byte getByteValue(Element e) {  
            return Byte.valueOf(getText(e));  
        }  
      
        /**
         * 获取Properties格式的xml数据
         *  
         * @param root
         * @return
         */  
        public static Map<String, Object> getProperties(Element root) {  
            Map<String, Object> map = new HashMap<String, Object>();  
            Element[] list = getChildrenByName(root, "property");  
            for (int i = 0; i < list.length; i++) {  
                String name = list[i].getAttribute("name");  
                String type = list[i].getAttribute("type");  
                String valueString = getText(list[i]);  
                try {  
                    Class<?> cls = Class.forName(type);  
                    Constructor<?> con = cls.getConstructor(new Class<?>[] { String.class  
      
                    });  
                    Object value = con.newInstance(new Object[] { valueString  
      
                    });  
                    map.put(name, value);  
                } catch (Exception e) {  
                    System.err.println("Unable to parse property '" + name +  
      
                    "'='" + valueString + "': " + e.toString());  
                }  
            }  
            return map;  
        }  
      
        /**
         * 将dom中的内容存入xmlfile所指的文件中。 dom==null时,xml文件也是空的。
         *  
         * @param xmlfile
         *            java.lang.String 保存的文件名
         * @param doc
         *            ort.w3c.dom.Document 需要保存的DOM
         * @throws Exception
         *             任何异常
         */  
        public static void save(String xmlfile, Document doc) throws Exception {  
            // 首先创建一个DOMSource对象,该构造函数的参数可以是一个Document对象  
            // doc代表更改后的DOM Tree。  
            DOMSource doms = new DOMSource(doc);  
      
            // 创建一个File对象,代表DOM Tree所包含的数据的输出介质,这是一个XML文件。  
            File f = new File(xmlfile);  
            File dir = f.getParentFile();  
            dir.mkdirs();  
            // 创建一个StreamResult对象,该构造函数的参数可以取为File对象。  
            StreamResult sr = new StreamResult(f);  
      
            // 下面调用JAXP中的XSLT引擎来实现输出DOM Tree中的数据到XML文件中的功能。  
            // XSLT引擎的输入为DOMSource对象,输出为StreamResut对象。  
            try {  
                // 首先创建一个TransformerFactory对象,再由此创建Transformer对象。Transformer  
                // 类相当于一个XSLT引擎。通常我们使用它来处理XSL文件,但是在这里我们使  
                // 用它来输出XML文档。  
                TransformerFactory tf = TransformerFactory.newInstance();  
                Transformer t = tf.newTransformer();  
                // 设置新的输出属性:输出字符编码为UTF-8,XSLT引擎所输出  
                // 的XML文档如果包含了中文字符,可以正常显示,不会出现所谓的"汉字问题"。  
                // 请留意OutputKeys类的字符串常数OutputKeys.ENCODING。  
                Properties properties = t.getOutputProperties();  
                properties.setProperty(OutputKeys.ENCODING, "UTF-8");  
                properties.setProperty(OutputKeys.INDENT, "yes");  
                // 更新XSLT引擎的输出属性。  
                t.setOutputProperties(properties);  
                // 关键的一步, 调用Transformer对象 (XSLT引擎)的transform()方法,该方法的第一  
                // 个参数是DOMSource对象,第二个参数是StreamResult对象。  
                t.transform(doms, sr);  
      
            } catch (TransformerConfigurationException tce) {  
                tce.printStackTrace();  
            } catch (TransformerException te) {  
                te.printStackTrace();  
            }  
      
        }  
      
        /**
         * create a blank Document.
         *  
         * @param rootElementName
         *            String
         * @return Document
         * @throws Exception
         */  
        public static Document blankDocument(String rootElementName)  
                throws Exception {  
            javax.xml.parsers.DocumentBuilderFactory factory =  
      
            javax.xml.parsers.DocumentBuilderFactory.newInstance();  
            factory.setIgnoringComments(false);  
            factory.setIgnoringElementContentWhitespace(false);  
            factory.setValidating(false);  
            factory.setCoalescing(false);  
            DocumentBuilder builder = factory.newDocumentBuilder();  
            Document doc = builder.newDocument();  
            Element root = doc.createElement(rootElementName);  
            doc.appendChild(root);  
            return doc;  
        }  
      
        public static Element createChild(Document doc, Element root, String name) {  
            Element elem = doc.createElement(name);  
            root.appendChild(elem);  
            return elem;  
        }  
      
        public static void createChildText(Document doc, Element elem, String name,  
                String value) {  
            Element child = doc.createElement(name);  
            child.appendChild(doc.createTextNode(value == null ? "" : value));  
            elem.appendChild(child);  
        }  
      
        /**
         * 创建一个带注释的子节点
         *  
         * @param doc
         *            Document
         * @param elem
         *            Element
         * @param name
         *            String
         * @param value
         *            String
         * @param comment
         *            String
         */  
        public static void createChildTextWithComment(Document doc, Element elem,  
                String name, String value, String comment) {  
            Element child = doc.createElement(name);  
            child.appendChild(doc.createTextNode(value == null ? "" : value));  
            Comment c = doc.createComment(comment);  
            elem.appendChild(c);  
            elem.appendChild(child);  
      
        }  
      
        /**
         * 创建一段注释
         *  
         * @param doc
         *            Document
         * @param comment
         *            String
         */  
        public static void createComment(Document doc, String comment) {  
            Comment c = doc.createComment(comment);  
            doc.getDocumentElement().appendChild(c);  
        }  
      
        public static void createOptionalChildText(Document doc, Element elem,  
                String name, String value) {  
            if (value == null || value.length() == 0) {  
                return;  
            }  
            Element child = doc.createElement(name);  
            child.appendChild(doc.createTextNode(value));  
            elem.appendChild(child);  
        }  
      
        public static void applyProperties(Object o, Element root) {  
            Map<String,Object> map = getProperties(root);  
            Iterator<String> it = map.keySet().iterator();  
            Field[] fields = o.getClass().getFields();  
            Method[] methods = o.getClass().getMethods();  
            while (it.hasNext()) {  
                String name = (String) it.next();  
                Object value = map.get(name);  
                try {  
                    for (int i = 0; i < fields.length; i++) {  
                        if (fields[i].getName().equalsIgnoreCase(name) && isTypeMatch(fields[i].getType(),  
                            value.getClass())) {  
                            fields[i].set(o, value);  
                            System.err.println("Set field " + fields  
      
                            [i].getName() + "=" + value);  
                            break;  
                        }  
                    }  
                    for (int i = 0; i < methods.length; i++) {  
                        if (methods[i].getName().equalsIgnoreCase("set" + name) && methods[i].getParameterTypes  
      
                        ().length == 1 && isTypeMatch(methods  
      
                        [i].getParameterTypes()[0], value.getClass())) {  
                            methods[i].invoke(o, new Object[] { value  
      
                            });  
                            System.err.println("Set method " + methods  
      
                            [i].getName() + "=" + value);  
                            break;  
                        }  
                    }  
                } catch (Exception e) {  
                    System.err.println("Unable to apply property '" + name + "': " + e.toString());  
                }  
            }  
        }  
      
        private static boolean isTypeMatch(Class<?> one, Class<?> two) {  
            if (one.equals(two)) {  
                return true;  
            }  
            if (one.isPrimitive()) {  
                if (one.getName().equals("int") && two.getName().equals("java.lang.Integer")) {  
                    return true;  
                }  
                if (one.getName().equals("long") && two.getName().equals("java.lang.Long")) {  
                    return true;  
                }  
                if (one.getName().equals("float") && two.getName().equals("java.lang.Float")) {  
                    return true;  
                }  
                if (one.getName().equals("double") && two.getName().equals("java.lang.Double")) {  
                    return true;  
                }  
                if (one.getName().equals("char") && two.getName().equals("java.lang.Character")) {  
                    return true;  
                }  
                if (one.getName().equals("byte") && two.getName().equals("java.lang.Byte")) {  
                    return true;  
                }  
                if (one.getName().equals("short") && two.getName().equals("java.lang.Short")) {  
                    return true;  
                }  
                if (one.getName().equals("boolean") && two.getName().equals("java.lang.Boolean")) {  
                    return true;  
                }  
            }  
            return false;  
        }  
    }  


 
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片


    package com.tdt.server.httpserver.utils;  
      
    import java.util.LinkedList;  
    import java.util.StringTokenizer;  
    import java.util.regex.Matcher;  
    import java.util.regex.Pattern;  
      
    public class StringUtils {  
        /**
         * Converts a line of text into an array of lower case words. Words are
         * delimited by the following characters: , .\r\n:/\+
         * <p>
         * In the future, this method should be changed to use a
         * BreakIterator.wordInstance(). That class offers much more fexibility.
         *  
         * @param text
         *            a String of text to convert into an array of words
         * @return text broken up into an array of words.
         */  
        public static final String[] toLowerCaseWordArray(String text) {  
            if (text == null || text.length() == 0) {  
                return new String[0];  
            }  
            StringTokenizer tokens = new StringTokenizer(text, " ,\r\n.:/\\+");  
            String[] words = new String[tokens.countTokens()];  
            for (int i = 0; i < words.length; i++) {  
                words[i] = tokens.nextToken().toLowerCase();  
            }  
            return words;  
        }  
      
        /**
         * Converts a line of text into an array of lower case words. Words are
         * delimited by the following characters: , .\r\n:/\+
         * <p>
         * In the future, this method should be changed to use a
         * BreakIterator.wordInstance(). That class offers much more fexibility.
         *  
         * @param text
         *            a String of text to convert into an array of words
         * @return text broken up into an array of words.
         */  
        public static final String[] toStringArray(String text) {  
            if (text == null || text.length() == 0) {  
                return new String[0];  
            }  
            StringTokenizer tokens = new StringTokenizer(text, ",\r\n/\\");  
            String[] words = new String[tokens.countTokens()];  
            for (int i = 0; i < words.length; i++) {  
                words[i] = tokens.nextToken();  
            }  
            return words;  
        }  
      
        /**
         * * Converts a line of text into an array of lower case words. Words are
         * delimited by the following characters: , .\r\n:/\+
         * <p>
         * In the future, this method should be changed to use a
         * BreakIterator.wordInstance(). That class offers much more fexibility.
         *  
         * @param text
         *            a String of text to convert into an array of words
         * @param token
         *            String
         * @return String[]broken up into an array of words.
         */  
        public static final String[] toStringArray(String text, String token) {  
            if (text == null || text.length() == 0) {  
                return new String[0];  
            }  
            StringTokenizer tokens = new StringTokenizer(text, token);  
            String[] words = new String[tokens.countTokens()];  
            for (int i = 0; i < words.length; i++) {  
                words[i] = tokens.nextToken();  
            }  
            return words;  
        }  
      
        /**
         *  
         * @param source
         * @return
         */  
        public static String[] splitOnWhitespace(String source) {  
            int pos = -1;  
            LinkedList<String> list = new LinkedList<String>();  
            int max = source.length();  
            for (int i = 0; i < max; i++) {  
                char c = source.charAt(i);  
                if (Character.isWhitespace(c)) {  
                    if (i - pos > 1) {  
                        list.add(source.substring(pos + 1, i));  
                    }  
                    pos = i;  
                }  
            }  
            return list.toArray(new String[list.size()]);  
        }  
      
        /**
         * Replayer str
         *  
         * @param str
         * @param key
         * @param replacement
         * @return
         */  
        public static final String replaceAll(String str, String key,  
                String replacement) {  
            if (str != null && key != null && replacement != null  
                    && !str.equals("") && !key.equals("")) {  
                StringBuilder strbuf = new StringBuilder();  
                int begin = 0;  
                int slen = str.length();  
                int npos = 0;  
                int klen = key.length();  
                for (; begin < slen && (npos = str.indexOf(key, begin)) >= begin; begin = npos  
                        + klen) {  
                    strbuf.append(str.substring(begin, npos)).append(replacement);  
                }  
      
                if (begin == 0) {  
                    return str;  
                }  
                if (begin < slen) {  
                    strbuf.append(str.substring(begin));  
                }  
                return strbuf.toString();  
            } else {  
                return str;  
            }  
        }  
          
          
        public static String UnicodeToString(String str) {      
            Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");      
            Matcher matcher = pattern.matcher(str);      
            char ch;     
            boolean hasU = false;  
            while (matcher.find()) {     
                hasU = true;  
                ch = (char) Integer.parseInt(matcher.group(2), 16);       
                str = str.replace(matcher.group(1), ch + "");      
            }   
            String s = str;  
            try{  
                if(!hasU){  
                    int i = 0;  
                    String rstr = "";  
                    while(i+4<=str.length()){  
                        ch = (char) Integer.parseInt(str.substring(i,i=i+4), 16);   
                        rstr = rstr+ch;  
                    }  
                    str = rstr;  
                }  
            }catch(Exception ex){  
                str = s;  
                ex.printStackTrace();  
            }  
            return str;     
        }   
        /** 空字符串。 */  
        public static final String EMPTY_STRING = "";  
      
        /**
         * 比较两个字符串(大小写敏感)。
         * <pre>
         * StringUtil.equals(null, null)   = true
         * StringUtil.equals(null, "abc")  = false
         * StringUtil.equals("abc", null)  = false
         * StringUtil.equals("abc", "abc") = true
         * StringUtil.equals("abc", "ABC") = false
         * </pre>
         *
         * @param str1 要比较的字符串1
         * @param str2 要比较的字符串2
         *
         * @return 如果两个字符串相同,或者都是<code>null</code>,则返回<code>true</code>
         */  
        public static boolean equals(String str1, String str2) {  
            if (str1 == null) {  
                return str2 == null;  
            }  
      
            return str1.equals(str2);  
        }  
      
        /**
         * 比较两个字符串(大小写不敏感)。
         * <pre>
         * StringUtil.equalsIgnoreCase(null, null)   = true
         * StringUtil.equalsIgnoreCase(null, "abc")  = false
         * StringUtil.equalsIgnoreCase("abc", null)  = false
         * StringUtil.equalsIgnoreCase("abc", "abc") = true
         * StringUtil.equalsIgnoreCase("abc", "ABC") = true
         * </pre>
         *
         * @param str1 要比较的字符串1
         * @param str2 要比较的字符串2
         *
         * @return 如果两个字符串相同,或者都是<code>null</code>,则返回<code>true</code>
         */  
        public static boolean equalsIgnoreCase(String str1, String str2) {  
            if (str1 == null) {  
                return str2 == null;  
            }  
      
            return str1.equalsIgnoreCase(str2);  
        }  
      
        /**
         * 检查字符串是否是空白:<code>null</code>、空字符串<code>""</code>或只有空白字符。
         * <pre>
         * StringUtil.isBlank(null)      = true
         * StringUtil.isBlank("")        = true
         * StringUtil.isBlank(" ")       = true
         * StringUtil.isBlank("bob")     = false
         * StringUtil.isBlank("  bob  ") = false
         * </pre>
         *
         * @param str 要检查的字符串
         *
         * @return 如果为空白, 则返回<code>true</code>
         */  
        public static boolean isBlank(String str) {  
            int length;  
      
            if ((str == null) || ((length = str.length()) == 0)) {  
                return true;  
            }  
      
            for (int i = 0; i < length; i++) {  
                if (!Character.isWhitespace(str.charAt(i))) {  
                    return false;  
                }  
            }  
      
            return true;  
        }  
      
        /**
         * 检查字符串是否不是空白:<code>null</code>、空字符串<code>""</code>或只有空白字符。
         * <pre>
         * StringUtil.isBlank(null)      = false
         * StringUtil.isBlank("")        = false
         * StringUtil.isBlank(" ")       = false
         * StringUtil.isBlank("bob")     = true
         * StringUtil.isBlank("  bob  ") = true
         * </pre>
         *
         * @param str 要检查的字符串
         *
         * @return 如果为空白, 则返回<code>true</code>
         */  
        public static boolean isNotBlank(String str) {  
            int length;  
      
            if ((str == null) || ((length = str.length()) == 0)) {  
                return false;  
            }  
      
            for (int i = 0; i < length; i++) {  
                if (!Character.isWhitespace(str.charAt(i))) {  
                    return true;  
                }  
            }  
      
            return false;  
        }  
      
        /**
         * 检查字符串是否为<code>null</code>或空字符串<code>""</code>。
         * <pre>
         * StringUtil.isEmpty(null)      = true
         * StringUtil.isEmpty("")        = true
         * StringUtil.isEmpty(" ")       = false
         * StringUtil.isEmpty("bob")     = false
         * StringUtil.isEmpty("  bob  ") = false
         * </pre>
         *
         * @param str 要检查的字符串
         *
         * @return 如果为空, 则返回<code>true</code>
         */  
        public static boolean isEmpty(String str) {  
            return ((str == null) || (str.length() == 0));  
        }  
      
        /**
         * 检查字符串是否不是<code>null</code>和空字符串<code>""</code>。
         * <pre>
         * StringUtil.isEmpty(null)      = false
         * StringUtil.isEmpty("")        = false
         * StringUtil.isEmpty(" ")       = true
         * StringUtil.isEmpty("bob")     = true
         * StringUtil.isEmpty("  bob  ") = true
         * </pre>
         *
         * @param str 要检查的字符串
         *
         * @return 如果不为空, 则返回<code>true</code>
         */  
        public static boolean isNotEmpty(String str) {  
            return ((str != null) && (str.length() > 0));  
        }  
      
        /**
         * 在字符串中查找指定字符串,并返回第一个匹配的索引值。如果字符串为<code>null</code>或未找到,则返回<code>-1</code>。
         * <pre>
         * StringUtil.indexOf(null, *)          = -1
         * StringUtil.indexOf(*, null)          = -1
         * StringUtil.indexOf("", "")           = 0
         * StringUtil.indexOf("aabaabaa", "a")  = 0
         * StringUtil.indexOf("aabaabaa", "b")  = 2
         * StringUtil.indexOf("aabaabaa", "ab") = 1
         * StringUtil.indexOf("aabaabaa", "")   = 0
         * </pre>
         *
         * @param str 要扫描的字符串
         * @param searchStr 要查找的字符串
         *
         * @return 第一个匹配的索引值。如果字符串为<code>null</code>或未找到,则返回<code>-1</code>
         */  
        public static int indexOf(String str, String searchStr) {  
            if ((str == null) || (searchStr == null)) {  
                return -1;  
            }  
      
            return str.indexOf(searchStr);  
        }  
      
        /**
         * 在字符串中查找指定字符串,并返回第一个匹配的索引值。如果字符串为<code>null</code>或未找到,则返回<code>-1</code>。
         * <pre>
         * StringUtil.indexOf(null, *, *)          = -1
         * StringUtil.indexOf(*, null, *)          = -1
         * StringUtil.indexOf("", "", 0)           = 0
         * StringUtil.indexOf("aabaabaa", "a", 0)  = 0
         * StringUtil.indexOf("aabaabaa", "b", 0)  = 2
         * StringUtil.indexOf("aabaabaa", "ab", 0) = 1
         * StringUtil.indexOf("aabaabaa", "b", 3)  = 5
         * StringUtil.indexOf("aabaabaa", "b", 9)  = -1
         * StringUtil.indexOf("aabaabaa", "b", -1) = 2
         * StringUtil.indexOf("aabaabaa", "", 2)   = 2
         * StringUtil.indexOf("abc", "", 9)        = 3
         * </pre>
         *
         * @param str 要扫描的字符串
         * @param searchStr 要查找的字符串
         * @param startPos 开始搜索的索引值,如果小于0,则看作0
         *
         * @return 第一个匹配的索引值。如果字符串为<code>null</code>或未找到,则返回<code>-1</code>
         */  
        public static int indexOf(String str, String searchStr, int startPos) {  
            if ((str == null) || (searchStr == null)) {  
                return -1;  
            }  
      
            // JDK1.3及以下版本的bug:不能正确处理下面的情况  
            if ((searchStr.length() == 0) && (startPos >= str.length())) {  
                return str.length();  
            }  
      
            return str.indexOf(searchStr, startPos);  
        }  
      
        /**
         * 取指定字符串的子串。
         *  
         * <p>
         * 负的索引代表从尾部开始计算。如果字符串为<code>null</code>,则返回<code>null</code>。
         * <pre>
         * StringUtil.substring(null, *, *)    = null
         * StringUtil.substring("", * ,  *)    = "";
         * StringUtil.substring("abc", 0, 2)   = "ab"
         * StringUtil.substring("abc", 2, 0)   = ""
         * StringUtil.substring("abc", 2, 4)   = "c"
         * StringUtil.substring("abc", 4, 6)   = ""
         * StringUtil.substring("abc", 2, 2)   = ""
         * StringUtil.substring("abc", -2, -1) = "b"
         * StringUtil.substring("abc", -4, 2)  = "ab"
         * </pre>
         * </p>
         *
         * @param str 字符串
         * @param start 起始索引,如果为负数,表示从尾部计算
         * @param end 结束索引(不含),如果为负数,表示从尾部计算
         *
         * @return 子串,如果原始串为<code>null</code>,则返回<code>null</code>
         */  
        public static String substring(String str, int start, int end) {  
            if (str == null) {  
                return null;  
            }  
      
            if (end < 0) {  
                end = str.length() + end;  
            }  
      
            if (start < 0) {  
                start = str.length() + start;  
            }  
      
            if (end > str.length()) {  
                end = str.length();  
            }  
      
            if (start > end) {  
                return EMPTY_STRING;  
            }  
      
            if (start < 0) {  
                start = 0;  
            }  
      
            if (end < 0) {  
                end = 0;  
            }  
      
            return str.substring(start, end);  
        }  
      
        /**
         * 检查字符串中是否包含指定的字符串。如果字符串为<code>null</code>,将返回<code>false</code>。
         * <pre>
         * StringUtil.contains(null, *)     = false
         * StringUtil.contains(*, null)     = false
         * StringUtil.contains("", "")      = true
         * StringUtil.contains("abc", "")   = true
         * StringUtil.contains("abc", "a")  = true
         * StringUtil.contains("abc", "z")  = false
         * </pre>
         *
         * @param str 要扫描的字符串
         * @param searchStr 要查找的字符串
         *
         * @return 如果找到,则返回<code>true</code>
         */  
        public static boolean contains(String str, String searchStr) {  
            if ((str == null) || (searchStr == null)) {  
                return false;  
            }  
      
            return str.indexOf(searchStr) >= 0;  
        }  
      
        /**
         * <p>Checks if the String contains only unicode digits.
         * A decimal point is not a unicode digit and returns false.</p>
         *
         * <p><code>null</code> will return <code>false</code>.
         * An empty String ("") will return <code>true</code>.</p>
         *
         * <pre>
         * StringUtils.isNumeric(null)   = false
         * StringUtils.isNumeric("")     = true
         * StringUtils.isNumeric("  ")   = false
         * StringUtils.isNumeric("123")  = true
         * StringUtils.isNumeric("12 3") = false
         * StringUtils.isNumeric("ab2c") = false
         * StringUtils.isNumeric("12-3") = false
         * StringUtils.isNumeric("12.3") = false
         * </pre>
         *
         * @param str  the String to check, may be null
         * @return <code>true</code> if only contains digits, and is non-null
         */  
        public static boolean isNumeric(String str) {  
            if (str == null) {  
                return false;  
            }  
            int sz = str.length();  
            for (int i = 0; i < sz; i++) {  
                if (Character.isDigit(str.charAt(i)) == false) {  
                    return false;  
                }  
            }  
            return true;  
        }  
      
        /**
         * 字符串拼接
         * @param object
         * @return
         */  
        public static String assemble(char sep,Object... object){  
            if(object == null)return null;  
            StringBuilder sb = new StringBuilder();  
            for(Object obj:object){  
                if(obj == null)obj="";  
                sb.append(obj.toString()).append(sep);  
            }  
            String str = "";  
            if(sb.length()>0){  
                str = sb.substring(0, sb.length()-1);  
            }  
            return str;  
        }  
      
        // 6-16个字母和数字组成  
        private static String regex = "^[A-Za-z0-9]$";  
        /**
         * 检测字符串是否符合规则(6-16个字母和数字组成,大小写不敏感)
         * @param user
         * @return
         */  
        public static boolean checkStringLegal(String user) {  
            boolean isMatch = true;  
            char[] userChars = user.toCharArray();  
            for(char c : userChars){  
                isMatch = String.valueOf(c).matches(regex);  
                if(!isMatch){  
                    break;  
                }  
            }  
            return isMatch;  
        }  
          
      
        public static String getString(String input) {  
            return getString(input, true, "");  
        }  
      
        public static String getString(String input, boolean btrim, String dval) {  
            if (input == null)  
                return dval;  
            try {  
                if (btrim)  
                    return trim(input);  
                else  
                    return input;  
            } catch (Exception e) {  
                return "";  
            }  
        }  
      
        public static String Trim(String str) {  
            return trim(str);  
        }  
      
        public static String[] Trim(String[] s) {  
            return trim(s);  
        }  
      
        public static String trim(String str) {  
            if (str == null)  
                return "";  
            else  
                return str.trim();  
        }  
      
        public static String[] trim(String[] s) {  
            if (s == null || s.length <= 0)  
                return s;  
            for (int i = 0; i < s.length; i++)  
                s[i] = trim(s[i]);  
            return s;  
        }  
      
        public static int getInt(String input, boolean btrim, int dval) {  
            if (input == null)  
                return dval;  
            int val;  
            try {  
                String str = new String(input);  
                if (btrim)  
                    str = trim(str);  
                val = Integer.parseInt(str);  
            } catch (Exception e) {  
                val = dval;  
            }  
            return val;  
        }  
          
        public static int[] getInts(String input) {  
            return getInts(input, ",");  
        }  
      
        public static int[] getInts(String input, String split) {  
            if (input == null) {  
                return null;  
            }  
              
            String[] ss = input.split(split);  
            int[] ii = new int[ss.length];  
            for (int i=0;i<ii.length;i++) {  
                ii[i] = getInt(ss[i]);  
            }  
            return ii;  
        }  
      
        public static int getInt(String input) {  
            return getInt(input, true, 0);  
        }  
          
          
    }  


你可能感兴趣的:(java,httpserver)