javaSE_day21——服务器
v5:定义HttpResponse类
该类用于定义响应页面的相关内容
- 定义HTTPResponse类在com.tedu.http包中
- 定义变量: OutputStream out; File entity;
定义setEntity()和getEntity()方法。 - 定义构造方法:HttpResponse(OutputStream out)
功能:初始化out成员变量 - 定义方法: println(String line) :void
功能: 向客户端发送一行字符串 - 定义方法sendStatusLine():void
功能:发送状态行信息 - 定义方法:getMimeTypeByEntity():String
功能:根据实体文件的名字获取对应的介质类型,Content-Type使用的值(常用的几种):根据文件扩展名返回文件的介质类型 - 定义方法:sendHeaders();
功能:响应头信息 - 定义方法: sendContent()
功能:发送响应正文信息 - 定义方法:flush() : void
功能:调用sendStatusLine();sendHeaders();sendContent()
HttpResponse.java:
package cn.tedu.http;
public class HttpResponse {
OutputStream out;
File entity;
public HttpResponse(OutputStream out) {
this.out = out;
}
//发送状态行信息
public void sendStatusLine() {
String line="HTTP/1.1 200 OK";
this.println(line);
}
//功能:遍历响应头信息
public void sendHeaders(){
String contentType="Content-Type:"+getMimeTypeByEntity();
this.println(contentType);
String contentLength = "Content-Length:"+entity.length();
this.println(contentLength);
this.println("");
}
//功能:发送响应正文信息
public void sendContent() {
FileInputStream fin;
try {
fin = new FileInputStream(this.entity);
byte[] buffer = new byte[(int) this.entity.length()];
fin.read(buffer);
out.write(buffer);
fin.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//功能:根据实体文件的名字获取对应的介质类型,Content-Type使用的值(常用的几种):根据文件扩展名返回文件的介质类型
public String getMimeTypeByEntity(){
//文件的扩展名
int index = this.entity.getName().lastIndexOf(".");
String name = this.entity.getName().substring(index+1);
if("html".equals(name)){
return "text/html";
}else if("jpg".equals(name)){
return "image/jpg";
}else if("png".equals(name)){
return "image/png";
}
else if("gif".equals(name)){
return "image/gif";
}
return "";
}
public void println(String line) {
try {
out.write(line.getBytes());
out.write(13);
out.write(10);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//功能:调用sendStatusLine();sendHeaders();sendContent()
public void flush() {
this.sendStatusLine();
this.sendHeaders();
this.sendContent();
}
public File getEntity() {
return entity;
}
public void setEntity(File entity) {
this.entity = entity;
}
}
相当于v4中的webServer:
WebServer.java
v6:定义HttpContext类
一、在com.tedu.core中添加一个类HttpContext
该类用于定义相关Http协议的内容
比如头信息中Content-Type的值与文件后缀的关系等.
- 在com.tedu.core包中定义HttpContext类
- 定义两个常量int CR = 13; int LF = 10;
- 定义介质的类型静态变量 Map<String,String> mimeTypeMapping;
- 定义方法private static void initMimeTypeMapping()
功能:初始化介质的类型 - 定义public static String getContentTypeByMime(String mime)方法
功能:根据给定的介质类型获取对应的Content-Type的值 - 定义初始化的方法public static void init()
功能:完成HTTPContext初始化的功能 - 定义静态块
功能:HttpContext加载的时候开始初始化
二、在HttpResponse中进行代码重构
- 添加一个Map属性,用于保存响应的所有响应头信息.
- 添加常用头的设置方法,供外界设置响应头:
(1)把内容类型添加到头信息中
(2)把响应文件的长度添加到头信息中 - 重新实现sendHeaders方法。
- 重构WebServer的run方法。
HttpContext .java:
package cn.tedu.core;
/**
* 该类用于定义相关Http协议的内容.
比如头信息中Content-Type的值与文件后缀的关系等.
* @author Dell
*/
public class HttpContext {
public static int CR = 13;
public static int LF = 10;
private static Map<String,String> map;
//功能:HttpContext加载的时候开始初始化
static{
init();
}
//功能:初始化介质的类型
private static void initMimeType() {
map = new HashMap<String,String>();
map.put("html", "text/html");
map.put("jpg", "image/jpeg");
map.put("gif", "image/gif");
map.put("png", "image/png");
}
//功能:完成HTTPContext初始化的功能
public static void init() {
//1 初始化介质类型映射
initMimeType();
}
//功能:根据给定的介质类型获取对应的Content-Type的值(返回扩展名的媒体类型)
public static String getContentTypeByMime(String key) {
return map.get(key);
}
}
HttpResponse.java:
WebServer.java:
v7:完成HttpRequest中对消息头的解析工作
- HttpRequest中使用Map创建一个属性headers,用于保存所有客户端发送过来的消息头信息。
- 添加方法parseHeaders,用于解析所有的消息头。
- 封装方法readLine()。
HttpRequest.java:
测试:
v8:完成注册的功能
-
重构HttpRequest类
1)添加成员变量
//保存服务器的url,不带?的url的register
private String requestUrl;
//请求所附带的所有参数
private Map<String,String> params = new HashMap<String,String>();2)定义paresUrl():
功能完成:判读是否有?,如果有解析出来放到map集合中3)在parseRquestLine方法中调用
4)定义getParameter方法,和getRequestUrl
-
重构run方法
处理注册功能,响应页面到客户端 -
定义forward方法,响应视图
-
测试:http://localhost:8080/myweb/register.html
register.html
registerok.html
HttpRequest.java
WebServer.java
测试结果:
v9:解析介质文件web.xml
- 重构:HTTPContext类的 initMimeTypeMapping方法
- 测试:
public static void main(String args[]){
System.out.println(getMimeType(“afp”));
}
HttpContext.java
测试结果: