当前位置: 首页> 科技> 数码 > 中小企业网站设计_龙岗区最新通告_b2b外贸接单平台_江苏网页定制

中小企业网站设计_龙岗区最新通告_b2b外贸接单平台_江苏网页定制

时间:2025/7/13 3:37:09来源:https://blog.csdn.net/m0_62112384/article/details/144144446 浏览次数:0次
中小企业网站设计_龙岗区最新通告_b2b外贸接单平台_江苏网页定制

实现ServletRequest

package connector;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;/*
GET /index.html HTTP/1.1Host: localhost:8888Connection: keep-aliveCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
*/public class Request implements ServletRequest {private static final int BUFFER_SIZE = 1024;private InputStream input;private String uri;public Request(InputStream input) {this.input = input;}public String getRequestURI() {return uri;}public void parse() {int length = 0;byte[] buffer = new byte[BUFFER_SIZE];try {length = input.read(buffer);} catch (IOException e) {e.printStackTrace();}StringBuilder request = new StringBuilder();for (int j=0; j<length; j++) {request.append((char)buffer[j]);}uri = parseUri(request.toString());}private String parseUri(String s) {int index1, index2;index1 = s.indexOf(' ');if (index1 != -1) {index2 = s.indexOf(' ', index1 + 1);if (index2 > index1) {return s.substring(index1 + 1, index2);}}return "";}@Overridepublic Object getAttribute(String s) {return null;}@Overridepublic Enumeration getAttributeNames() {return null;}@Overridepublic String getCharacterEncoding() {return null;}@Overridepublic void setCharacterEncoding(String s) throws UnsupportedEncodingException {}@Overridepublic int getContentLength() {return 0;}@Overridepublic String getContentType() {return null;}@Overridepublic ServletInputStream getInputStream() throws IOException {return null;}@Overridepublic String getParameter(String s) {return null;}@Overridepublic Enumeration getParameterNames() {return null;}@Overridepublic String[] getParameterValues(String s) {return new String[0];}@Overridepublic Map getParameterMap() {return null;}@Overridepublic String getProtocol() {return null;}@Overridepublic String getScheme() {return null;}@Overridepublic String getServerName() {return null;}@Overridepublic int getServerPort() {return 0;}@Overridepublic BufferedReader getReader() throws IOException {return null;}@Overridepublic String getRemoteAddr() {return null;}@Overridepublic String getRemoteHost() {return null;}@Overridepublic void setAttribute(String s, Object o) {}@Overridepublic void removeAttribute(String s) {}@Overridepublic Locale getLocale() {return null;}@Overridepublic Enumeration getLocales() {return null;}@Overridepublic boolean isSecure() {return false;}@Overridepublic RequestDispatcher getRequestDispatcher(String s) {return null;}@Overridepublic String getRealPath(String s) {return null;}
}
  • 主要是为了实现ServletRequest 接口

实现ServletResponse

package connector;import javax.servlet.ServletOutputStream;
import javax.servlet.ServletResponse;
import java.io.*;
import java.util.Locale;/*
HTTP/1.1 200 OK*/
public class Response implements ServletResponse {private static final int BUFFER_SIZE = 1024;Request request;OutputStream output;public Response(OutputStream output) {this.output = output;}public void setRequest(Request request) {this.request = request;}public void sendStaticResource() throws IOException {File file = new File(ConnectorUtils.WEB_ROOT, request.getRequestURI());try {write(file, HttpStatus.SC_OK);} catch (IOException e) {write(new File(ConnectorUtils.WEB_ROOT, "404.html"), HttpStatus.SC_NOT_FOUND);}}private void write(File resource, HttpStatus status) throws IOException {try (FileInputStream fis = new FileInputStream(resource)) {output.write(ConnectorUtils.renderStatus(status).getBytes());byte[] buffer = new byte[BUFFER_SIZE];int length = 0;while ((length = fis.read(buffer, 0, BUFFER_SIZE)) != -1) {output.write(buffer, 0, length);}}}@Overridepublic String getCharacterEncoding() {return null;}@Overridepublic ServletOutputStream getOutputStream() throws IOException {return null;}@Overridepublic PrintWriter getWriter() throws IOException {PrintWriter writer = new PrintWriter(output, true);return writer;}@Overridepublic void setContentLength(int i) {}@Overridepublic void setContentType(String s) {}@Overridepublic void setBufferSize(int i) {}@Overridepublic int getBufferSize() {return 0;}@Overridepublic void flushBuffer() throws IOException {}@Overridepublic void resetBuffer() {}@Overridepublic boolean isCommitted() {return false;}@Overridepublic void reset() {}@Overridepublic void setLocale(Locale locale) {}@Overridepublic Locale getLocale() {return null;}
}
  • 也是主要为了实现ServletRequest 接口
  • 实现getWriter()方法

实现Servlet

import connector.ConnectorUtils;
import connector.HttpStatus;
import connector.Request;import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;public class TimeServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {PrintWriter out = servletResponse.getWriter();out.println(ConnectorUtils.renderStatus(HttpStatus.SC_OK));out.println("What time is it now?");out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}
  • service实时返回当前时间的具体值

实现ServletProcessor

package processor;import connector.*;import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;public class ServletProcessor {URLClassLoader getServletLoader() throws MalformedURLException {File webroot = new File(ConnectorUtils.WEB_ROOT);URL webrootUrl = webroot.toURI().toURL();return new URLClassLoader(new URL[]{webrootUrl});}Servlet getServlet(URLClassLoader loader, Request request) throws ClassNotFoundException, IllegalAccessException, InstantiationException {/*/servlet/TimeServlet*/String uri = request.getRequestURI();String servletName = uri.substring(uri.lastIndexOf("/") + 1);Class servletClass = loader.loadClass(servletName);Servlet servlet = (Servlet) servletClass.newInstance();return servlet;}public void process(Request request, Response response) throws IOException {//加载loader, 以获得具体servlet的上级目录URLClassLoader loader = getServletLoader();//通过request中的uri和loader中的上级目录加载对应的具体servlet类处理请求Servlet servlet = getServlet(loader, request);//用加载的servlet类处理请求servlet.service(request, response);
}

主要方法功能解释

  1. Class servletClass = loader.loadClass(servletName);
    loader会从webrootUrl的路径下尝试加载名字为servletName的类,这是实现请求动态资源的关键
  2. 用loader和request加载具体的servlet,再用该servlet处理请求,输出内容

改进Connector

改进Connector使其能够处理来自客户端对动态资源的访问请求

      if (request.getRequestURI().startsWith("/servlet/")) {ServletProcessor processor = new ServletProcessor();processor.process(request, response);} else {StaticProcessor processor = new StaticProcessor();processor.process(request, response);}
  • 如果请求是以/servlet/开头的,代表是对动态资源的请求,则将该请求交由ServletProcessor处理
  • 如果不是以/servlet/开头的,代表是对静态资源的请求,则交由StaticProcessor处理

测试

IDE客户端请求测试

    public static void main(String[] args)throws Exception{Socket socket = new Socket("localhost", 8888);OutputStream output = socket.getOutputStream();output.write("GET /servlet/TimeServlet HTTP/1.1".getBytes());socket.shutdownOutput();InputStream input = socket.getInputStream();byte[] buffer = new byte[2048];int length = input.read(buffer);StringBuilder response = new StringBuilder();for (int j=0; j<length; j++) {response.append((char)buffer[j]);}System.out.println(response.toString());socket.shutdownInput();socket.close();}

web浏览器测试

在这里插入图片描述
上述两种测试方法均能返回正确结果

关键字:中小企业网站设计_龙岗区最新通告_b2b外贸接单平台_江苏网页定制

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: