2.8 servlet1

2.8 servlet1

请添加图片描述
请添加图片描述

  • 服务器基本模式图在这里插入图片描述

1.servlet简介

Servlet
1.由官方定义的开发组件
  (request对象   解析请求报文)
  (response对象  写响应报文)
  
2.自定义servlet
  继承HttpServlet
  重写doGet doPost
  配置访问地址

3.servlet可以配置参数
  load-on-startup  配置启动顺序
  改变servlet生命周期  把实例创建提前到服务器启动时创建

4.处理乱码
  请求乱码
  req.setCharacterEncoding("utf-8");
  响应乱码
  resp.setContentType("text/html;charset=utf-8");

常见http响应码
200 成功
404 资源不存在
403 没有权限
405 方法未设置
500 服务器内部错误(代码有错误)
  • mapping.peoperties
servlet.one.url=/login
servlet.one.class=com.javasm.servlet.LoginServlet

servlet.two.url=/regist
servlet.two.class=com.javasm.servlet.RegistServlet


servlet.three.url=/user
servlet.three.class=com.javasm.servlet.UserServlet

2 .手写实现服务器最基础功能

(请求数据接收处理)MyReq.java

package com.javasm.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class MyReq {
    /*
    * 读取输入流  解析输入流中主要内容
    *
    * */
    private String method;
    private String url;
    public MyReq(InputStream is){
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        try {
            //解析请求报文第一行中的 method 和url
            String httpHead = br.readLine();
            String[] kav = httpHead.split(" ");
            String method = kav[0];
            String url = kav[1];
            this.method = method;
            this.url = url;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public String getMethod() {
        return method;
    }
    public String getUrl() {
        return url;
    }
}

(响应数据处理)MyResp.java

package com.javasm.http;

import java.io.OutputStream;

public class MyResp {

    private OutputStream writer;
    public static String respHeader = "HTTP/1.1 200 OK\r\n"
                              +"Content-Type:text/html;charset=utf-8\r\n"
                              +"\r\n";
    public MyResp(OutputStream os){
        //对OutputStream 重新封装
        this.writer = os;
    }
    public OutputStream getWriter() {
        return writer;
    }
}

(主容器) MyServer.java

package com.javasm.server;

import com.javasm.http.MyReq;
import com.javasm.http.MyResp;
import com.javasm.servlet.MyServlet;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class MyServer {

    //服务容器
    public static Map<String, MyServlet> mapping = new HashMap<String, MyServlet>();

    public static Properties prop = new Properties();

    //根据配置文件 把服务容器中的数据组织好
    public static void myInit(){
        //String filePath = MyServer.class.getResource("/").getPath();
        //System.out.println(filePath);
        try {
            prop.load( MyServer.class.getResourceAsStream("/mapping.peoperties"));
            System.out.println(prop);
            Set<Object> keys = prop.keySet();

            for(Object key: keys){
                if(key.toString().contains("url")){
                    String url = prop.getProperty(key.toString());
                    String classKey = key.toString().replace("url","class");
                    String className = prop.getProperty(classKey);
                    MyServlet ms =(MyServlet) Class.forName(className).newInstance();
                    mapping.put(url,ms);
                }
            }
            System.out.println(mapping);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void startServer(){
        try {
            ServerSocket serverSocket = new ServerSocket(8083);
            System.out.println("服务器启动 开始监听8083端口");
            while(true){
                /*
                * 使用多线程
                * 把主线程功能分离给子线程执行
                * */
                Socket socket = serverSocket.accept();
                Thread newThread = new ProcessThread(socket);
                newThread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static void main(String[] args) {
        MyServer.myInit();
        MyServer.startServer();
    }
}

(多线程处理)ProcessThread.java

package com.javasm.server;

import com.javasm.http.MyReq;
import com.javasm.http.MyResp;
import com.javasm.servlet.MyServlet;

import java.io.OutputStream;
import java.net.Socket;
public class ProcessThread extends Thread {
    private Socket socket;
    public ProcessThread(Socket socket){
            this.socket = socket;
    }
    @Override
    public void run() {
        try{
            MyReq req= new MyReq(socket.getInputStream());
            MyResp resp = new MyResp(socket.getOutputStream());
            String url = req.getUrl();//当次请求的资源地址

            MyServlet myServlet = MyServer.mapping.get(url);//执行的类
            if(myServlet!=null){
                myServlet.doService(req,resp);
            }else{
                OutputStream writer = resp.getWriter();
                writer.write(MyResp.respHeader.getBytes());
                //友好的找不到服务的提示
                writer.write("404 not found!!!!!".getBytes());
                writer.flush();
                writer.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

(分发器)MyServlet.java

package com.javasm.servlet;

import com.javasm.http.MyReq;
import com.javasm.http.MyResp;

public abstract class MyServlet {

    public void doService(MyReq req, MyResp resp){
        /*
        * 方法细分  可以在同一个请求地址下(类)
        *           根据不同条件执行
        * */
        if("GET".equals(req.getMethod())){
            doGet(req,resp);
        }else  if("POST".equals(req.getMethod())){
            doPost(req,resp);
        }/*else  if("DELETE".equals(req.getMethod())){
            doDelete(req,resp);
        }*/

    }

    public abstract void doGet(MyReq req, MyResp resp);

    public abstract void doPost(MyReq req, MyResp resp);

}

(servlet类)RegistServlet.java

package com.javasm.servlet;

import com.javasm.http.MyReq;
import com.javasm.http.MyResp;

import java.io.IOException;
import java.io.OutputStream;

public class RegistServlet extends MyServlet {

    @Override
    public void doGet(MyReq req, MyResp resp) {

        OutputStream writer = resp.getWriter();
        try {
            writer.write(MyResp.respHeader.getBytes());
            writer.write("regist ok!!!!".getBytes());
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void doPost(MyReq req, MyResp resp) {
    }
}

(servlet类) LoginServlet.java

package com.javasm.servlet;

import com.javasm.http.MyReq;
import com.javasm.http.MyResp;

import java.io.IOException;
import java.io.OutputStream;

public class LoginServlet extends MyServlet {
    @Override
    public void doGet(MyReq req, MyResp resp) {

        OutputStream writer = resp.getWriter();
        try {
            writer.write(MyResp.respHeader.getBytes());
            writer.write("login ok!!!!".getBytes());
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    @Override
    public void doPost(MyReq req, MyResp resp) {

    }
}

(servlet类) UserServlet.java

package com.javasm.servlet;

import com.javasm.http.MyReq;
import com.javasm.http.MyResp;

import java.io.IOException;
import java.io.OutputStream;

public class UserServlet extends MyServlet {
    @Override
    public void doGet(MyReq req, MyResp resp) {
        OutputStream writer = resp.getWriter();
        try {
            writer.write(MyResp.respHeader.getBytes());
            writer.write("<h1>用户信息表 ok!!!!</h1>".getBytes());
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void doPost(MyReq req, MyResp resp) {
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值