重拾Java Web应用的基础体系结构
时间:2022-07-23
本文章向大家介绍重拾Java Web应用的基础体系结构,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、背景
- Spring生态的强大与完善,使得大多数的Java程序员,在刚刚接触Java Web应用开发时,往往依赖于SSM、SpringBoot等各种高级框架。
- Java Web的基础的体系结构是什么?到底是怎么运作的?这些高级的框架与基础的体系结构之间是什么关系?
- 只有真正理清了这些底层基础的结构,才能完全理解高级框架的设计原理,在使用框架开发项目时做到事半功倍。
- 本文旨在暂时抛开这些高级框架,重走Java Web底层之路。二、Web应用
- Web应用的基础模型
- 用户通过Web浏览器向某个Web应用发出一个请求
- 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的最后,以<kbd>?</kbd>开头,以<kbd>&</kbd>分隔各个参数,如:http://www.web.com:8080/welcome/hello.html?name=jack&age=20
2. Web服务器中的应用一般默认在80端口运行,端口号为80的在URL中可省略不书写。
在这里插入图片描述
2.4 Servlet
- Servlet是<kbd>Server Applet</kbd>的简写,也被称为运行在服务端的小程序,通过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>
- 运行
在这里插入图片描述
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对象的功能。
- 通信支持:利用容器提供的方法,可以轻松实现Web服务器与Servlet进行通信,无需自己建立ServerSocket、监听端口,字节流传输等底层协议。
- 生命周期管理: 容器会负责Servlet的实例化、初始化、调用方法、释放资源等控制。
- 多线程支持:容器接收到每个Servlet请求时建立新的线程,并协调线程运行。
- 配置式管理:利用容器支持的xml进行配置式管理,在环境改变时,无需硬性修改程序及编译程序。
2.7 URL映射到Servlet
- 通过JavaEE的XML配置部署文件中的元素<kbd>〈servlet〉</kbd>及 <kbd>〈servlet-mapping〉</kbd>,把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等。
- 在重度依赖各种框架开发的今天,谨以此文抛砖引玉,让我们先抛开框架,重拾基础。
- 【教程】使用TensorFlow对象检测接口标注数据集
- [喵咪大数据]Hadoop单机模式
- 【死磕Java并发】—–Java内存模型之happens-before
- 9个,程序员又爱又恨的编程习惯
- Dubbo 源码解析 —— Cluster
- 【死磕Java并发】—–Java内存模型之从JMM角度分析DCL
- 基于PhalApi2的Redis拓展
- [喵咪BELK实战(3)] logstash+filebeat搭建
- Dubbo源码解析 —— Router
- 【死磕Java并发】—–深入分析volatile的实现原理
- phalcon-入门篇3(优美的URL与Config)
- 数据库中间件 Sharding-JDBC 源码分析 —— 事务(一)之BED
- 熔断器 Hystrix 源码解析 —— 命令执行(二)之执行隔离策略
- phalapi-入门篇4(国际化高可用和自动生成文档)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Hadoop伪分布式搭建(hadoop2.x通用)
- R语言tryCatch使用方法:判断Warning和Error
- leetcode1546题解【前缀和+贪心】
- leetcode560题解【前缀和+哈希】
- 5秒解决:VMware Workstation 与 Hyper-V 不兼容
- Java的访问控制符详解(结合代码演示)
- Python贪吃蛇小游戏_完整源码免费分享
- GitHub修改昵称和用户名(图解详细教程)
- Python飞机大战小游戏_完整源码免费分享
- Linux求助命令
- Linux关机命令及步骤
- Java实现二叉树层次遍历:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- Django 用户认证系统使用总结
- 前端综合面试题(9道)
- 用SQL查询Oracle数据库名和实例名