JavaWeb 开发:Servlet 入门教程

JavaWeb

  • 静态 Web:HTML、CSS
  • 动态 Web:Servlet / JSP(Java Server Pages)、ASP(Active Server Pages)、PHP

JavaWeb 开发主要用于创建动态的网页和 Web 应用

服务器

  • IIS(Internet Information Services,Windows 自带)
  • Tomcat
  • Nginx

Tomcat

https://tomcat.apache.org/

注意 Java 版本和 Tomcat 版本、端口冲突

以 Windows 为例,下载解压后

  1. 进入 bin 目录

点击 start.bat,即可访问 localhost:8080

点击 shutdown.bat 关闭

默认访问的是 webapps 下的 Root/index.jsp

  1. 配置

conf 目录下的 server.xml

可以配置启动的端口号、主机的名称、网站目录

  1. 发布一个网站

将网站放到 webapps 下的某个目录中(需要包含一个 WEB-INF/web.xml)

  • Tomcat:8080
  • MySQL:3306
  • HTTP:80
  • HTTPS:443

地址栏输入 url 并按下回车后发生了什么

ipconfig /flushdns

检查本地 hosts(C:\Windows\System32\drivers\etc\hosts) 文件是否有这个 url 映射

  • 有:直接返回对应的 ip
  • 没有:去 DNS 服务器查找

HTTP

超文本传输协议,一个简单的请求-响应协议,它通常运行在 TCP 之上,默认端口 80

HTTPS:HTTP + SSL,默认端口 443

  • HTTP1.0:无连接(请求完成就断开)、无状态(无法记住过去的信息)
  • HTTP1.1:长连接、管线化、支持断点续传、新增一些状态码、Host 头处理

请求行

  • 请求方式:GET、POST...
  • GET:请求能够携带的参数较少,大小有限制,会在浏览器的 URL 地址显示数据内容,不安全,但是高效
  • POST:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的 URL 地址显示数据内容,安全,但不高效

消息头

Accept:告诉浏览器它所支持的数据类型
Accept-Encoding:支持的编码格式
Accept-Language:语言
Cache-Control:缓存控制
Connection:告诉浏览器请求完成断开还是保持连接

响应体

Accept:告诉浏览器它所支持的数据类型
Accept-Encoding:支持的编码格式
Accept-Language:语言
Cache-Control:缓存控制
Connection:告诉浏览器请求完成断开还是保持连接
Host:主机
Refresh:告诉客户端多久刷新一次
Location:让网页重新定位

响应状态码

  • 200:请求成功
  • 3xx:重定向
  • 4xx:找不到资源
  • 5xx:服务器错误
  • 502:网关错误

Maven

Maven 安装与配置

一个项目架构管理工具,方便导入 jar 包(自动导入)

核心思想:约定大于配置

https://maven.apache.org/download.cgi

选择 bin.zip

配置环境变量

  • M2_HOME:maven 目录下的 bin 目录
  • MAVEN_HOME:maven 的目录
  • 在系统的 path 中配置 %MAVEN_HOME%\bin
mvn -version

打开 conf\settings.xml,配置镜像

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>https://maven.aliyun.com/repository/public</url>
    <mirrorOf>central</mirrorOf>
</mirror>

在 maven 目录下新建 maven-repo 目录,设置本地仓库

<localRepository>D:\apache-maven-3.9.6\maven-repo</localRepository>

在 IDEA 中使用 Maven

第一次创建项目选择 Maven Archetype

进入之后立刻结束下载(默认下载在用户目录下的 .m2 中),打开设置和新项目设置(配置了新项目设置后,下次选择普通 Maven 项目的时候会自动导入本地的包),配置 Maven

Could not transfer artifact xxx from/to xxx

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

pom.xml

maven 核心配置文件

web.xml

替换为 webapp4.0 版本,和 tomcat 默认的一致

Servlet

开发动态 web 的一门技术

HelloServlet

Servlet 接口有两个默认的实现类,HttpServlet 和 GenericServlet,HttpServlet 继承 GenericServlet,GenericServlet 继承 Servlet

  1. 创建一个 Maven 项目,删除 src 目录,在这个项目创建 Module,这个空的工程就是 Maven 的主工程

  2. 父项目中会有 modules,子项目中有 parent

父项目中的依赖子项目可以直接用

  1. Maven 环境优化,修改 web.xml 为最新的,将 Maven 的结构搭建完整

  2. 编写一个 Servlet 程序

package com.huangqihong.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.print("Hello Servlet!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
  1. 编写 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"
  metadata-complete="true">
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.huangqihong.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/helloservlet</url-pattern>
  </servlet-mapping>
</web-app>
  1. 配置 Tomcat

Servlet 原理

mapping

  1. 一个 Servlet 可以指定一个映射路径
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.huangqihong.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/helloservlet</url-pattern>
</servlet-mapping>
  1. 一个 Servlet 可以指定多个映射路径
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.huangqihong.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/helloservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/helloservlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/helloservlet2</url-pattern>
</servlet-mapping>
  1. 一个 Servlet 可以指定通用映射路径
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.huangqihong.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/common/*</url-pattern>
</servlet-mapping>
  1. 默认请求路径(优先级高于首页,慎用)
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.huangqihong.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
  1. 指定一些后缀或者前缀等等
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
  1. 优先级问题

固有的路径映射优先级最高

<servlet>
    <servlet-name>ErrorServlet</servlet-name>
    <servlet-class>com.huangqihong.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ErrorServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

ServletContext

Web 容器在启动的时候,它会为每个 Web 应用创建一个对应的 ServletContext 对象,它代表了当前的 Web 应用

  • 共享数据
  • 获取初始化参数
  • 请求转发
  • 读取资源文件

HttpServletRequest

Web 服务器接受到客户端的 HTTP 请求,针对这个请求,分别创建一个代表请求的 HttpServletRequest 对象,一个代表响应的 HttpServletResponse 对象

HttpServletResponse

常见应用

  • 向浏览器输出消息

  • 下载文件

    • 获取下载文件的路径
    • 下载的文件名
    • 想办法能让浏览器能够支持下载我们需要的东西
    • 获取下载文件的输入流
    • 创建缓冲区
    • 获取 OutputStream 对象
    • 将 FileOutStream 流写入到 buffer 缓冲区
    • 使用 OutputStream 将缓存区中的数据输出到客户端
  • 验证码功能

  • 重定向

重定向和转发的区别?

相同点:页面都会跳转

不同点:请求转发的时候 url 不会变化,而重定向会变化

Cookie 和 Session

会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个 Web 资源,关闭浏览器,这个过程可以称之为会话

有状态会话:记录了状态的会话

保存会话的两种技术:Cookie、Session

Cookie

客户端技术

限制:

  • 一个 Web 站点最多存放 20 个 Cookie
  • Cookie 的大小有限制,4kb
  • 浏览器大约可以存 300 个 Cookie

删除 Cookie:

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效时间为 0
  • 创建一个 Cookie,将其覆盖

Session

服务器技术,利用这个技术可以保存用户的会话信息

Cookie 和 Session 的区别

  • Cookie 客户端保存,Session 服务端保存

JSP

Java Server Pages:Java 服务端页面,和 Servlet 一样,为动态 Web 技术

特点:

  • 写 JSP 就像在写 HTML
  • JSP 页面中可以嵌入 Java 代码,为用户提供动态技术

原理:

  • JSP 文件解析
  • JSP 转换为 Servlet
  • Servlet 编译和加载
  • 请求处理
  • 生成动态内容
  • 分发到客户端

总的来说,JSP 的原理涉及将 JSP 页面转换为 Java Servlet,然后执行该 Servlet 来生成动态内容,最终将结果返回给客户端

JSP 基础语法

JSP 指令

<%@ page ... %>
<%@ include file= %>
<jsp:include page= />

九大内置对象

  • PageContent
  • Request
  • Response
  • Session
  • Application(ServletContext)
  • config(ServletConfig)
  • out
  • page
  • exception

JSP 标签、JSTL 标签、EL 表达式