其他分享
首页 > 其他分享> > day30(V6:显示第一个页面、V7:404网页)

day30(V6:显示第一个页面、V7:404网页)

作者:互联网

day30(V6:显示第一个页面、V7:404网页)

1.v6

1.主要内容

2.ClientHandler

package com.webserver.core;

import com.webserver.http.HttpServletRequest;

import java.io.*;
import java.net.Socket;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* 该线程任务负责与指定客户端完成HTTP交互
* 与客户端交流的流程分成三步:
* 1:解析请求
* 2:处理请求
* 3:发送响应
*/
public class ClientHandler implements Runnable {
   private Socket socket;

   public ClientHandler(Socket socket) {
       this.socket = socket;
  }

   @Override
   public void run() {
       try {
           //1 解析请求
           HttpServletRequest request = new HttpServletRequest(socket);
           //2 处理请求
           /*通过请求对象,获取浏览器地址栏中的抽象路径部分*/
           String path = request.getUri();//path:/myweb/index.html
           //3 发送响应
           //定位要发送的文件(将src/main/resources/static/myweb/index.html)
           /*定义为resource目录(maven项目中src/main/java和src/main/resources实际上是一个目录)
               只不过java目录中存放的都是.java的源代码文件
               而resources目录下存放的就是非.java的其他程序中需要用到的资源文件

               实际开发中,我们在定位目录时,常使用相对路径,而实际应用的相对路径都是类加载路径
               类加载路径可以用:
               类名.class.getClassLoader().getResource(".")就是类加载路径
               这里可以理解为时src/main/java目录或src/main/resources
               真是表达的是编译后这两个目录最终合并的target/classes目录。*/
           File root = new File(
                   ClientHandler.class.getClassLoader().getResource(".").toURI()
          );
             /*
               root表达的是target/classes
               从根开始寻找static目录
            */
           File staticDir = new File(root, "static");
           /*在static目录下定位index.html文件*/
           File file = new File(staticDir, path);
           System.out.println("资源是否存在:" + file.exists());
           //3.1发送状态行
           println("HTTP/1.1 200 OK");
           //3.2发送响应头
           println("Connection-Type:text/html");
           println("Content-Length:" + file.length());
           println("");
           //3.3发送响应正文(index.html页面的数据)
           OutputStream out = socket.getOutputStream();
           FileInputStream fis = new FileInputStream(file);
           int len;
           byte[] data = new byte[1024 * 10];
           while ((len = fis.read(data)) != -1) {
               out.write(data, 0, len);
          }
      } catch (IOException | URISyntaxException e) {
           e.printStackTrace();
      } finally {
           //HTTP协议要求,响应客户端后与TCP断开连接
           try {
               socket.close();
          } catch (IOException e) {
               e.printStackTrace();
          }
      }
  }

   private void println(String line) throws IOException {

       OutputStream out = socket.getOutputStream();
       byte[] data = line.getBytes(StandardCharsets.ISO_8859_1);
       out.write(data);
       out.write(13);//单独发送回车符
       out.write(10);//单独发送换行符


  }

}

3.index.html:(src/main/resource/static/myweb/index.html)

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>我的首页</title>
</head>
<body>
<!--
    <h1>--<h6>:标题,标题独立占一行,分别表示1级-6级标题
    <center>:居中显示,该标签在html5中已经不再建议使用了。
    <input>:输入组件,该组件用来在页面上获取用户的输入。
            该组件有一个重要的属性:type,用来指定组件的样子。
            常见的值有:
            type="text":文本框
            type="password":密码框
            type="radio":单选框
            type="checkbox":复选框
            type="button":按钮
    <br>:换行
    <a>:超链接,标签中间的文本就是超链接上显示的内容,href属性用于指定点击后
        跳转的路径。
    <table>标签:表格。属性border用于指定边框。
             <table>标签中包含<tr>标签用于表示行
             <tr>标签中包含<td>标签用于表示列
             <td>标签中常见属性:
             align:对其方式。left左对齐,right右对齐,center剧中对其
             colspan:跨列合并列,合并是从左向右合并列
             rowspan:跨行合并列,合并是从上向下合并列
-->
<center class="table">
   <h1>百度</h1>
   <input type="text" size="32">
   <input type="button" value="百度一下"><br>
   <!-- 单选框和复选框可以用name属性将其划分为一组,名字相同的为一组。 -->
   <input type="radio" name="gender">男
   <input type="radio" name="gender">女<br>
   <a href="http://www.taobao.com">淘宝</a>
   <a href="http://www.jd.com">京东</a><br>
   <table border="1">
       <tr>
           <td>第一列</td>
           <td>第二列</td>
           <td colspan="2" align="center">第三列</td>
       </tr>
       <tr>
           <td>第一列</td>
           <td rowspan="2">第二列</td>
           <td>第三列</td>
           <td>第四列</td>
       </tr>
       <tr>
           <td>第一列</td>

           <td>第三列</td>
           <td>第四列</td>
       </tr>
   </table>



</center>
<style>

   body{
       color: #eee;
       background:url(https://img.3dmgame.com/uploads/images/thumbpicfirst/20190219/1550546216_738489.jpg) no-repeat center;
       background-size: cover;
  }
</style>
</body>
</html>

 

2.v7

1.主要内容

2.ClientHandler

package com.webserver.core;

import com.webserver.http.HttpServletRequest;

import java.io.*;
import java.net.Socket;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* 该线程任务负责与指定客户端完成HTTP交互
* 与客户端交流的流程分成三步:
* 1:解析请求
* 2:处理请求
* 3:发送响应
*/
public class ClientHandler implements Runnable {
   private Socket socket;

   public ClientHandler(Socket socket) {
       this.socket = socket;
  }

   @Override
   public void run() {
       try {
           //1 解析请求
           HttpServletRequest request = new HttpServletRequest(socket);
           //2 处理请求
           /*通过请求对象,获取浏览器地址栏中的抽象路径部分*/
           String path = request.getUri();//path:/myweb/index.html
           File root = new File(ClientHandler.class.getClassLoader().getResource(".").toURI());
           File staticDir = new File(root, "static");

           File file = new File(staticDir, path);
           System.out.println("资源是否存在:" + file.exists());
           if (file.exists()){

               //3.1发送状态行
               println("HTTP/1.1 200 OK");
               //3.2发送响应头
               println("Connection-Type:text/html");
               println("Content-Length:" + file.length());
               println("");
          }else {
               file = new File(staticDir,"/root/404.html");
               println("HTTP/1.1 404 NotFound");
               //3.2发送响应头
               println("Connection-Type:text/html");
               println("Content-Length:" + file.length());
               println("");
          }
           //3 发送响应


           //3.3发送响应正文(index.html页面的数据)
           OutputStream out = socket.getOutputStream();
           FileInputStream fis = new FileInputStream(file);
           int len;
           byte[] data = new byte[1024 * 10];
           while ((len = fis.read(data)) != -1) {
               out.write(data, 0, len);
          }
      } catch (IOException | URISyntaxException e) {
           e.printStackTrace();
      } finally {
           //HTTP协议要求,响应客户端后与TCP断开连接
           try {
               socket.close();
          } catch (IOException e) {
               e.printStackTrace();
          }
      }
  }

   private void println(String line) throws IOException {

       OutputStream out = socket.getOutputStream();
       byte[] data = line.getBytes(StandardCharsets.ISO_8859_1);
       out.write(data);
       out.write(13);//单独发送回车符
       out.write(10);//单独发送换行符


  }

}

3.404.html:(src/main/resource/static/root/404.html)

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>404</title>
</head>
<body>
<center>404 NOT FOUNT 资源不存在</center>
<style>

   body{

       color: red;
       background:url(https://img.3dmgame.com/uploads/images/thumbpicfirst/20190219/1550546216_738489.jpg) no-repeat center ;
       background-size: cover;

  }
</style>
</body>
</html>

 

 

标签:java,File,响应,day30,404,html,V6,println,import
来源: https://www.cnblogs.com/xiaoyezilei/p/16132420.html