JavaWeb-Servlet

  • Servlet

Serlvet 是 Java Web 的基石,与平台无关的服务器组件,运行在 Web 容器(Tomcat)中,负责与客户端进行通信。

  • Servlet功能

1、创建并返回基于客户端请求的动态 HTML 页面
2、与数据库进行通信

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;
    ServletConfig getServletConfig();
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    String getServletInfo();
    void destroy();
}
@WebServlet("/hello")
public class HelloServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        PrintWriter writer = servletResponse.getWriter();
        writer.write("hello world");

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
  • 题目

要求写一个 WEB 应用服务,不能使用 Servlet 接口,用 Socket 实现,可以响应 GET 请求,打印请求信息,并判断请求资源,是否存在,不存在则返回 404,若存在,返回该资源,并且可以返回默认的静态页面。

  • 思路

MyHttpServer:定义 Socket 服务,循环接收请求。
MyHttpRequest:自定义请求对象,解析请求。
MyHttpResponse:自定义响应对象,响应请求。

  • 代码
public class MyHttpServer {
    public static String WebContent = System.getProperty("user.dir")+ File.separator +"WebContent";
    private int port = 8080;
    private boolean isShutdown = false;
    public void receiving(){
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //接收请求
        while (!isShutdown){
            Socket socket = null;
            InputStream inputStream = null;
            OutputStream outputStream = null;
            try {
                //获取连接
                socket = serverSocket.accept();
                inputStream = socket.getInputStream();
                outputStream = socket.getOutputStream();
                //解析请求
                MyHttpRequest request = new MyHttpRequest(inputStream);
                request.parse();
                //响应
                MyHttpResponse response = new MyHttpResponse(outputStream);
                response.sendStaticResource(request);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    socket.close();
                    inputStream.close();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class MyHttpRequest {

    private InputStream inputStream;
    private String uri;

    public MyHttpRequest(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public void parse(){
        StringBuffer stringBuffer = new StringBuffer(1024);
        int i = 0;
        byte[] buffer = new byte[1024];
        try {
            i = inputStream.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (int j = 0; j < i; j++) {
            stringBuffer.append((char)buffer[j]);
        }
        uri = parseUri(stringBuffer.toString());
    }

    public String parseUri(String requestStr){
        int index1,index2;
        index1 = requestStr.indexOf(' ');
        if(index1 != -1){
            index2 = requestStr.indexOf(' ',index1+1);
            if(index2 > index1){
                return requestStr.substring(index1+1, index2);
            }
        }
        return null;
    }

    public String getUri(){
        return uri;
    }
}
public class MyHttpResponse {
    private OutputStream outputStream;

    public MyHttpResponse(OutputStream outputStream) {
        this.outputStream = outputStream;
    }

    public void sendStaticResource(MyHttpRequest request){
        byte[] bytes = new byte[1024];
        FileInputStream fileInputStream = null;
        //将请求中包含的资源进行返回
        //获取请求中包含的资源
        String filePath = request.getUri();
        //资源不存存在,返回404
        //资源存在,返回资源
        //指定默认资源
        if(filePath.equals("/")){
            filePath = "/index.html";
        }
        try {
            //响应
            String response = null;
            File file = new File(MyHttpServer.WebContent,filePath);
            byte[] fileByte = new byte[(int)file.length()];
            if(file.exists()){
                fileInputStream = new FileInputStream(file);
                fileInputStream.read(fileByte);
                response = new String(fileByte);
                response = warpMessage("200", response);
            }else{
                //返回404
                response = warpMessage("404", "404 File Not Found! The requested URL /404/ was" +
                        "not found on this server.");
            }
            this.outputStream.write(response.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String warpMessage(String status,String response){
        return "HTTP/1.1 "+status+"\r\n"+"Content-type: text/html\r\n"
                +"Content-Length: "+response.length()
                +"\r\n"+"\r\n"+response;
    }
}
  • Servlet中的方法

init 初始化 Servlet,获取初始化参数
getServletConfig 获取 Servlet 信息
service 实现业务功能,核心方法
getServletInfo 获取 Servlet 信息
destory Tomcat 服务关闭的时候,关闭某些资源

  • Servlet体系

第一层 Servlet 接口
第二层 GenericServlet 屏蔽不需要的方法
第三层 HttpServlet 进行请求分发以及类型转换
开发者的类只需要继承 HttpServlet 即可,进行简化的开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值