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
注意 Java 版本和 Tomcat 版本、端口冲突
以 Windows 为例,下载解压后
- 进入 bin 目录
点击 start.bat,即可访问 localhost:8080
点击 shutdown.bat 关闭
默认访问的是 webapps 下的 Root/index.jsp
- 配置
conf 目录下的 server.xml
可以配置启动的端口号、主机的名称、网站目录
- 发布一个网站
将网站放到 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
-
创建一个 Maven 项目,删除 src 目录,在这个项目创建 Module,这个空的工程就是 Maven 的主工程
-
父项目中会有 modules,子项目中有 parent
父项目中的依赖子项目可以直接用
-
Maven 环境优化,修改 web.xml 为最新的,将 Maven 的结构搭建完整
-
编写一个 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);
}
}
- 编写 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>
- 配置 Tomcat
Servlet 原理
mapping
- 一个 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 可以指定多个映射路径
<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>
- 一个 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>
- 默认请求路径(优先级高于首页,慎用)
<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>
- 指定一些后缀或者前缀等等
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- 优先级问题
固有的路径映射优先级最高
<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