JavaWeb学习的第十天(JavaWeb基础知识讲解以及搭建一个浏览器能够访问的Http的服务器)

一、JavaWeb的知识介绍

1.什么是JavaWeb

利用Java语句开发互联网网站,它的任务不是制作静态资源页面,而是要去编写动态资源界面
用到的技术点有:JSP Servlet Cookie Session

2.两种互联网架构--C/S和B/S

C/S:Client/Server(客户端与服务器)
B/S:Bowser/Server(浏览器与服务器)--通过浏览器输入网址就可以访问对应的服务器

3.C/S和B/S的优缺点

C/S
	优点:用户体验更好
	缺点:安装开发维护和部署都比较麻烦
B/S
	优点:不需要安装客户端应用程序所带来的一系列问题
	缺点:用户体验感比C/S的差一点

4.对于浏览器的访问,是访问服务器中的资源,而服务器中的资源就以页面的形式展示给用户看
5.服务器资源分类

静态资源:不同的用户访问服务器的时候,所看到的内容是一样的
	静态资源有Html Css Js
动态资源:不同的用户访问服务器的时候,所看到的内容是不一样的
	例如,当我们访问淘宝网的时候,用户名就是不一样的
	动态资源有JSP Servlet php asp.net
注意:Js是一种静态资源,因为不同的两个人浏览同一个界面显示的是同一个界面
比如我们常常看到网站首页有一个轮播图,虽然它是有动态效果,但是轮播的画面都是一样的

一定要注意:动态效果!=动态资源

6.服务器如何响应静态资源和动态资源

1.访问静态资源时,服务器响应并将静态资源(html页面)返回给浏览器,这是需要使用浏览器的解析引擎将这些资源解析成用户看的懂的界面
2.访问动态资源时,浏览器的进行引擎是无法解析动态资源的,需要先将动态资源转换成静态资源,再返回给浏览器

二、使用代码完成一个浏览器能够访问的简单的服务器


1.Demo演示:当浏览器输入127.0.0.1:8080/index.html时服务器接收到请求并响应

package com.bianyiit.cast;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(8080);
        while (true) {
            try {
                Socket socket = serverSocket.accept();
                //获取客户端数据
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int read = inputStream.read(bytes);
                System.out.println(new String(bytes,0,read));

                //给客户端响应数据
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("HTTP/1.1 200 ok \n".getBytes());
                outputStream.write("Content-Type:text/html;charset=utf-8 \n".getBytes());
                outputStream.write("\n".getBytes());
                outputStream.write("hello bianyiit".getBytes()); //给浏览器返回一串自定义的字符
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端显示情况

服务器显示情况

2.一个请求包含请求行,请求头和请求体三部分,它们都是以键值对的形式发送过来的,同时他们都是独占一行的

3.一个响应包含响应行,响应头和响应体三部分,它们都是以键值对的形式发送过来的,同时他们都是独占一行的


注意:

由于请求体和响应体,小编没有抓包工具,只能演示到这种程度,但是我们要知道请求行,请求头,请求体以及响应行,响应头和响应体都是独占一行的,这个在代码中使用"\n"提现出来的

二、使用代码完成请求服务器返回一个html页面至浏览器

1.Demo演示:当我们输入127.0.0.1/new_file01.html时能够显示该界面的内容

package com.bianyiit.cast;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(8080);
        while (true) {
            try {
                Socket socket = serverSocket.accept();
                //获取客户端数据
                InputStream inputStream = socket.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String line = bufferedReader.readLine();
                String resourceName = getResource(line);
                System.out.println(resourceName);

                //给客户端响应数据
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("HTTP/1.1 200 ok \n".getBytes());
                outputStream.write("Content-Type:text/html;charset=utf-8 \n".getBytes());
                outputStream.write("\n".getBytes());
                FileInputStream fis = new FileInputStream("D:\\HBuilder_V6.3.1\\Day1\\homepage\\" + resourceName);
                byte[] buf=new byte[2048];
                int len=0;
                while ((len=fis.read(buf))!=-1){
                    outputStream.write(buf,0,len);
                }
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static String getResource(String line){
        String resourceName = line.split(" ")[1];
        resourceName = resourceName.substring(1);
        return resourceName;
    }
}

new_file01.html存在的目录

客户端显示情况

服务器显示情况

三、优化第二个Demo服务器的代码

将里面的一些灵活多变的信息(端口,html存放的目录...)放入一个xml配置文档中,当我们需要更改里面的信息时,只需要更改配置文件中的内容即可,不用对着代码去更改

1.Demo演示--需要用到的两个jar包

链接:https://pan.baidu.com/s/1tNMjJziJHI0PVODBY6V7-w 
提取码:g2wp 
复制这段内容后打开百度网盘手机App,操作更方便哦

//XmlUtils.java--工具类:用来获取端口号和html存放的目录
package com.bianyiit.cast.util;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;

public class XmlUtils {
    public static int getPort(){
        int port = 8080;
        try {
            InputStream is = XmlUtils.class.getClassLoader().getResourceAsStream("server.xml");
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(is);
            Element serverNode = (Element) document.selectSingleNode("/server");
            String portStr = serverNode.attributeValue("port");
            port = Integer.parseInt(portStr.trim());

        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return port;
    }

    public static String getDocBase(){
        String  docBase = "";
        try {
            InputStream is = XmlUtils.class.getClassLoader().getResourceAsStream("server.xml");

            SAXReader saxReader = new SAXReader();

            Document document = saxReader.read(is);
            Element serverNode = (Element) document.selectSingleNode("/server/Context");
            docBase = serverNode.attributeValue("docBase");


        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return docBase;
    }
}
package com.bianyiit.cast;

import com.bianyiit.cast.util.XmlUtils;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        int port = XmlUtils.getPort();
        String docBase = XmlUtils.getDocBase();
        
        ServerSocket serverSocket=new ServerSocket(port);
        while (true) {
            try {
                Socket socket = serverSocket.accept();
                //获取客户端数据
                InputStream inputStream = socket.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String line = bufferedReader.readLine();
                //System.out.println(line);
                String resourceName = getResource(line);
                System.out.println(resourceName);

                //给客户端响应数据
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("HTTP/1.1 200 ok \n".getBytes());
                outputStream.write("Content-Type:text/html;charset=utf-8 \n".getBytes());
                outputStream.write("\n".getBytes());
                FileInputStream fis = new FileInputStream(docBase + "/" + resourceName);
                byte[] buf=new byte[2048];
                int len=0;
                while ((len=fis.read(buf))!=-1){
                    outputStream.write(buf,0,len);
                }
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static String getResource(String line){
        String resourceName = line.split(" ")[1];
        resourceName = resourceName.substring(1);
        return resourceName;
    }
}

2.项目结构和xml文件中存放的内容

总结

这里就不演示结果了,我们发现这种方式,当我们打开IDEA启动服务器,使用浏览器输入127.0.0.1:8080/xxx.html时往往要等很久,
而且有的时候报下述异常 ,这是只是为了让大家能够了解服务器处理了哪些操作而已,我们所搭建的服务器只支持单线程,而且可能一下就崩了,
那么小编的下一节内容就教大家用一个免费的web服务器-tomcat,那个比我们自己写的服务器要稳定的多,而且人家是开源免费的!!

发布了73 篇原创文章 · 获赞 11 · 访问量 2444

猜你喜欢

转载自blog.csdn.net/weixin_43908333/article/details/103655757