为了方便后续的BinCat版本处理Http请求和响应处理结果,我们简单的封装了BinCatDispatcherServletBinCatResponseHandler对象。BinCatDispatcherServlet会根据浏览器请求的不同URL地址去调用对应的Servlet服务,除此之外还提供了一个简单的静态资源文件处理逻辑和PHP解析功能。
    BinCatDispatcherServlet实现代码:

    1. package com.anbai.sec.server.handler;
    2. import com.anbai.sec.server.servlet.BinCatRequest;
    3. import com.anbai.sec.server.servlet.BinCatResponse;
    4. import com.anbai.sec.server.servlet.BinCatServletContext;
    5. import com.anbai.sec.server.servlet.BinCatServletRegistrationDynamic;
    6. import org.javaweb.utils.FileUtils;
    7. import org.javaweb.utils.StringUtils;
    8. import java.io.ByteArrayOutputStream;
    9. import java.io.File;
    10. import java.io.IOException;
    11. import java.nio.file.Files;
    12. import java.util.Collection;
    13. import java.util.Set;
    14. import java.util.regex.Pattern;
    15. public class BinCatDispatcherServlet {
    16. public void doDispatch(BinCatRequest req, BinCatResponse resp, ByteArrayOutputStream out) throws IOException {
    17. // 请求URI地址
    18. String uri = req.getRequestURI();
    19. // 获取ServletContext
    20. BinCatServletContext servletContext = (BinCatServletContext) req.getServletContext();
    21. // 获取Http请求的文件
    22. File requestFile = new File(req.getRealPath(uri));
    23. // 处理Http请求的静态文件,如果文件存在(.php后缀除外)就直接返回文件内容,不需要调用Servlet
    24. if (requestFile.exists() && requestFile.isFile() && !uri.endsWith(".php")) {
    25. // 修改状态码
    26. resp.setStatus(200, "OK");
    27. // 解析文件的MimeType
    28. String mimeType = Files.probeContentType(requestFile.toPath());
    29. if (mimeType == null) {
    30. String fileSuffix = FileUtils.getFileSuffix(requestFile.getName());
    31. resp.setContentType("text/" + fileSuffix);
    32. } else {
    33. resp.setContentType(mimeType);
    34. }
    35. out.write(Files.readAllBytes(requestFile.toPath()));
    36. } else {
    37. // 遍历所有已注册得Servlet,处理Http请求
    38. Set<BinCatServletRegistrationDynamic> dynamics = servletContext.getRegistrationDynamics();
    39. for (BinCatServletRegistrationDynamic dynamic : dynamics) {
    40. Collection<String> urlPatterns = dynamic.getMappings();
    41. for (String urlPattern : urlPatterns) {
    42. try {
    43. // 检测请求的URL地址和Servlet的地址是否匹配
    44. if (Pattern.compile(urlPattern).matcher(uri).find()) {
    45. // 修改状态码
    46. resp.setStatus(200, "OK");
    47. // 调用Servlet请求处理方法
    48. dynamic.getServlet().service(req, resp);
    49. return;
    50. }
    51. } catch (Exception e) {
    52. // 修改状态码,输出服务器异常信息到浏览器
    53. resp.setStatus(500, "Internal Server Error");
    54. e.printStackTrace();
    55. out.write(("<pre>" + StringUtils.exceptionToString(e) + "</pre>").getBytes());
    56. }
    57. }
    58. }
    59. }
    60. }
    61. }