jdk6的httpserver小试

网上一堆例子,个人做一个,有下载,可以用模板的小例子。(Groovy)

 

尤其是在团队做demo时候使用,实时更新最先代码。

 

代码如下:

 

import com.sun.net.httpserver.*
import org.apache.commons.io.IOUtils
import org.lilystudio.smarty4j.*

class TplHandler implements HttpHandler {
    def engine = new Engine()
    final String contextDir = "../"
    final String encoding = "GBK"
    
    public TplHandler(){
        engine.setTemplatePath(contextDir)
        engine.setEncoding(encoding)
		engine.setDebug(true)
    }

    def out(Map map, String tpl, Writer writer) {
        def template = engine.getTemplate(tpl)
        def ctx = new Context()
        ctx.putAll(map)
		template.merge(ctx, writer)
    }   


    void handle(HttpExchange he) {
		he.sendResponseHeaders(200, 0)

    //  def is = he.requestBody
    //  def reader = new BufferedReader(new InputStreamReader(is))
    //  List lines = reader.readLines() 

    //  String path = he.httpContext.path
        def uri = he.getRequestURI() 
        String tpl = uri.path

		// 如果是下载
		if(tpl.endsWith('download')){
			try {
				def ant = new AntBuilder()
				String zipFile = contextDir + '../demo.zip'
				ant.zip destfile : zipFile, basedir : contextDir

				he.responseHeaders.set("Content-Type", "application/zip")
				he.responseHeaders.set("Content-Disposition", "attachment;" + "filename=\"demo.zip\"")

				def os = he.responseBody
				def downFile = new File(zipFile)
				os.write(IOUtils.toByteArray(new FileInputStream(downFile)))
				os.flush()
				os.close()
				return
			} catch (ex) {
				println ex.message
			}
		}

        try {
			def os = he.responseBody
            if(tpl ==~ /.*\.(js|css)$/){
                def writer = new PrintWriter(new OutputStreamWriter(os, encoding))
                def file = new File(new File(contextDir), tpl)
                if(!file.exists()){
					he.responseHeaders.set("Content-Type", 'text/plain')
                    writer.println 'File not exists : ' + tpl
                }else {
					def mat = tpl =~ /.*\.(js|css)$/
					String mime = mat[0][1]
					he.responseHeaders.set("Content-Type", 
						'js' == mime ? 'application/x-javascript' : 'text/css')
                    writer.println file.text
				}

                writer.flush()
                writer.close()
            }else if(tpl ==~ /.*(?i)(\.gif|\.jpg|\.png)$/){
                def mat = tpl =~ /.*(?i)\.(gif|jpg|png)$/
                he.responseHeaders.set("Content-Type", "image/" + mat[0][1])

                def file = new File(new File(contextDir), tpl)
                def defaultFile = new File(new File(contextDir), 'images/calen_pic.gif')

                if(!file.exists())
                    os.write(IOUtils.toByteArray(new FileInputStream(defaultFile)))
                else
                    os.write(IOUtils.toByteArray(new FileInputStream(file)))

				os.flush()
				os.close()
            }else{
				he.responseHeaders.set("Content-Type", "text/html;charset=" + encoding)

                Map params = [:]
                def writer = new PrintWriter(new OutputStreamWriter(os, encoding))

				try {
					out(params, tpl, writer)
				} catch (ex) {
					writer.println ex.message
				} finally {
					writer.flush()
					writer.close()				    
				}
            }
        } catch (ex) {
			he.responseHeaders.set("Content-Type", "text/plain;charset=" + encoding)

            def writer = new PrintWriter(new OutputStreamWriter(os, encoding))
            writer.println ex.message
			writer.flush()
			writer.close()
        } 
    }
}


HttpServer hs = HttpServer.create(new InetSocketAddress(8888), 0)
hs.createContext("/", new TplHandler())
hs.start()
println(" ---Start--- ")
println(hs.getAddress().getHostName())
println(hs.getAddress().getPort())
println(hs.getAddress().getAddress())

你可能感兴趣的:(jdk6的httpserver小试)