1、封装响应头消息
public class ResponseHeaderUtil {
public static String getHeader200Str(long contentLength){
return "HTTP/1.1 200 OK \n" +
"Content-Type: text/html \n" +
"Content-Length: " + contentLength + " \n" +
"\r\n";
}
public static String getHeader404Str(){
String str = "<h1>404 not found</h1>";
return "HTTP/1.1 404 not found \n" +
"Content-Type: text/html \n" +
"Content-Length: " + str.getBytes().length + " \n" +
"\r\n";
}
}
2、封装静态输出页面对象
ublic class StaticResourceUtil {
//获取静态资源路径
public static String getAbsolutePath(String path){
String absolutePath = StaticResourceUtil.class.getResource("/").getPath();
return absolutePath.replaceAll("\\\\","/") + path;
}
//读取静态资源输入流,通过输出流输出
public static void outputStaticResource(InputStream inputStream, OutputStream outputStream) throws IOException {
int count = 0;
while (count == 0){
count = inputStream.available();
}
int resourceSize = count;
//输出http请求头
outputStream.write(ResponseHeaderUtil.getHeader200Str(resourceSize).getBytes());
int written = 0;
int byteSize = 1024;
byte[] bytes = new byte[byteSize];
while (written < resourceSize){
if(written + byteSize > resourceSize){
byteSize = resourceSize - written;
bytes = new byte[byteSize];
}
inputStream.read(bytes);
outputStream.write(bytes);
outputStream.flush();
written += byteSize;
}
}
}
3、servlet 对象
public interface Servlet {
void service(Request request,Response response);
void doGet(Request request,Response response);
void doPost(Request request,Response response);
}
public abstract class HttpServlet implements Servlet{
@Override
public void service(Request request,Response response) {
String method = request.getMethod();
if("GET".equalsIgnoreCase(method)){
doGet(request,response);
}else{
doPost(request,response);
}
}
@Override
public abstract void doGet(Request request,Response response);
@Override
public abstract void doPost(Request request,Response response);
}
public class LagoServlet extends HttpServlet{
@Override
public void doGet(Request request,Response response) {
String content = "<h1>LagouServlet Get</h1>";
try {
response.output(ResponseHeaderUtil.getHeader200Str(content.length()) + content);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void doPost(Request request,Response response) {
String content = "<h1>LagouServlet Post</h1>";
try {
response.output(ResponseHeaderUtil.getHeader200Str(content.length()) + content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
4、web.xml 配置、
<?xml version="1.0" encoding="utf-8" ?>
<web-app>
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>com.deppon.tomcat.LagoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>/lagou</url-pattern>
</servlet-mapping>
</web-app>
5、request对象
@Data
public class Request {
private String method;
private String url;
private InputStream inputStream;
public Request(InputStream inputStream) throws IOException {
this.inputStream = inputStream;
int count = 0;
while (count == 0){
count = inputStream.available();
}
byte[] bytes = new byte[count];
inputStream.read(bytes);
String input = new String(bytes);
/**
* GET / HTTP/1.1
* Host: localhost:8080
*/
String firstLoneStr = input.split("\\n")[0];
String[] strings = firstLoneStr.split(" ");
this.method = strings[0];
this.url = strings[1];
System.out.println("method:" + method);
System.out.println("url:" + url);
}
public Request() {
}
}
6、response对象
@Data
public class Response {
private OutputStream outputStream;
public Response() {
}
public Response(OutputStream outputStream) {
this.outputStream = outputStream;
}
public void outputHtml(String path) throws IOException {
String absolutePath = StaticResourceUtil.getAbsolutePath(path);
System.out.println("absolutePath:" + absolutePath);
File file = new File(absolutePath);
if(file.exists() && file.isFile()){
StaticResourceUtil.outputStaticResource(new FileInputStream(file),outputStream);
}else{
String str = "<h1>404 not found</h1>";
output(ResponseHeaderUtil.getHeader404Str() + str);
}
}
public void output(String content) throws IOException {
outputStream.write(content.getBytes());
}
}
7、Bootstrap 启动类
public class Bootstrap {
private int port = 8080;
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public void start() throws IOException {
System.out.println("tomcat 开始启动.......");
loadServlet();
ServerSocket serverSocket = new ServerSocket(port);
while (true){
Socket socket = serverSocket.accept();
Request request = new Request(socket.getInputStream());
Response response = new Response(socket.getOutputStream());
if(servletMap.get(request.getUrl()) == null){
response.outputHtml(request.getUrl());
}else{
HttpServlet httpServlet = servletMap.get(request.getUrl());
httpServlet.service(request,response);
}
socket.close();
}
}
Map<String,HttpServlet> servletMap = new HashMap<>();
private void loadServlet() {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("web.xml");
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(inputStream);
Element rootElement = document.getRootElement();
List<Element> list = rootElement.selectNodes("//servlet");
for (int i = 0; i < list.size(); i++) {
Element element = list.get(i);
Element servletnameElement = (Element) element.selectSingleNode("//servlet-name");
String servletName = servletnameElement.getStringValue();
Element servletclassElement = (Element) element.selectSingleNode("//servlet-class");
String servletClass = servletclassElement.getStringValue();
Element servletMapping = (Element) rootElement.selectSingleNode("/web-app/servlet-mapping[servlet-name='" + servletName + "']");
String urlPattern = servletMapping.selectSingleNode("url-pattern").getStringValue();
servletMap.put(urlPattern, (HttpServlet) Class.forName(servletClass).newInstance());
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
Bootstrap bootstrap = new Bootstrap();
bootstrap.start();
}
}