博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
仿照tomcat服务器
阅读量:4657 次
发布时间:2019-06-09

本文共 12599 字,大约阅读时间需要 41 分钟。

package com.fix.server;import java.util.HashMap;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * xml 信息读取到 map里 * 配置文件分析 * @author Administrator *  */public class XmlParse {    private Map
servlets = new HashMap
(); private Map
mappings = new HashMap
(); public XmlParse() { SAXReader reader = new SAXReader(); try { Document doc = reader.read("WEB-INF/web.xml"); List
list = doc.selectNodes("/web-app/servlet"); for (Element servlet : list) { Element sname = servlet.element("servlet-name"); Element sclass = servlet.element("servlet-class"); servlets.put(sname.getText(), sclass.getText()); } List
list1 = doc.selectNodes("/web-app/servlet-mapping"); for (Element servlet : list1) { Element sname = servlet.element("servlet-name"); Element url = servlet.element("url-pattern"); mappings.put(url.getText(), sname.getText()); } } catch (DocumentException e) { e.printStackTrace(); } } /** * 通过 url 找到 类名 * * @param url * @return */ public String getClassByUrl(String url) { String cname = null; String sname = mappings.get(url); cname = servlets.get(sname); return cname; } public static void main(String[] args) { XmlParse xml= new XmlParse(); String ok=xml.getClassByUrl("/login"); System.out.println(ok); }}
package com.fix.server;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import java.lang.reflect.Method;import java.net.Socket;public class WebUser extends Thread {    private Socket s;    public WebUser(Socket s) {        this.s = s;        this.start();    }    public void run() {        byte buf[] = new byte[1024];        try {            InputStream input = s.getInputStream(); // 输入            OutputStream output = s.getOutputStream(); // 输出                        Response out=new Response(output);            Request req=new Request(input);    //分析协议                         if ("/".equals(req.path)) {                out.sendFile("html/index.htm");            }else if(req.userDo==null){                                out.sendFile("html"+req.path);            }else{                //用户要完成功能如登录功能....                System.out.println("用户传数据来了...."+req.params);                System.out.println("用户要完成的功能"+req.userDo);                                XmlParse xml=new XmlParse();                String cname=xml.getClassByUrl(req.userDo);   //服务类的类名                                Class c=Class.forName(cname);                Object obj=c.newInstance();   //对象                // 对象.方法名(参数);                Method m= c.getMethod("execute", Request.class,Response.class);                //  反射 ---  方法名.invoke(对象名,参数);                m.invoke(obj,req,out);                            }                    } catch (Exception e) {            e.printStackTrace();        }    }}
package com.fix.server;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class TomcatServer {    public static void main(String[] args) {                try {            ServerSocket server = new ServerSocket(8090);            System.out.println("服务器开启  http1.1 - 8090");            while (true) {                Socket s = server.accept(); // 等待                System.out.println("一个人访问");                new WebUser(s);            }        } catch (IOException e) {            e.printStackTrace();        }    }}
package com.fix.server;import java.io.FileInputStream;import java.io.OutputStream;/** * 服务器响应 *  * @author Administrator *  */public class Response {    private byte buf[] = new byte[1024];    private OutputStream output;    Response(OutputStream output) {        this.output = output;    }    /**     * 发送文件     */    public void sendFile(String path) {        // 发个网页给你        try {            FileInputStream fin = new FileInputStream(path);            int len = fin.read(buf);            while (len != -1) { // 读到信息了                output.write(buf, 0, len);                len = fin.read(buf); // 读下1k            }            output.flush();            output.close();            fin.close();        } catch (Exception e) {            e.printStackTrace();        }    }}
package com.fix.server;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Map;/** * 解析http 请求的 *  * @author Administrator *  */public class Request {    private InputStream input;    private byte buf[] = new byte[1024];    String path; // 存协议中网页名    String userDo; // 决断用户是否传了数据过来    public Map
params = new HashMap
(); public String getParameter(String key){ return params.get(key); } public Request(InputStream input) { this.input = input; // 查看客户传来的信息 请求 Request int len = 0; try { len = input.read(buf); // len 返回读到的长度 String http = new String(buf, 0, len); System.out.println(http); // 显示读到的信息 int gang = http.indexOf("/"); int ht = http.indexOf("HTTP"); path = http.substring(gang, ht).trim(); // 请求的网页 int wen = path.indexOf("?"); // 找问号 if (wen != -1) { userDo = path.substring(0,wen); // 用户有数据 /login String temp = path.substring(wen + 1); // cardNum=hello%3F&password=123&submit=%CC%E1%BD%BB String vs[] = temp.split("&"); // 分出几个数据 for (String v : vs) { String sz[] = v.split("="); if (sz.length == 2) { params.put(sz[0], sz[1]); } else { params.put(sz[0],""); } } } } catch (IOException e) { e.printStackTrace(); } }}
package com.fix.server;/* * 让子类 重写一个方法 */public abstract class HttpServlet {        public abstract void execute(Request req,Response res);}
package com.fix.dao;import com.fix.entity.User;public class UserDao {        DbUtil db=new DbUtil();        public void addUser(User a){                String sql="INSERT INTO users VALUES(NULL,?,?)";        Object sz[]={a.getStName(),a.getStPass()};        db.executeUpdate(sql, sz);            }}
package com.fix.dao;import java.lang.reflect.Method;import java.sql.*;import java.util.*;public class DbUtil {    private Connection con;    private PreparedStatement pt;    private ResultSet rs;    private void getConn() {        try {            Class.forName("com.mysql.jdbc.Driver");            con = DriverManager                    .getConnection("jdbc:mysql://localhost:3306/test?user=root&password=root");        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 返回单个值     *             ---可执行类似这种语句:  select count(*) from students where sex='男'                                            select stname from students where stid=10              * @param sql     * @param sz     * @return     */    public Object executeSelectOne(String sql, Object sz[]) {        Object obj = null;        getConn();        try {            pt = con.prepareStatement(sql); // 语句            for (int i = 0; sz != null && i < sz.length; i++) {                pt.setObject(i + 1, sz[i]);            }            rs = pt.executeQuery();            if (rs.next()) {                obj = rs.getObject(1);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            this.closeAll();        }        return obj;    }    /**     *  可以执行所有 insert update delete 语句       *  如   String sql="insert into student values(?,?)";             Object sz[]={"张三","123123"};  用来代替上面的?             xxx.executeUpdate(sql,sz);     *     **/    public int executeUpdate(String sql, Object sz[]) {        int n = 0;        getConn();        try {            pt = con.prepareStatement(sql); // 语句            for (int i = 0; sz != null && i < sz.length; i++) {                pt.setObject(i + 1, sz[i]);            }            n = pt.executeUpdate();        } catch (Exception e) {            e.printStackTrace();        } finally {            this.closeAll();        }        return n;    }        /**     *  可以执行 select  语句       *  如   String sql="select * from  students;                           xxx.executeQuery(sql,null);     *     **/    public ResultSet executeQuery(String sql, Object sz[]) {        getConn();        try {            pt = con.prepareStatement(sql); // 语句            for (int i = 0; sz != null && i < sz.length; i++) {                pt.setObject(i + 1, sz[i]);            }            rs = pt.executeQuery();        } catch (Exception e) {            e.printStackTrace();        }        return rs;    }        /**     *  可以执行 select  语句       *  如   String sql="select * from  students;                           xxx.executeNewQuery(sql,null);     *   返回 list 集合 ,里面是数组               **/    public ArrayList executeNewQuery(String sql, Object sz[]) {        getConn();        ArrayList datas = new ArrayList();        try {            pt = con.prepareStatement(sql); // 语句            for (int i = 0; sz != null && i < sz.length; i++) {                pt.setObject(i + 1, sz[i]);            }            rs = pt.executeQuery();            // 结果集的列            int n = rs.getMetaData().getColumnCount();            while (rs.next()) {                Object[] hang = new Object[n]; // 行数组                for (int i = 1; i <= n; i++) {                    hang[i - 1] = rs.getObject(i);                }                datas.add(hang);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            this.closeAll(); // 数据库关闭        }        return datas;    }    /**     * 返回装了实体的集合     * @param sql 语句     * @param sz  ?的值      * @param beanName 类名      * @return     */     /**     *  可以执行 select  语句       *  如   String sql="select * from  students;                           xxx.executeQuery(sql,null,"entity.Student");    //最后一个参数是放 包名.类名     *   返回 list 集合 ,里面是 Student对象             **/    public List executeQuery(String sql, Object sz[], String beanName) {        this.getConn();        List list = new ArrayList();        try {            Class obj = Class.forName(beanName);            Method[] ms = obj.getMethods(); // 反射出所有的方法            pt = con.prepareStatement(sql);            if (sz != null) {                for (int i = 0; i < sz.length; i++) {                    pt.setObject(i + 1, sz[i]);                }            }            rs = pt.executeQuery(); // 执行select 得到结果集            int endcols = rs.getMetaData().getColumnCount(); // 得到列数            while (rs.next()) {                Object beanObj = obj.newInstance(); // 一行生成一个对象                // 循环取出所有列的列名                for (int cols = 1; cols <= endcols; cols++) {                    // 得到一列的列名 stuId                    String columName = rs.getMetaData().getColumnName(cols);                    Object value = rs.getObject(columName); // 取出数据库中的一个字段                    if(value==null)                        continue;                    String c = columName.substring(0, 1); // 切下第一个字母s                    String e = columName.substring(1); // 余下的tuId                    // 组合成一个 setStuId                    String setColumName = "set" + c.toUpperCase() + e;                                        //System.out.println("调用"+setColumName+"值为"+value);                    for (int i = 0; i < ms.length; i++) {                        if (ms[i].getName().equals(setColumName)) {                            //  相当于执行 xxx.setStuId(10);                            ms[i].invoke(beanObj, value);                            break;                        }                    }                }                                list.add(beanObj);            }        } catch (Exception e1) {            e1.printStackTrace();        } finally {            this.closeAll();        }        return list;    }    public void closeAll() {        try {            if (rs != null) {                rs.close();            }            if (pt != null) {                pt.close();            }            if (con != null) {                con.close();            }        } catch (Exception e) {            e.printStackTrace();        }    }}

 

转载于:https://www.cnblogs.com/zousheng7018/archive/2012/10/20/2732481.html

你可能感兴趣的文章
微信开发第8章 通过accesstoken将长连接转换为短链接
查看>>
[刷题]Codeforces 785D - Anton and School - 2
查看>>
四川红油的制法
查看>>
Java重写《C经典100题》 --21
查看>>
【Android基础】Fragment 详解之Fragment生命周期
查看>>
链表(裸题)
查看>>
11运算符重载
查看>>
磁盘系统的管理
查看>>
C/S
查看>>
Http Get/Post请求的区别
查看>>
STM32一键下载电路设计原理
查看>>
C语言中函数返回字符串的四种方法
查看>>
10月区块链领域投融资事件盘点
查看>>
Mybatis缓存策略
查看>>
卷积的意义【转】
查看>>
android图形系统详解五:Android绘制模式
查看>>
[剑指offer] 23. 二叉搜索树的后序遍历序列
查看>>
canvas绘画交叉波浪
查看>>
Linux 内核分析
查看>>
试一下:XP ( SP2 ) 本身就支持查杀流氓软件!
查看>>