1、搭建框架

  1. 我们只是简单模拟,框架简单分三个模块

  1. a,服务器端server

  1. b,servlet,根据不同的请求url,利用反射生产对应的servlet

  1. c,IO工具包,用来关闭IO

  1. d,编写web.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app>
  3. <servlet>
  4. <servlet-name>login</servlet-name>
  5. <servlet-class>com.xzlf.servlet.LoginServlet</servlet-class>
  6. </servlet>
  7. <servlet>
  8. <servlet-name>register</servlet-name>
  9. <servlet-class>com.xzlf.servlet.RegisterServlet</servlet-class>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>login</servlet-name>
  13. <url-pattern>/login</url-pattern>
  14. <url-pattern>/log</url-pattern>
  15. </servlet-mapping>
  16. <servlet-mapping>
  17. <servlet-name>register</servlet-name>
  18. <url-pattern>/register</url-pattern>
  19. <url-pattern>/reg</url-pattern>
  20. <url-pattern>/r</url-pattern>
  21. </servlet-mapping>
  22. </web-app>
  1. e,写一个简单的html用于测试
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>登录</title>
  6. </head>
  7. <body>
  8. <form action="http://localhost:8888/log" method="get">
  9. <p>
  10. 用户名:<input type="text" name="uname" id="uname" />
  11. </p>
  12. <p>
  13. 密码:<input type="password" name="pwd" id="pwd" />
  14. </p>
  15. <p>
  16. <input type="submit" value="登录" />
  17. </p>
  18. </form>
  19. </body>
  20. </html>
  1. f, IO工具包比比较简单,先写了:
  1. package com.xzlf.util;
  2. import java.io.Closeable;
  3. import java.io.IOException;
  4. /**
  5. * 关闭流
  6. * @author xzlf
  7. *
  8. */
  9. public class IOUtil {
  10. public static void closeAll(Closeable...closeables) {
  11. for (Closeable close : closeables) {
  12. if(close != null) {
  13. try {
  14. close.close();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }
  20. }
  21. }

2、编写xml文件以及对xml解析以及数据存储程序

  1. a,编写存放xml文件中servlet-name servlet-class javabean 对象Entity
  1. package com.xzlf.server;
  2. /**
  3. * 映射servlet-name 和 servlet-class
  4. * @author xzlf
  5. *
  6. */
  7. public class Entity {
  8. // servlet-name
  9. private String name;
  10. // servlet -class
  11. private String clazz;
  12. public Entity() {
  13. // TODO Auto-generated constructor stub
  14. }
  15. public Entity(String name, String clazz) {
  16. super();
  17. this.name = name;
  18. this.clazz = clazz;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public String getClazz() {
  27. return clazz;
  28. }
  29. public void setClazz(String clazz) {
  30. this.clazz = clazz;
  31. }
  32. }
  1. b,编写存放xml文件中servlet-name url-pattern javabean 对象Mapping
  1. package com.xzlf.server;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * 映射 servlet-name 和 url-pattern
  6. * @author xzlf
  7. *
  8. */
  9. public class Mapping {
  10. // servlet-name
  11. private String name;
  12. // url-pattern
  13. private List<String> urlList;
  14. public Mapping() {
  15. this.urlList = new ArrayList<String>();
  16. }
  17. public Mapping(String name, List<String> urlList) {
  18. this();
  19. this.name = name;
  20. this.urlList = urlList;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public List<String> getUrlList() {
  29. return urlList;
  30. }
  31. public void setUrlList(List<String> urlList) {
  32. this.urlList = urlList;
  33. }
  34. }
  1. c,编写解析xml文件(使用Dom4j)的程序
  1. package com.xzlf.server;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import org.dom4j.Document;
  7. import org.dom4j.DocumentException;
  8. import org.dom4j.Element;
  9. import org.dom4j.io.SAXReader;
  10. /**
  11. * 解析xml
  12. * @author xzlf
  13. *
  14. */
  15. public class WebDom4j {
  16. // 存储Entity
  17. private List<Entity> entityList;
  18. // 存储Mapping
  19. private List<Mapping> mappingList;
  20. public WebDom4j() {
  21. this.entityList = new ArrayList<Entity>();
  22. this.mappingList = new ArrayList<Mapping>();
  23. }
  24. public WebDom4j(List<Entity> entityList, List<Mapping> mappingList) {
  25. this();
  26. this.entityList = entityList;
  27. this.mappingList = mappingList;
  28. }
  29. public List<Entity> getEntityList() {
  30. return entityList;
  31. }
  32. public void setEntityList(List<Entity> entityList) {
  33. this.entityList = entityList;
  34. }
  35. public List<Mapping> getMappingList() {
  36. return mappingList;
  37. }
  38. public void setMappingList(List<Mapping> mappingList) {
  39. this.mappingList = mappingList;
  40. }
  41. public Document getDocument() {
  42. Document doc = null;
  43. try {
  44. // 1、穿件SAXReader 对象
  45. SAXReader reader = new SAXReader();
  46. // 2、调用 read() 方法
  47. doc = reader.read(new File("src/WEB_INFO/webxml.xml"));
  48. } catch (DocumentException e) {
  49. e.printStackTrace();
  50. }
  51. return doc;
  52. }
  53. public void parse(Document doc) {
  54. // 1、获取根元素
  55. Element rootElement = doc.getRootElement();
  56. // 2、获取servlet 子元素
  57. for(Iterator<Element> elementIterator = rootElement.elementIterator("servlet");
  58. elementIterator.hasNext();) {
  59. Element ele = elementIterator.next();
  60. Entity entity = new Entity();
  61. for (Iterator<Element> eleIterator = ele.elementIterator(); eleIterator.hasNext();) {
  62. Element e = eleIterator.next();
  63. if("servlet-name".equals(e.getName())) {
  64. entity.setName(e.getText());
  65. }else if("servlet-class".equals(e.getName())) {
  66. entity.setClazz(e.getText());
  67. }
  68. }
  69. this.entityList.add(entity);
  70. }
  71. // 3、获取servlet-mapping 子元素
  72. for(Iterator<Element> elementIterator = rootElement.elementIterator("servlet-mapping");
  73. elementIterator.hasNext();) {
  74. Element ele = elementIterator.next();
  75. Mapping mapping = new Mapping();
  76. for (Iterator<Element> eleIterator = ele.elementIterator(); eleIterator.hasNext();) {
  77. Element e = eleIterator.next();
  78. if("servlet-name".equals(e.getName())) {
  79. mapping.setName(e.getText());
  80. }else if("url-pattern".equals(e.getName())) {
  81. mapping.getUrlList().add(e.getText());
  82. }
  83. }
  84. this.mappingList.add(mapping);
  85. }
  86. }
  87. /* 测试
  88. * public static void main(String[] args) {
  89. WebDom4j web = new WebDom4j();
  90. web.parse(web.getDocument());
  91. List<Entity> entityList2 = web.getEntityList();
  92. System.out.println(entityList2.size());
  93. for (Entity entity : entityList2) {
  94. System.out.println(entity.getName() + "--" + entity.getClazz());
  95. }
  96. System.out.println("============================");
  97. List<Mapping> mappingList2 = web.getMappingList();
  98. System.out.println(mappingList2.size());
  99. for (Mapping mapping : mappingList2) {
  100. for (String url : mapping.getUrlList()) {
  101. System.out.println(mapping.getName() + "-->" + url);
  102. }
  103. System.out.println("------------------------");
  104. }
  105. }*/
  106. }
  1. d,封装serlvet mapping
  1. package com.xzlf.server;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. /**
  5. * Servlet 上下文 ,就是一个容器
  6. * 映射 Mapping 和 Entity
  7. * url-pattern --> servlet-class
  8. * @author xzlf
  9. *
  10. */
  11. public class ServletContext {
  12. // key:sevlet-name value:servlet-class
  13. private Map<String, String> servlet;
  14. // key:url-pattern value:servlet-name
  15. private Map<String, String> mapping;
  16. public ServletContext() {
  17. this.servlet = new HashMap<String, String>();
  18. this.mapping = new HashMap<String, String>();
  19. }
  20. public ServletContext(Map<String, String> servlet, Map<String, String> mapping) {
  21. this.servlet = servlet;
  22. this.mapping = mapping;
  23. }
  24. public Map<String, String> getServlet() {
  25. return servlet;
  26. }
  27. public void setServlet(Map<String, String> servlet) {
  28. this.servlet = servlet;
  29. }
  30. public Map<String, String> getMapping() {
  31. return mapping;
  32. }
  33. public void setMapping(Map<String, String> mapping) {
  34. this.mapping = mapping;
  35. }
  36. }
  1. e,处理Entity Maping 找出url servlet-class 的映射
  1. package com.xzlf.server;
  2. import java.util.List;
  3. import java.util.Map;
  4. import com.xzlf.servlet.Servlet;
  5. /**
  6. * Web应用程序
  7. * @author xzlf
  8. *
  9. */
  10. public class WebApp {
  11. private static ServletContext context;
  12. static {
  13. context = new ServletContext();
  14. // 获取对应的map关系
  15. Map<String, String> servlet = context.getServlet();
  16. Map<String, String> mapping = context.getMapping();
  17. // 创建xml解析
  18. WebDom4j web = new WebDom4j();
  19. web.parse(web.getDocument());
  20. // 获取解析xml 之后的List集合
  21. List<Entity> entityList = web.getEntityList();
  22. List<Mapping> mappingList = web.getMappingList();
  23. // 将List集合中的数据存储到Map中
  24. for(Entity entity : entityList) {
  25. servlet.put(entity.getName(), entity.getClazz());
  26. }
  27. for (Mapping mapp : mappingList) {
  28. for (String url : mapp.getUrlList()) {
  29. mapping.put(url, mapp.getName());
  30. }
  31. }
  32. }
  33. /**
  34. * 根据不同的url创建不同的servlet对象
  35. * @param url
  36. * @return
  37. */
  38. public static Servlet getServlet(String url) {
  39. if(url == null || url.trim().equals("")) {
  40. return null;
  41. }
  42. try {
  43. String servletName = context.getMapping().get(url);
  44. String servletClazz = context.getServlet().get(servletName);
  45. // System.out.println(servletName + "--" + servletClazz);
  46. Class<?> clazz = Class.forName(servletClazz);
  47. Object servlet = clazz.newInstance();
  48. return (Servlet) servlet;
  49. } catch (ClassNotFoundException e) {
  50. e.printStackTrace();
  51. } catch (InstantiationException e) {
  52. e.printStackTrace();
  53. } catch (IllegalAccessException e) {
  54. e.printStackTrace();
  55. }
  56. return null;
  57. }
  58. /*测试
  59. public static void main(String[] args) {
  60. System.out.println(getServlet("/log"));
  61. System.out.println(getServlet("/reg"));
  62. }
  63. */
  64. }

3、封装请求数据request:包括请求的url,请求参数

  1. package com.xzlf.server;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.UnsupportedEncodingException;
  7. import java.net.URLDecoder;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13. /**
  14. * 封装请求
  15. * @author xzlf
  16. *
  17. */
  18. public class Request {
  19. private InputStream is;
  20. private String requestInfo;
  21. private String method;
  22. private String url;
  23. private Map<String, List<String>> parameterValues;
  24. private static final String BLANK = " ";
  25. private static final String CRLF = "\r\n";
  26. public Request() {
  27. this.parameterValues = new HashMap<String, List<String>>();
  28. }
  29. public Request(InputStream is) {
  30. this();
  31. this.is = is;
  32. BufferedReader read = null;
  33. char[] buf = new char[20480];
  34. int len;
  35. try {
  36. read = new BufferedReader(new InputStreamReader(is, "utf8"));
  37. if ((len = read.read(buf)) != -1) {
  38. requestInfo = new String(buf, 0, len);
  39. }
  40. } catch (IOException e) {
  41. requestInfo = "";
  42. return;
  43. }
  44. this.parseRequestInfo();
  45. }
  46. private void parseRequestInfo() {
  47. if(this.requestInfo.equals("")) {
  48. return;
  49. }
  50. int index = this.requestInfo.indexOf('/');
  51. this.method = this.requestInfo.substring(0,index - 1).toLowerCase();
  52. int end = this.requestInfo.indexOf("HTTP/1.1") - 1;
  53. String urlStr = this.requestInfo.substring(index,end);
  54. int paramIndex;// 请求参数拆分位置
  55. String parameterStr = "";
  56. if ("get".equals(method)) {
  57. if (urlStr.contains("?")) {
  58. paramIndex = urlStr.indexOf('?');
  59. this.url = urlStr.substring(0, paramIndex);
  60. parameterStr = urlStr.substring(paramIndex + 1);
  61. }else {
  62. parameterStr = "";
  63. }
  64. }else {
  65. this.url = urlStr;
  66. paramIndex = this.requestInfo.lastIndexOf(CRLF);
  67. parameterStr = this.requestInfo.substring(paramIndex).trim();
  68. }
  69. if(parameterStr != null && !"".equals(parameterStr)) {
  70. String[] paramArr = parameterStr.split("&");
  71. for (String string : paramArr) {
  72. String[] paramKV = string.split("=");
  73. paramKV = Arrays.copyOf(paramKV, 2);
  74. convertMap(paramKV);
  75. }
  76. }
  77. // System.out.println(parameterStr);
  78. }
  79. private void convertMap(String[] paramKV) {
  80. String k = paramKV[0];
  81. String v = null;
  82. try {
  83. v = paramKV[1] == null ? null : new URLDecoder().decode(paramKV[1], "utf8");
  84. } catch (UnsupportedEncodingException e) {
  85. e.printStackTrace();
  86. }
  87. if(!this.parameterValues.containsKey(k)) {
  88. parameterValues.put(k, new ArrayList<String>());
  89. }
  90. this.parameterValues.get(k).add(v);
  91. }
  92. // 根据表单提交的内容获取多个值
  93. public String[] getParameterValues(String name) {
  94. List<String> list = this.parameterValues.get(name);
  95. return list == null ? null : list.toArray(new String[0]);
  96. }
  97. // 根据表单提交的内容获取一个值
  98. public String getParameter(String name) {
  99. String[] values = this.getParameterValues(name);
  100. return values == null ? null : values[0];
  101. }
  102. public String getMethod() {
  103. return method;
  104. }
  105. public String getUrl() {
  106. return url;
  107. }
  108. public Map<String, List<String>> getParameterValues() {
  109. return parameterValues;
  110. }
  111. }

4、封装响应数据reponse:包括响应头和响应正文

  1. package com.xzlf.server;
  2. import java.io.BufferedWriter;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.io.OutputStreamWriter;
  6. import java.io.UnsupportedEncodingException;
  7. import com.xzlf.util.IOUtil;
  8. /**
  9. * 封装响应
  10. * @author xzlf
  11. *
  12. */
  13. public class Response {
  14. private StringBuffer headInfo;
  15. private StringBuffer content;
  16. private int length;
  17. private BufferedWriter bw;
  18. private static final String BLANK = " ";
  19. private static final String CRLF = "\r\n";
  20. public Response() {
  21. headInfo = new StringBuffer();
  22. content = new StringBuffer();
  23. }
  24. public Response(OutputStream os) {
  25. this();
  26. try {
  27. bw = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
  28. } catch (UnsupportedEncodingException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. public Response print(String info) {
  33. content.append(info);
  34. try {
  35. length += info.getBytes("utf-8").length;
  36. } catch (UnsupportedEncodingException e) {
  37. e.printStackTrace();
  38. }
  39. return this;
  40. }
  41. public Response println(String info) {
  42. content.append(info);
  43. content.append(CRLF);
  44. try {
  45. length += (info + CRLF).getBytes("utf-8").length;
  46. } catch (UnsupportedEncodingException e) {
  47. e.printStackTrace();
  48. }
  49. return this;
  50. }
  51. public void creatHeadInfo(int code) {
  52. headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);
  53. switch(code) {
  54. case 200:
  55. headInfo.append("OK");
  56. break;
  57. case 404:
  58. headInfo.append("NOT FOUND");
  59. break;
  60. default:
  61. headInfo.append("SERVER ERROR");
  62. }
  63. headInfo.append(CRLF);
  64. headInfo.append("Content-Type: text/html;charset=utf-8").append(CRLF);
  65. headInfo.append("Content-Length:").append(length).append(CRLF);
  66. headInfo.append(CRLF);
  67. }
  68. public void pushToClient(int code) {
  69. if(headInfo == null) {
  70. code = 500;
  71. }
  72. this.creatHeadInfo(code);
  73. try {
  74. bw.write(headInfo.toString());
  75. bw.write(content.toString());
  76. bw.flush();
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80. close();
  81. }
  82. public void close() {
  83. IOUtil.closeAll(bw);
  84. }
  85. }

5、编写servelt 处理请求:

  1. package com.xzlf.servlet;
  2. import com.xzlf.server.Request;
  3. import com.xzlf.server.Response;
  4. /**
  5. * 所有servlet 父类
  6. * @author xzlf
  7. *
  8. */
  9. public abstract class Servlet {
  10. public void service(Request request, Response response) throws Exception {
  11. this.doGet(request, response);
  12. this.doPost(request, response);
  13. }
  14. public abstract void doPost(Request request, Response response) throws Exception;
  15. public abstract void doGet(Request request, Response response) throws Exception;
  16. }
  1. package com.xzlf.servlet;
  2. import com.xzlf.server.Request;
  3. import com.xzlf.server.Response;
  4. public class LoginServlet extends Servlet {
  5. @Override
  6. public void doPost(Request request, Response response) throws Exception {
  7. }
  8. @Override
  9. public void doGet(Request request, Response response) throws Exception {
  10. String uname = request.getParameter("uname");
  11. String pwd = request.getParameter("pwd");
  12. // System.out.println(uname+"--" + pwd);
  13. if(login(uname, pwd)) {
  14. response.print(uname + ":登录成功");
  15. }else {
  16. response.print(uname + " 登录失败,账号或密码错误");
  17. }
  18. }
  19. private boolean login(String uname, String pwd) {
  20. if("张三".equals(uname) && "123".equals(pwd)) {
  21. return true;
  22. }
  23. return false;
  24. }
  25. }
  1. package com.xzlf.servlet;
  2. import com.xzlf.server.Request;
  3. import com.xzlf.server.Response;
  4. public class RegisterServlet extends Servlet {
  5. @Override
  6. public void doPost(Request request, Response response) throws Exception {
  7. // TODO Auto-generated method stub
  8. }
  9. @Override
  10. public void doGet(Request request, Response response) throws Exception {
  11. // TODO Auto-generated method stub
  12. }
  13. }

6、加入DIspatcher分发器,开启多线程

  1. package com.xzlf.server;
  2. import java.io.IOException;
  3. import java.net.Socket;
  4. import com.xzlf.servlet.Servlet;
  5. import com.xzlf.util.IOUtil;
  6. /**
  7. * 请求响应分发器
  8. * @author xzlf
  9. *
  10. */
  11. public class Dispatcher implements Runnable{
  12. private Socket client;
  13. private Request req;
  14. private Response rep;
  15. int code = 200;
  16. public Dispatcher(Socket client) {
  17. this.client = client;
  18. try {
  19. req = new Request(this.client.getInputStream());
  20. rep = new Response(this.client.getOutputStream());
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. @Override
  26. public void run() {
  27. String url = req.getUrl();
  28. System.out.println(url);
  29. // 根据不同的url 创建不同的servlet对象
  30. Servlet servlet = WebApp.getServlet(url);
  31. if(servlet == null) {
  32. code = 404;
  33. }else {
  34. try {
  35. servlet.service(req, rep);
  36. } catch (Exception e) {
  37. code = 500;
  38. }
  39. }
  40. rep.pushToClient(code);
  41. IOUtil.closeAll(client);
  42. }
  43. }

7、编写服务器端

  1. package com.xzlf.server;
  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import com.xzlf.util.IOUtil;
  6. /**
  7. * 启动服务
  8. * @author xzlf
  9. *
  10. */
  11. public class Server {
  12. private ServerSocket server;
  13. private boolean isRuning;
  14. private void start(int port) {
  15. isRuning = true;
  16. try {
  17. server = new ServerSocket(port);
  18. recive();
  19. } catch (IOException e) {
  20. isRuning = false;
  21. }
  22. }
  23. private void recive() {
  24. try {
  25. while (isRuning) {
  26. Socket client = server.accept();
  27. Dispatcher dispatcher = new Dispatcher(client);
  28. new Thread(dispatcher).start();
  29. }
  30. } catch (IOException e) {
  31. isRuning = false;
  32. }
  33. }
  34. private void stop() {
  35. isRuning = false;
  36. IOUtil.closeAll(server);
  37. }
  38. public static void main(String[] args) {
  39. Server s = new Server();
  40. s.start(8888);
  41. }
  42. }

8、进行页面测试

9、简单写个多线程并发进行压测

  1. package com.xzlf.csdnUtil;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.net.URL;
  5. /**
  6. * 对手写服务器进行压测
  7. * @author xzlf
  8. *
  9. */
  10. public class TestMyServer {
  11. public static void main(String[] args) {
  12. String url = "http://localhost:8888/log?";
  13. for (int i = 0; i < 100; i++) {
  14. new Thread(new RunThread(url, "张三" + i, "123")).start();
  15. new Thread(new RunThread(url, "张三", "123")).start();
  16. try {
  17. Thread.sleep(200);
  18. } catch (InterruptedException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  24. public static void longin(String url, String uname, String pwd) {
  25. BufferedReader br = null;
  26. try {
  27. String loginUrl = url + "uname=" + uname + "&pwd=" + pwd;
  28. URL login = new URL(loginUrl);
  29. br = new BufferedReader(new InputStreamReader(login.openStream(), "utf-8"));
  30. char[] buf = new char[1024];
  31. int len = br.read(buf);
  32. System.out.println(new String(buf, 0, len));
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. // 为了直接调用请求方法 用下静态内部类
  38. static class RunThread implements Runnable {
  39. String url;
  40. String uname;
  41. String pwd;
  42. public RunThread(String url, String uname, String pwd) {
  43. super();
  44. this.url = url;
  45. this.uname = uname;
  46. this.pwd = pwd;
  47. }
  48. @Override
  49. public void run() {
  50. TestMyServer.longin(url, uname, pwd);
  51. }
  52. }
  53. }

用的电脑还算比较新 没啥压力。

不使用tomcat,仅适用javaSE手写服务器--模拟登陆的更多相关文章

  1. JavaSE 手写 Web 服务器(二)

    原文地址:JavaSE 手写 Web 服务器(二) 博客地址:http://www.extlight.com 一.背景 在上一篇文章 <JavaSE 手写 Web 服务器(一)> 中介绍了 ...

  2. JavaSE 手写 Web 服务器(一)

    原文地址:JavaSE 手写 Web 服务器(一) 博客地址:http://www.extlight.com 一.背景 某日,在 Java 技术群中看到网友讨论 tomcat 容器相关内容,然后想到自 ...

  3. java24 手写服务器最终版本

    手写服务器最终版本; <?xml version="1.0" encoding="UTF-8"?> <web-app> <serv ...

  4. 通过手写服务器的方式,立体学习Http

    前言 Http我们都已经耳熟能详了,而关于Http学习的文章网上有很多,各个知识点的讲解也可说是深入浅出.然而,学习过后,我们对Http还是一知半解.问题出在了哪? Http是一个客户机与服务器之间的 ...

  5. 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖

    本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...

  6. 前端面试手写代码——模拟实现new运算符

    目录 1 new 运算符简介 2 new 究竟干了什么事 3 模拟实现 new 运算符 4 补充 预备知识: 了解原型和原型链 了解this绑定 1 new 运算符简介 MDN文档:new 运算符创建 ...

  7. MyTomcat(手写服务器)

    Tomcat 是非常流行的 Web Server,它还是一个满足 Servlet 规范的容器.那么想一想,Tomcat 和我们的 Web 应用是什么关系? 从感性上来说,我们一般需要把 Web 应用打 ...

  8. 手写一个模拟的ReentrantLock

    package cn.daheww.demo.juc.reentrylock; import sun.misc.Unsafe; import java.lang.reflect.Field; impo ...

  9. Java修炼——手写服务器项目

    项目工程总览: 1.Dispatcher类(一个请求与响应就是一个Dispatcher) package com.bjsxt.server; import java.io.IOException; i ...

随机推荐

  1. Math对象常用方法介绍

     <script>         /* 001-Math.abs()  绝对值 */         console.log(Math.abs(123), Math.abs(-998), ...

  2. iOS 缩小 ipa 大小

    一.爱奇艺 爱奇艺移动应用优化之路:如何让崩溃率小于千分之二 iOS8 对于 App 的 text 段有 60MB 的限制: 超过 200MB 的 App 需要连接 WIFI 下载(之前是 150MB ...

  3. [vijos1304]回文数<模拟>

    题目链接:https://vijos.org/p/1304 好久没写博客了,最近一直打不出题,感觉自己是废了,今天做了一道模拟水题,但还是半天没过,后来才发现是忘记考虐10以上的进制是带有字母的,然后 ...

  4. 实验七 MySQL语言结构

    实验七 MySQL语言结构 一.  实验内容: 1. 常量的使用 2. 变量的使用 3. 运算符的使用 4. 系统函数的使用 二.  实验项目:员工管理数据库 用于企业管理的员工管理数据库,数据库名为 ...

  5. Docker基础修炼1--Docker简介及快速入门体验

    本文作为Docker基础系列第一篇文章,将详细阐述和分析三个问题:Docker是什么?为什么要用Docker?如何快速掌握Docker技术? 本系列文章中Docker的用法演示是基于CentOS7进行 ...

  6. XXE白盒审计 PHP

    XXE与XML注入的区别 https://www.cnblogs.com/websecurity-study/p/11348913.html XXE又分为内部实体和外部实体.我简单区分为内部实体就是自 ...

  7. CentOS 6.5系统实现NFS文件共享

    一台Linux server ip 192.168.1.254,一台Linux client ip 192.168.1.100操作系统:CentOS 6.5需求描述:1:将/root 共享给192.1 ...

  8. es--es分词的一些分析技巧

    查看某个字段的分词结果 POST /index/tyhpe/id/_termvectors?fields=fields_name 例如:http://localhost:9200/prod_membe ...

  9. LInux文件管理篇,权限管理

    一: chgrp 改变文件所属用户组 chown 改变文件所有者 注意: 1.使用格式 chgrp/chown     user      file eg: chgrp lanyue permissi ...

  10. Java Array 常见报错ArrayIndexOutOfBoundsException NullPointerException

    本文介绍array报错, 数组索引越界异常: ArrayIndexOutOfBoundsException, 空指针:NullPointerException package myArray; /* ...