一、背景

  • 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等。
  • 在重度依赖各种框架开发的今天,谨以此文抛砖引玉,让我们先抛开框架,重拾基础。

重拾Java Web应用的基础体系结构的更多相关文章

  1. 【Java】 重拾Java入门

    [概论与基本语法] 取这个标题,还是感觉有些大言不惭.之前大三的时候自学过一些基本的java知识,大概到了能独立写一个GUI出来的水平把,不过后来随着有了其他目标,就把这块放下了.之后常年没有用,早就 ...

  2. java web filter 之一 基础实现

    本文主要对filter的基本使用进行了讲解,其中涉及到了 filter是什么 一个filter处理一个jsp 多个filter处理一个jsp filter是什么 Filter 是java下的一种过滤器 ...

  3. 重拾java系列一java基础(1)

    前言,不知不觉,从接触java到工作至今已有两年的时间,突然感觉自己的基础知识还很薄弱,有些知识虽然知道,但是停留在表面上,没有深挖,或者实践过,感觉掌握的很肤浅,而且时间一长,就觉得忘记了,我觉得这 ...

  4. 重拾java系列一java基础(3)

    这一章主要复习下以前所接触的算法, (1)选择排序法:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较 ...

  5. 重拾java系列一java基础(2)

    1.分支流程控制 if(布尔表达式/分支条件){  //语句块} if(布尔表达式/分支条件){  //语句块1}else{  //语句块2} if(条件1){  //语句块1}else if(条件2 ...

  6. 重拾java系列一java基础(4)

    本章主要回顾一些类的相关知识: (1)static: static 静态的: 属于类的资源, 使用类名访问.  静态属性: 只有一份的变量  静态方法: 是属于类方法, 可以使用类名直接访问. 静态方 ...

  7. 重拾java之路之webservice

         Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性.你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web servi ...

  8. Java Web(一) 前言及体系结构

    Web应用程序 Web程序是什么 Web应用程序就是一般所说的网站,由服务器,客户端浏览器以及网络组成.但Web程序又不是一般意义的网站,一般的网站是提供信息服务,重在内容,程序往往比较简单,但商用的 ...

  9. Java web struct入门基础知识

    1.Struts2的前身是Opensymphony的Webwork2,实际上Strut和Webwork2合并后形成Struts2.   2.一个HelloWord示例 1)创建Web应用,所需要的Ja ...

随机推荐

  1. Day06_商品分类(vuetify-nginx-cors)与品牌查询

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  2. 编程小白的第一本python入门书电子版|百度网盘分享无偿获取|评分超高的python教材

    点此进入网盘下载提取码:cr74 为了能让更多的编程小白轻松地入门编程,把高效学习法结合 Python 中的核心知识,写成了这本书.随意翻上几页,你就会发现这本书和其他编程书的不同,其中有大量的视觉化 ...

  3. Django学习路11_向数据库中添加 和 获取指定条件数据

    在 views.py 中添加函数 向数据库中添加数据 def add_persons(request): for i in range(15): person = Person() flag = ra ...

  4. PHP Session 变量

    PHP Session PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的 ...

  5. Skill 脚本演示 ycNetToPin.il

    https://www.cnblogs.com/yeungchie/ ycNetToPin.il 通过选中一个 instance ,分析与其连接且同时选中的 wire 上含有的 netName ,自动 ...

  6. Skill 返回一个数字list的大小排序信息

    https://www.cnblogs.com/yeungchie/ code procedure(ycSortList(numlist) prog((size sort) foreach(main ...

  7. 把项目从码云上clone到IntelliJ IDEA

       前期工作:安装并已配置好git,并且IDEA已经配置好git了   操作如下:   1) 在IDEA启动页面选择Get from Version Control   2) 打开码云上想要clon ...

  8. java学习day01之String的特点,如何实现,并且有哪些重要方法?

    1.以主流的JDK版本1.8来说,String内部实际存储结构为char数组,源码如下: public final class String  implements java.io.Serializa ...

  9. 用 Python 了解一下最炫国漫《雾山五行》

    看动漫的小伙伴应该知道最近出了一部神漫<雾山五行>,其以极具特色的水墨画风和超燃的打斗场面广受好评,首集播出不到 24 小时登顶 B 站热搜第一,豆瓣开分 9.5,火爆程度可见一斑,就打斗 ...

  10. 史上最简单操作!!!!!!!Window Server2012 修改远程桌面端口号

    Window Server2012 修改远程桌面端口号   Win + R 输入 regedit 打开注册表编辑器 在注册表编辑器中找到 PortNumber 双击 PortNumber,选择10进制 ...