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 Mapservlets = 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 Mapparams = 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(); } }}