• 重拾Java Web应用的基础体系结构


    一、背景

    • Spring生态的强大与完善,使得大多数的Java程序员,在刚刚接触Java Web应用开发时,往往依赖于SSM、SpringBoot等各种高级框架。
    • Java Web的基础的体系结构是什么?到底是怎么运作的?这些高级的框架与基础的体系结构之间是什么关系?
    • 只有真正理清了这些底层基础的结构,才能完全理解高级框架的设计原理,在使用框架开发项目时做到事半功倍。
    • 本文旨在暂时抛开这些高级框架,重走Java Web底层之路。

    二、Web应用

    • Web应用的基础模型
    1. 用户通过Web浏览器向某个Web应用发出一个请求
    2. Web服务器得到请求后,处理并查找资源,并向Web浏览器返回一个响应结果。
      在这里插入图片描述

    2.1 HTML

    • Web服务器需要对客户端的请求提供响应内容,Web浏览器需要将这些响应内容呈现给用户。两者需要形成统一的对话语言,Web应用中形成的共同的语言被称为HTML(HyperText Markup Language:超文本标记语言)。

    • HTML包含数十个标记,数千种标记属性,能过这些标记定义了网页内容的含义和结构;正是无数个具有相互链接的HTML网页构成了我们现在的互联网世界。

    标记 描述
    html 定义HTML文档的边界
    head 定义HTML文档头部的边界
    body 定义HTML文档本体的边界
    tile 定义HTML文档本体的标题
    form 定义一个表单
    a 定义一个超链接
    ... ...
    <!-- HTML基础 -->
    <html>
      <head>
        <title>欢迎</title>
      </head>
      <body>
       <a href="https://www.baidu.com">百度</a>
      </body>
    </html>
    

    2.2 HTTP

    • Web浏览器与Web服务器之间相互通信同样需要建立统一的协议:Web应用的标准协议被称为HTTP(Hyper Text Transfer Protocol)超文本传输协议。
    • HTTP协议规定了超文本传输所要遵守的规则:HTTP请求可发起常用的GET或者POST请求;HTTP的响应中可以包含HTML内容。
      在这里插入图片描述
    curl https://www.baidu.com -v
    <!-- 通过HTTP向URL地址www.baidu.com发起 GET请求-->
    > GET / HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: www.baidu.com
    > Accept: */*
    <!-- Web服务器HTTP响应-->
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
    < Connection: keep-alive
    < Content-Length: 2443
    < Content-Type: text/html
    < Date: Tue, 25 Aug 2020 04:04:01 GMT
    < Etag: "588603eb-98b"
    < Last-Modified: Mon, 23 Jan 2017 13:23:55 GMT
    < Pragma: no-cache
    < Server: bfe/1.0.8.18
    < Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
    < 
    <!DOCTYPE html>
    <!--STATUS OK-->
    <html>
    <head>
    ...
        <title>百度一下,你就知道</title>
    </head>
    <body link=#0000cc>
        ...
    </body>
    </html>
    

    2.3 URL

    • Web应用上的每个资源都有唯一的地址进行定位,被称为URL(Uniform Resource Locatiors)统一资源定位符。
      1. URL中可包含额外的参数,会追加到URL的最后,以?开头,以&分隔各个参数,如:http://www.web.com:8080/welcome/hello.html?name=jack&age=20
      2. Web服务器中的应用一般默认在80端口运行,端口号为80的在URL中可省略不书写。
        在这里插入图片描述

    2.4 Servlet

    • Servlet是Server Applet的简写,也被称为运行在服务端的小程序,通过Servlet程序可以生成动态Web内容,实现Java Web服务器功能的扩展。
    • Servlet需要依付于Servlet容器(比如Tomcat等)才能运行
      在这里插入图片描述

    2.4.1 编写第一个Servlet程序

    • Java Servlet是一个接口,定义了Java类被浏览器访问到的规则。

    • Java程序员自定义一个类,实现Servlet接口并重写接口中的方法,Web服务器(如Tomcat等)就可以识别并执行这个程序。

    • 创建JavaEE项目
      在这里插入图片描述
      在这里插入图片描述

    • 定义一个类,实现Servlet接口,实现或重写接口中的方法

    /**
     * HttpServlet
     *
     * @author zhuhuix
     * @date 2020-08-25
     */
    public class HttpServletDemo extends HttpServlet {
    
        // 重写Get请求方法
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 业务逻辑处理
            LocalDate date = LocalDate.now();
    
            // 动态输出HTML页面
            PrintWriter out = resp.getWriter();
            out.println("<html>" +
                    "<body>" +
                    "<h1>"+date.toString()+"</h1> " +
                    "<h2>hello world</h2> " +
                    "</body>" +
                    "</html>"
            );
        }
    }
    
    
    • 在web.xml配置Servlet
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        
         <!-- 配置Servlet -->
        <servlet>
            <servlet-name>http-demo</servlet-name>
            <servlet-class>demo.servlet.HttpServletDemo</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>http-demo</servlet-name>
            <url-pattern>/http-demo</url-pattern>
        </servlet-mapping>
    </web-app>
    
    • 运行
      在这里插入图片描述
    • 访问http://localhost:8080/servlet_war_exploded/http-demo路径
      在这里插入图片描述

    2.5 JSP

    • JSP(Java Server Pages)也是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。简而言之,就是在HTML网页中嵌入了Java。
    • JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持
    <%@ page import="java.time.LocalDate" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <body>
      <h1><%= LocalDate.now()%></h1>
      <h2>hello world!!!</h2>
      </body>
    </html>
    
    public class HttpServletDemo extends HttpServlet {
        // 重写Get请求方法
       @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        	// 调用jsp页面
            req.getRequestDispatcher("/index.jsp").forward(req,resp);
        }
    }
    

    2.6 容器

    • 容器就是程序运行时需要的环境;比如Tomcat就是一个Servlet/JSP的容器。
    • Servlet 容器具备管理Servlet对象的功能。
      1. 通信支持:利用容器提供的方法,可以轻松实现Web服务器与Servlet进行通信,无需自己建立ServerSocket、监听端口,字节流传输等底层协议。
      2. 生命周期管理: 容器会负责Servlet的实例化、初始化、调用方法、释放资源等控制。
      3. 多线程支持:容器接收到每个Servlet请求时建立新的线程,并协调线程运行。
      4. 配置式管理:利用容器支持的xml进行配置式管理,在环境改变时,无需硬性修改程序及编译程序。

    在这里插入图片描述
    在这里插入图片描述

    2.7 URL映射到Servlet

    • 通过JavaEE的XML配置部署文件中的元素〈servlet〉〈servlet-mapping〉,把URL映射到对应的Servlet上。
      在这里插入图片描述

    三、一个完整的Java Web基础应用

    在这里插入图片描述

    在这里插入图片描述

    /**
     * HttpServlet
     *
     * @author zhuhuix
     * @date 2020-08-25
     */
    public class HttpServletDemo extends HttpServlet {
    
        // 重写Get请求方法,返回一个表单页面
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
            req.getRequestDispatcher("/form.jsp").forward(req, resp);
        }
    
        // 重写Post请求方法,提交表单上的数据,并返回结果页面
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String name = req.getParameter("name");
            Integer age = Integer.parseInt(req.getParameter("age"));
            if (name != null && age != null) {
                User user = new User(name, age);
                req.setAttribute("name", name);
                req.setAttribute("age", age);
                if (user.checkName()) {
                    req.setAttribute("result","登记成功");
                }else {
                    req.setAttribute("result","登记失败:名称中包含非法字符");
                }
                RequestDispatcher view = req.getRequestDispatcher("/result.jsp");
                view.forward(req, resp);
            }
        }
    }
    
    
    /**
     * 用户类
     */
    public class User {
        private String name;
        private Integer age;
    
        public User() {
        }
    
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        // 判断名称是否非法
        public Boolean checkName() {
            return !this.name.contains("admin");
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    
    
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
            <servlet>
                <servlet-name>http-demo</servlet-name>
                <servlet-class>demo.servlet.HttpServletDemo</servlet-class>
            </servlet>
    
            <servlet-mapping>
                <servlet-name>http-demo</servlet-name>
                <url-pattern>/http-demo</url-pattern>
            </servlet-mapping>
    
    
    </web-app>
    
    <!--表单页面-->
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登记用户</title>
    </head>
    <body>
        <form method="post" action="http-demo">
            姓名:<input name="name" type="text"/><br>
            年龄:<input name="age" type="text"/><br>
    
                <input type="submit" title="提交" >
    
        </form>
    </body>
    </html>
    
    <!--结果页面-->
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登记结果</title>
    </head>
    <body>
        <h2>姓名:${name} 年龄:${age} ${result} </h2><br>
    </body>
    </html>
    
    

    在这里插入图片描述
    在这里插入图片描述

    四、小结

    • 以上三个小节,只对Java Web中的基础要素及这些要素组成的最小体系结构做了回顾。
    • Java EE中Web开发的要点还有很多,比如Servlet的请求与响应的具体细节、JSTL语法,过滤器与监听器,Session与Cookie等。
    • 在重度依赖各种框架开发的今天,谨以此文抛砖引玉,让我们先抛开框架,重拾基础。
  • 相关阅读:
    CSS盒子模式(DIV布局快速入门)
    CSS中的滑动门技术
    由浅入深漫谈margin属性
    zz Apache 虚拟主机 VirtualHost 配置
    动态生成编译运行java类
    ubuntu 手动设置DNS服务器,重启后不能上网
    ubuntu下部署发布环境
    zz [Java]读取文件方法大全
    Ubuntu apache2 主机配置文件
    JAVA的CALLBACK
  • 原文地址:https://www.cnblogs.com/zhuhuix/p/13560618.html
Copyright © 2020-2023  润新知