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) {
}
}

被折叠的 条评论
为什么被折叠?



