天天看點

手寫伺服器httpserver_xml配置檔案_sax解析基礎應用JAVA205-206

鏉ユ簮锛歨ttp://www.bjsxt.com/

涓€銆丼02E205_01鎵嬪啓鏈嶅姟鍣╤ttpserver_xml閰嶇疆鏂囦歡_sax瑙f瀽鍩虹

XML

手寫伺服器httpserver_xml配置檔案_sax解析基礎應用JAVA205-206
package com.test.xml;

import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class ParseDemo {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //銆佽幏鍙栬В鏋愬伐鍘?        SAXParserFactory factory = SAXParserFactory.newInstance();
        //銆佷粠瑙f瀽宸ュ巶鑾峰彇瑙f瀽鍣?        SAXParser parser = factory.newSAXParser();
        //銆佸姞杞芥枃妗ocument娉ㄥ唽澶勭悊鍣?        //銆佺紪鍐欏鐞嗗櫒
        PersonHandler handler = new PersonHandler();
        parser.parse(Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("com/test/xml/person.xml")
                ,handler);

        List<Person> persons = handler.getPersons();
        for (Person p : persons) {
            System.out.println(p.getName() + "-->>" + p.getAge());
        }
    }

}
           
package com.test.xml;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * 瀛樺偍瀵矽薄
 */
public class PersonHandler extends DefaultHandler{
    private List<Person> persons;
    private Person person;
    private String tag;//璁闆綍鏍囩鍚?
    public List<Person> getPersons() {
        return persons;
    }

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }

    @Override
    public void startDocument() throws SAXException {
        //System.out.println("澶勭悊鏂囨。寮€濮?);
        persons = new ArrayList<Person>();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("寮€濮嬩竴涓厓绱? + qName);
        if(null!=qName){
            tag = qName;
        }
        if(null!=qName && qName.equals("person")){
            person = new Person();
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //System.out.println(new String(ch,start,length));
        String str = new String(new String(ch,start,length));
        if(null!=tag && tag.equals("name")){
            person.setName(str);
        }else if(null!=tag && tag.equals("age")){
            Integer age = Integer.valueOf(str);
            person.setAge(age);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //System.out.println("缁撴潫涓€涓厓绱? + qName);
        if(qName.equals("person")){
            this.persons.add(person);
        }
        tag = null;
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("澶勭悊鏂囨。缁撴潫");
    }
}
           
package com.test.xml;

public class Person {
    private String name;
    private int age;
    public Person() {
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
           
鎺у埗鍙拌緭鍑猴細
寮€濮嬩竴涓厓绱爌ersons
寮€濮嬩竴涓厓绱爌erson
寮€濮嬩竴涓厓绱爊ame
寮€濮嬩竴涓厓绱燼ge
寮€濮嬩竴涓厓绱爌erson
寮€濮嬩竴涓厓绱爊ame
寮€濮嬩竴涓厓绱燼ge
澶勭悊鏂囨。缁撴潫
鑷沖皧瀹?->>9000
鐧芥櫠鏅?->>7000
           

浜屻€丼02E206_01鎵嬪啓鏈嶅姟鍣╤ttpserver_xml閰嶇疆鏂囦歡_sax瑙f瀽搴旂敤

<html>
    <head>
        <title>绗竴涓〃鍗?lt;/title>
    </head>
    <body>
        <form method="get" action="http://localhost:8888/g">
            鐢ㄦ埛鍚嶏細<input type="text" name="uname" id="name">
            瀵嗙爜锛?lt;input type="password" name="pwd" id="pass">
            <input type="submit" value="鐧誨綍">
        </form>
    </body>
</html>
           

web.xml鏂囦歡

<?xml version="1.0" encoding="UTF-8" ?>
<web_app>
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.test.server2.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
        <url-pattern>/log</url-pattern>
        <url-pattern>/g</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>reg</servlet-name>
        <servlet-class>com.test.server2.RegisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>reg</servlet-name>
        <url-pattern>/reg</url-pattern>
    </servlet-mapping>
</web_app>
           

婧愮爜锛?

package com.test.server2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 鍒涘緩鏈嶅姟鍣紝骞跺惎鍔? * 1銆佽姹? * 2銆佸搷搴? */
public class Server {
    private ServerSocket server;
    private boolean isShutDown = false;

    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
    /**
     * 鍚姩鏂規硶
     */
    public void start(){        
        start();
    }
    /**
     * 鎸囧畾绔彛鐨勫惎鍔ㄦ柟娉?     */
    public void start(int port){        
        try {
            server = new ServerSocket(port);
            this.receive();
        } catch (IOException e) {
            //e.printStackTrace();
            stop();
        }
    }
    /**
     * 鎺ユ敹瀹㈡埛绔?     */
    private void receive(){
        try {
            //璇鋒眰鍙婂搷搴?            while(!isShutDown){
                new Thread(new Dispatcher(server.accept())).start();
            }
        } catch (IOException e) {
            //e.printStackTrace();
            stop();
        }
    }
    /**
     * 鍋滄鏈嶅姟鍣?     */
    public void stop(){
        isShutDown = true;
        try {
            if(!(null==server)){
                server.close();
            }
        } catch (IOException e) {
            //e.printStackTrace();
        }
    }
}
           
package com.test.server2;

import java.io.IOException;
import java.net.Socket;
/**
 * 涓€涓姹備笌鍝嶅簲锛屽氨涓€涓璞? */
public class Dispatcher implements Runnable{
    private Socket client;
    private Request req;
    private Response rep;
    private int code = ;

    Dispatcher(Socket client){
        this.client = client;
        try {
            req = new Request(client.getInputStream());
            rep = new Response(client.getOutputStream());
        } catch (IOException e) {
            //e.printStackTrace();
            code = ;
            try {
                rep.pushToClient(code);
            } catch (IOException e1) {
                //e1.printStackTrace();
            }
            return;
        }
    }

    @Override
    public void run() {
        try {
            Servlet serv = WebApp.getServlet(req.getUrl());
            if(null==serv){
                this.code = ;//鎵句笉鍒闆鐞?            }else{
                serv.service(req, rep);
            }
            rep.pushToClient(code);//鎺ㄩ€佸埌瀹㈡埛绔?        } catch (Exception e) {
            //e.printStackTrace();
            this.code = ;
            try {
                rep.pushToClient(code);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        try {
            client.close();
        } catch (IOException e) {
            //e.printStackTrace();
        }
    }
}
           
package com.test.server2;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
/**
 * 灏佽request
 */
public class Request {
    //璇鋒眰鏂瑰紡
    private String method;
    //璇鋒眰璧勬簮
    private String url;
    //璇鋒眰鍙傛暟
    private Map<String,List<String>> parameterMapValues;

    //鍐呴儴
    public static final String CRLF = "\r\n";
    private InputStream is;
    private String requestInfo;

    public Request(){
        method = "";
        url = "";
        parameterMapValues = new HashMap<String,List<String>>();
        requestInfo = "";
    }
    public Request(InputStream is){
        this();
        this.is = is;
        try {
            byte[] data = new byte[];
            int len = is.read(data);
            requestInfo = new String(data,,len);
        } catch (IOException e) {
            return;
        }
        //鍒嗘瀽璇鋒眰淇℃伅
        parseRequestInfo();
    }

    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    /**
     * 鍒嗘瀽璇鋒眰淇℃伅
     */
    private void parseRequestInfo(){
        if((null==requestInfo) || (requestInfo=requestInfo.trim()).equals("")){
            return;
        }

        /**
         * ====================================
         * 浠庝俊鎭殑棣栬鍒嗚В鍑猴細璇鋒眰鏂瑰紡  璇鋒眰璺緞  璇鋒眰鍙傛暟锛坓et鍙兘瀛樺湪锛?         *   濡傦細GET /index.html?uname=intputUname&pwd=inputPassword HTTP/1.1
         * 
         * 濡傛灉涓簆ost鏂瑰紡锛岃姹傚弬鏁闆彲鑳藉湪鏈€鍚庢鏂囦腑
         * ====================================
         */
        String paramString = "";//鎺ユ敹璇鋒眰鍙傛暟
        int positionCRLF = ;

        positionCRLF = requestInfo.indexOf(CRLF);
        if (positionCRLF == -){
            return;
        }
        //1銆佽幏鍙栬姹傛柟寮?        String firstLine = requestInfo.substring(,requestInfo.indexOf(CRLF));
        int idx = requestInfo.indexOf("/");// /鐨勪綅缃?        this.method = firstLine.substring(,idx).trim();
        String urlStr = firstLine.substring(idx,firstLine.indexOf("HTTP/")).trim();
        if(this.method.equalsIgnoreCase("post")){//post鏂瑰紡
            this.url = urlStr;
            paramString = requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();
        }else if(this.method.equalsIgnoreCase("get")){//get鏂瑰紡
            if(urlStr.contains("?")){
                String[] urlArray = urlStr.split("\\?");
                this.url = urlArray[];
                paramString = urlArray[];//鎺ユ敹璇鋒眰鍙傛暟
            }else{
                this.url = urlStr;
            }
        }

        //2銆佸皢璇鋒眰鍙傛暟灏佽鍒癕ap涓?        parseParams(paramString);
    }
    /**
     * 灏嗚姹傚弬鏁闆皝瑁呭埌Map涓?     * @param paramString
     */
    private void parseParams(String paramString){
        //鍒嗗壊锛屽皢瀛楃涓茶漿鎴愭暟缁?        StringTokenizer token = new StringTokenizer(paramString,"&");
        while(token.hasMoreTokens()){
            String keyValue = token.nextToken();
            String[] keyValues = keyValue.split("=");
            if(keyValues.length == ){
                keyValues = Arrays.copyOf(keyValues, );
                keyValues[] = null;
            }

            String key = keyValues[].trim();
            String value = null==keyValues[]?null:decode(keyValues[].trim(),"gbk");
            //鍒嗘嫞锛岃漿鎹㈡垚Map
            if(!parameterMapValues.containsKey(key)){
                parameterMapValues.put(key, new ArrayList<String>());
            }

            List<String> values = parameterMapValues.get(key);
            values.add(value);
        }
    }
    /**
     * 瑙e喅涓枃
     * @param value
     * @param code
     * @return
     */
    private String decode(String value,String code){
        try {
            return java.net.URLDecoder.decode(value, code);
        } catch (UnsupportedEncodingException e) {
            //e.printStackTrace();
        }
        return null;
    }
    /**
     * 鏍規嵁椤甸潰鐨刵ame鑾峰彇瀵瑰簲鐨勫涓€?     */
    public String[] getParameterValues(String name){
        List<String> values = null;
        if( (values=parameterMapValues.get(name))==null ){
            return null;
        }else{
            return values.toArray(new String[]);
        }
    }
    /**
     * 鏍規嵁椤甸潰鐨刵ame鑾峰彇瀵瑰簲鐨勫崟涓€?     */
    public String getParameterValue(String name){
        String[] values = getParameterValues(name);
        if(null==values){
            return null;
        }
        return values[];
    }
}
           
package com.test.server2;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Date;
/**
 * 灏佽鍝嶅簲淇℃伅
 */
public class Response {
    //涓や釜甯擱噺
    public static final String CRLF = "\r\n";
    public static final String BLANK = " ";
    //娴?    private BufferedWriter bw;
    //姝f枃
    private StringBuilder content;
    //瀛樺偍澶翠俊鎭?    private StringBuilder headInfo;
    //瀛樺偍姝f枃闀垮害
    private int len = ;

    public Response(){
        headInfo = new StringBuilder();
        content = new StringBuilder();
        len = ;
    }
    public Response(OutputStream os){
        this();
        bw = new BufferedWriter(new OutputStreamWriter(os));
    }
    public Response(Socket client){
        this();
        try {
            bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        } catch (IOException e) {
            headInfo = null;
        }
    }
    /**
     * 鏋勫緩姝f枃
     */
    public Response print(String info){
        content.append(info);
        len += (info + CRLF).getBytes().length;
        return this;
    }
    /**
     * 鏋勫緩姝f枃+鍥炶濺
     */
    public Response println(String info){
        content.append(info).append(CRLF);
        len += (info + CRLF).getBytes().length;
        return this;
    }

    /**
     * 鏋勫緩鍝嶅簲澶?     */
    private void createHeadInfo(int code){
        //1)HTTP鍗忚鐗堟湰銆佺姸鎬佷唬鐮併€佹弿杩?        headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);
        switch(code){
            case :
                headInfo.append("OK");
                break;
            case :
                headInfo.append("NOT FOUND");
                break;
            case :
                headInfo.append("Server Error");
                break;
        }
        headInfo.append(CRLF);
        //2)鍝嶅簲澶達紙Response Head锛?        headInfo.append("Server:test Server/0.0.1").append(CRLF);
        headInfo.append("Date:").append(new Date()).append(CRLF);
        headInfo.append("Content-type:text/html;charset=GBK").append(CRLF);
        //姝f枃闀垮害锛氬瓧鑺傞暱搴?        headInfo.append("Content-Length:").append(len).append(CRLF);
        headInfo.append(CRLF);
    }

    /**
     * 鎺ㄩ€佸埌瀹㈡埛绔?     * @throws IOException 
     */
    void pushToClient(int code) throws IOException{
        if(null==headInfo){
            code = ;
        }
        createHeadInfo(code);
        //澶翠俊鎭?鍒嗗壊绗?        bw.append(headInfo.toString());
        //姝f枃
        bw.append(content.toString());
        bw.flush();
        bw.close();
    }
}
           
package com.test.server2;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class WebApp {
    private static ServletContext contxt;
    static{

        try {
            //鑾峰彇瑙f瀽宸ュ巶
            SAXParserFactory factory = SAXParserFactory.newInstance();
            //鑾峰彇瑙f瀽鍣?            SAXParser sax = factory.newSAXParser();
            //鎸囧畾xml + 澶勭悊鍣?            WebHandler web = new WebHandler();
            sax.parse(Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("com/test/server2/web.xml")
                    ,web);

            //灏哃ist杞垚Map
            contxt = new ServletContext();

            Map<String,String> servlet = contxt.getServlet();
            //servlet-name,servlet-class
            for (Entity entity : web.getEntityList()) {
                servlet.put(entity.getName(), entity.getClz());
            }
            //url-pattern,servlet-name
            Map<String,String> mapping = contxt.getMapping();
            for (Mapping mapp : web.getMappingList()) {
                List<String> urls = mapp.getUrlPattern();
                for (String url : urls) {
                    mapping.put(url, mapp.getName());
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (org.xml.sax.SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Servlet getServlet(String url) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
        if(null==url || (url=url.trim()).equals("")){
            return null;
        }
        //return contxt.getServlet().get(contxt.getMapping().get(url));

        //鏍規嵁瀛楃涓詫紙瀹屾暣璺緞锛夊垱寤哄璞?        String name = contxt.getServlet().get(contxt.getMapping().get(url));
        return (Servlet)Class.forName(name).newInstance();//纭繚绌烘瀯閫犲瓨鍦?    }
}
           
package com.test.server2;
/**
 * 鎶借薄涓轟竴涓埗绫? */
public abstract class Servlet {
    public void service(Request req,Response rep) throws Exception{
        this.doGet(req,rep);
        this.doPost(req,rep);
    }

    public abstract void doGet(Request req,Response rep) throws Exception;
    public abstract void doPost(Request req,Response rep) throws Exception;
}
           
package com.test.server2;

import java.util.HashMap;
import java.util.Map;
/**
 * 涓婁笅鏂? */
public class ServletContext {
    //涓烘瘡涓€涓猻ervlet鍙栧埆鍚?    // login-->com.test.server2.LoginServlet
    private Map<String,String> servlet;
    // url-->login
    //  /log-->login
    //  /login-->login
    private Map<String,String> mapping;

    public ServletContext() { 
        servlet = new HashMap<String,String>();
        mapping = new HashMap<String,String>();
    }

    public Map<String, String> getServlet() {
        return servlet;
    }

    public void setServlet(Map<String, String> servlet) {
        this.servlet = servlet;
    }

    public Map<String, String> getMapping() {
        return mapping;
    }

    public void setMapping(Map<String, String> mapping) {
        this.mapping = mapping;
    }
}
           
package com.test.server2;

public class LoginServlet extends Servlet{

    @Override
    public void doGet(Request req,Response rep) throws Exception {
        String name = req.getParameterValue("uname");
        String pwd = req.getParameterValue("pwd");
        if(login(name, pwd)){
            rep.println("鐧誨綍鎴愬姛");
        }else{
            rep.println("鐧誨綍澶辮觸");
        }
    }

    public boolean login(String name,String pwd){
        return name.equals("test") && pwd.equals("12346");
    }

    @Override
    public void doPost(Request req,Response rep) throws Exception {

    }
}
           
package com.test.server2;

public class RegisterServlet extends Servlet{

    @Override
    public void doGet(Request req, Response rep) throws Exception {

    }

    @Override
    public void doPost(Request req, Response rep) throws Exception {
        rep.println("<html><head><title>杩斿洖娉ㄥ唽</title>");
        rep.println("</head><body>");
        rep.println("浣犵殑鐢ㄦ埛鍚嶄負锛? + req.getParameterValue("uname"));
        rep.println("</body></html>");
    }
}