跟着狂神学习 JavaWeb 啦!路很长,慢慢走。
Web分类
静态Web:提供给人看的数据始终不会发生变化。
动态Web:提供给人看的数据会发生变化,每个人在不同时间不同地点看到的信息各不相同。技术栈:Servlet/JSP,ASP,PHP。
web应用程序:可以提供浏览器访问的程序。
①通过URL(统一资源定位符)能访问到世界上任何一个角落的计算机。
②这个统一的 web 资源会被放在同一个文件夹下,就是 web 应用程序 -> Tomcat:服务器。
③一个 web 应用由多部分组成:html,css, js,jsp,Servlet,Java 程序,jar 包,配置文件(Properties)。
web应用程序编写完毕后,若想提供给外界访问,需要一个服务器统一管理。
客户端 -> 服务器:请求(Request)
服务器 -> 客户端:响应(Response)
静态页面的缺点:
① web 页面无法动态更新,所有用户看到的都是同一个页面。
② 无法和数据库交互(数据无法持久化)。
页面会动态展示:web 的展示效果会因人而异。
动态 web 的缺点:
①假如服务器的动态 web 资源出现了错误,需要重新编写后台程序,再重新发布。
动态 web 的优点:
① web 页面可以动态更新,所有用户看到的都不是同一个页面。
② 可以和数据库交互(数据持久化:注册)。
ASP:
①微软,国内最早流行的。
②在 HTML 中嵌入了 VB 的脚本,使用 ASP + COM。
③在ASP开发中,基本一个页面都有几千行的业务代码,页面及其混乱。
④维护成本高。
⑤主要使用 C#。
PHP:
①PHP 开发速度很快,功能很强大,跨平台,代码很简单。
②无法承载大访问量的情况(局限性)
JSP/Servlet:
B/S:浏览器/服务器
C/S:客户端/服务器
① sun 公司主推的 B/S 架构。
②基于 Java(所有大公司或一些开源的组件,都是 Java 写的)。
③可以承载三高(高并发、高可用、高性能)问题带来的影响。
④语法像 ASP
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些信息。
**IIS:**微软,ASP,…,Windows 中自带的
Tomcat:
Tomcat 是 Apache 软件基金会(Apache Software Foundation)的Jakarta
项目中的一个核心项目。最新的 Servlet 和 JSP 规范总是能在 Tomcat 中得到体现。因为Tomcat
技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱,成为比较流行的 Web 应用服务器。 Tomcat
服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试
JSP 程序的首选。 Tomcat 实际上运行 JSP 页面和 Servlet。
Tomcat 的作用是:
① 管理 Servlet 应用的生命周期。
② 把客户端请求的 URL 映射到对应的 Servlet。
③ 与 Servlet 程序合作处理 HTTP。
官网下载地址:https://tomcat.apache.org/download-10.cgi
文件夹作用:
bin:启动/关闭的脚本文件
conf:配置
lib:依赖的 jar 包
logs:日志
webapps:存放网站
启动Tomcat:
启动 bin 目录下的 startup.bat 文件,发现命令行窗口一闪而过,解决办法如下:
① 命令行窗口打开 startup.bat 查看错误原因,我的错误原因是“JRE_HOME”环境变量配置不正确。
② 添加 JAVA_HOME 环境变量
此处的变量值为我安装的 jdk 目录。
③ 再次点击 startup.bat 文件,打开成功
关闭 Tomcat:
shutdown.bat 文件
conf 目录下的 server.xml
可以配置启动的端口号
Tomcat 默认端口号:8080
MySQL:3306
http:80
https:443
可以配置主机的名称
默认的主机名为:localhost -> 127.0.0.1
默认网站应用存放的位置为:webapps
高难度面试题:
① 输入一个域名;回车
② 检查本机的 C:\Windows\System32\drivers\etc\hosts 配置文件下有没有这个域名映射。若有,直接返回对应的 ip 地址,这个地址中有我们需要访问的 web 程序,可以直接访问;若没有,去 DNS 服务器(全世界的域名都在这里管理),找的的话就返回,找不到就返回找不到。
① 将自己写的网站,放到 Tomcat 服务器中指定的 web 应用的文件夹下 -> webapps,即可以访问。这里直接贴狂神老师画的图!
HTTP (超文本传输协议)是一个简单的请求 - 响应协议,它通常运行在 TCP 之上。
HTTPS:安全的
(笔试题)
HTTP 1.0:HTTP/1.0 客户端可以与 web 服务器连接后,只获得一个 web 资源,断开连接。
HTTP 2.0:HTTP/1.1 客户端可以与 web服务器连接后,获得多个 web 资源。
客户端 --> 发送请求(Request) --> 服务器
百度:
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get方法/host方法
Status Code: 200 OK 状态码:200
Remote Address: 36.152.44.96:443 远程地址
Referrer Policy: no-referrer-when-downgrade
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
请求行:
请求行中的请求方式:GET
请求方式:Get, Post, HEAD, DELETE, PUT, TRACT, …
get:请求能够携带的参数比较少,大小有限制,会在 URL 地址栏显示数据内容,不安全,但高效。
post:请求能够携带的参数没有限制,大小没有限制,不会在 URL 地址栏显示数据内容,安全,但不高效。
消息头:
Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding: 支持哪种编码格式(GBK, UTF-8, GB2312, ISO8859-1)
Accept-Language: 语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
Host: 主机
服务器 --> 响应请求(Response) --> 客户端
百度:
Cache-Control: private 缓存控制
Connection: keep-alive 连接:保持连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
响应体:
Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding: 支持哪种编码格式(GBK, UTF-8, GB2312, ISO8859-1)
Accept-Language: 语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
Host: 主机
ReFresh: 告诉客户端,多久刷新一次
Location: 让网页重新定位
响应状态码(重点):
200:请求响应成功
3XX:请求重定向(重定向:你重新到我给你的新位置去)
4XX:找不到资源
5XX:服务器代码错误(502:网关错误)
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间,到页面能够展示回来,经历了什么?
我为什么要学习这个技术?
① 在 JavaWeb 开发中,需要使用大量的 jar 包,我们需要手动去导入。
② 如何能够让一个东西自动帮我导入和配置这些 jar 包,由此,Maven 诞生了。
目前用处:方便导入 jar 包。
Maven 的核心思想:约定大于配置!(大白话:有约束,不要去违反!!!)
Maven 会规定好你该如何去编写 Java 代码,必须按照这个规范来!
官网:https://maven.apache.org/
① M2_HOME,Maven 目录下的 bin 目录
② MAVEN_HOME,Maven 的目录
③ PATH 目录下新建:%MAVEN_HOME%\bin
镜像:mirrors,加速下载。建议使用阿里云的镜像
本地仓库、远程仓库。
建立一个本地仓库:localRepository
在 Maven安装目录下新建文件夹 maven-repo,将路径复制于此:
① 创建一个 MavenWeb 项目
GroupId:组id,我后续填了 com.GlassMaple,不知道可行不可行,如果有问题后续回来修改。
ArtifactId:项目名
这么选择就好:
② 等待项目初始化完毕,这就体现了镜像的重要性!等待ing…
③ 项目搭建成功
④ IDEA 中的 Maven 设置
IDEA 项目创建成功后,观察 IDEA 的配置,MavenHome 可能会使用默认的 Maven。
⑤ 构成(只有在 Web 应用下才会有)
WEB-INF(web.xml):Web 的配置
index.jsp:网页
不勾选模板,直接 NEXT。
main-java(蓝包):放置 Java 源代码
resource:放置配置文件
java(绿包):测试
初始 Maven 概览:
先前的 MavenWeb 项目~
main 中新建两个包,一个为 java,一个为 resource,此时的 java 包无法 new 一个 class。
这时就要用标记文件夹功能。
Sources Root:源码目录
Test Source Root:测试源码目录
Resources Root:资源目录
Test Resources Root:测试资源目录
① 点击这个框
② 找到并选择 Tomcat
③ 初始配置
Name:服务器启动名称,可以随意配置
After Launch:默认的浏览器配置
JRE:JDK 环境
HTTP port:Tomcat 启动的端口号配置
Warning:警告:没有一个 artifacts。解决办法:创建一个。
④ 解决 Warning
产生该问题的原因:我们访问一个网站,需要指定一个文件夹名字。必须!
Application context 可写可不写。
若不写,默认访问路径为 localhost:8080;若写,我这里为/GlassMaple,则访问 localhost:8080/GlassMaple。这个过程叫做虚拟路径映射。
⑤ 启动成功
这里访问到的 Hello World!就是我们默认的 index.jsp 中的内容
⑥ 右侧 Maven Projects 的作用
Lifecycle:Maven 的命令行操作。
Plugins:插件,甚至可以删掉 。
Dependencies:项目依赖,里面是一个个的 jar 包。
pom.xml 是 Maven 的核心配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--这里就是我们刚才配置的GAV-->
<groupId>com.GlassMaple</groupId>
<artifactId>JavaWeb-01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--项目的打包方式 jar:java应用 war:JavaWeb应用-->
<packaging>war</packaging>
<name>JavaWeb-01-maven Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<!--项目的默认构建编码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译版本-->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--项目依赖-->
<dependencies>
<!--具体依赖的jar包配置文件-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--项目构建用的-->
<build>
<finalName>JavaWeb-01-maven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Maven 核心:约定大于配置! 所以后续可能会遇到我们写的配置文件,无法被导出或生效的问题。
解决方案:在 build 中配置 resources,来防止我们资源导出失败的问题。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties
**/ *.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties
**/ *.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
Servlet 接口在 Sun 公司 有两个默认的实现类:HttpServlet,GenericServlet。
HttpServlet 继承自 GenericServlet,所以我们自己的类只要继承 HttpServlet 即可。
Servlet 是 sun 公司开发动态 web 的一门技术。sun 公司在这些 API 中提供一个接口叫做:Servlet。如果想开发一个 Servlet 程序,只需要完成两个小步骤:
总结:把实现了 Servlet 接口的 Java 程序叫做 Servlet。
① 构建一个普通的 Maven 项目,删掉里面的 src 目录,以后我们的学习就在这个项目建立 Module ;这个空的工程就是 Maven 的主工程。
② 导入 dependencies (pom.xml)
<dependencies>
<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
这里可能会出现报红的现象,稍微等待一会儿(它在下载),刷新后,报红消失。
③ 再其中建一个 webapp 项目作为子项目
关于 Maven 父子工程的理解
父项目中会有:
Servlet-01
子项目中会有:
JavaWeb-02-servlet com.GlassMaple 1.0-SNAPSHOT
父项目中的 jar 包子项目可以直接使用,子项目的父项目不能使用(类似于 java 中的继承)。
④ Maven 环境优化
⑤ 编写一个 Servlet 程序
public class HelloServlet extends HttpServlet {
//由于get/post只是请求实现的不同方式(业务逻辑都一样),所以可以互相调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter(); //响应流
writer.print("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
⑥ 编写 Servlet 映射(web.xml 中)
为什么需要映射:我们写的是 java 程序,但是要通过浏览器访问,而浏览器需要连接 web 服务器,所以我们需要在 web 服务器中注册我们写的 Servlet ,还需要给他一个浏览器能访问的路径。
<!--注册Servlet 一个Servlet对应一个Class,对应要注册的类-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.GlassMaple.Servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
⑦ 配置 Tomcat
简化版的 5.9,主要是用于配置项目发布的路径。
Servlet 是由 web 服务器调用,web 服务器在收到浏览器请求后,会执行如下过程(这里也直接贴狂神老师画的图):
① 一个Servlet 可以指定一个映射路径
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
② 一个Servlet 可以指定多个映射路径
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello3</url-pattern>
</servlet-mapping>
③ 一个Servlet 可以指定通用映射路径(Hello 后可以加任何东西)
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello/*
④ 一个Servlet 可以指定一些前缀或前缀等等…
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>*.Hello</url-pattern> //自定义后缀
</servlet-mapping>
⑤ 默认请求路径(不推荐使用)
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/*
⑥ 优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。
例:
再写一个 Error 的 Java 文件,同样继承自 HttpServlet,并重写 doGet() 方法。
public class ErrorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html"); //以html方式展现
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.print("404
"); //显示内容
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
web.xml 中再加上:
<!--404-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.GlassMaple.Servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*
此时
约定大于配置,所以只要删了约定就好啦!
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
在 Servlet 运行期间,需要一些辅助信息,例如文件使用的编码等。
使用 getServletConfig() 来获取配置信息,例如初始化的编码格式等:
public class Test02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
ServletConfig config = this.getServletConfig(); //获取config对象
String param = config.getInitParameter("encoding"); //获得初始化的编码参数,在web.xml中初始化
PrintWriter writer = resp.getWriter(); //显示
writer.print("编码格式为:" + param);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
.xml(在其中配置初始化参数,例如编码格式。getServletConfig() 获取到的参数就是这里面的,init-param 写在 servlet 里面):
<servlet>
<servlet-name>encoding</servlet-name>
<servlet-class>com.GlassMaple.Servlet.Test02</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>encoding</servlet-name>
<url-pattern>/param</url-pattern>
</servlet-mapping>
在父工程下新建一个 module 为 Servlet-02,发现新建的包中没有 src 。
解决办法:在创建时添加如下的 Property。
若发现 pom.xml 文件上有横线(并且在配置 Tomcat 时发现 Artifact 中没有当前 module 的 war 文件),表示先前创建过同名的 module ,IDEA 会自动忽略,所以在设置中修改一下即可。
web 容器在启动的时候,它会为每个 web 程序都创建一个对应的 ServletContext 对象,它代表了当前的 web 应用。(我们建立的网站就是由这个 ServletContext 对象来管理的)
① 共享数据:
我在这个 Servlet 中保存的数据,可以在另一个 Servlet 中拿到。
创建一个放置数据的类,setAttribute():
public class hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getInitParameter(); 初始化参数
//this.getServletConfig(); Servlet配置
//this.getServletContext(); 上下文
ServletContext context = this.getServletContext();
String username = "张三";
context.setAttribute("username",username); //将一个数据保存在ServletContext中,名字为username,值为username对象
System.out.println("Hello"); //显示在终端上,而非网页界面上
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
读取它的类,getAttribute():
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String)context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字:" + username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
.xml:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.GlassMaple.Servlet.hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getContext</servlet-name>
<servlet-class>com.GlassMaple.Servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getContext</servlet-name>
<url-pattern>/getContext</url-pattern>
</servlet-mapping>
② 获取 web 应用程序初始化参数
java部分:
public class Test03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ServletContext context = this.getServletContext();
Enumeration<String> parameterNames = context.getInitParameterNames();
PrintWriter writer = resp.getWriter();
while (parameterNames.hasMoreElements()){ //循环打印获取到的参数名+参数值
String name = parameterNames.nextElement(); //获取参数名
String value = context.getInitParameter(name); //获取参数名对应的参数值
writer.println(name + ":" + value);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
.xml部分(context-param 写在 servlet 前):
<context-param>
<param-name>address</param-name>
<param-value>shanghai</param-value>
</context-param>
<context-param>
<param-name>name</param-name>
<param-value>GlassMaple</param-value>
</context-param>
<servlet>
<servlet-name>servlet03</servlet-name>
<servlet-class>com.GlassMaple.Servlet.Test03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet03</servlet-name>
<url-pattern>/go</url-pattern>
</servlet-mapping>
③ 读取资源文件(前两个有好多方法,稍微有点晕了,不徒增负担了,日后绕清楚了再补)
web 服务器接收到客户端的 http 请求,针对这个请求,分别创建一个代表请求的 HttpServletRequest 对象,和一个代表响应的 HttpServletResponse 对象。
1. 简单分类
负责向浏览器发送数据的方法:
ServletOutputStream getOutputStream() throws IOException; //写其他流
PrintWriter getWriter() throws IOException; //写中文
负责向浏览器发送响应头的方法(ServletResponse 中):
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
HttpServletResponse 中:
void sendError(int var1, String var2) throws IOException;
void sendError(int var1) throws IOException;
void sendRedirect(String var1) throws IOException;
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
void setStatus(int var1);
响应的状态码(记住 4.4 中写的即可,不用全部知道):
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2. 常见应用
① 向浏览器输出消息
② 下载文件:
index1.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>显示登录的用户信息</title>
</head>
<body>
<br/>
<center><h3>欢迎光临</h3></center>
<br />
<br />
<c:choose>
<c:when test = "${sessionScope.user == null}">
<a href="${pageContext.request.contextPath }/login.jsp">用户登录</a>
</c:when>
<c:otherwise>
欢迎你,${sessionScope.user.username }!
<a href="${pageContext.request.contextPath }/LogoutServlet">注销</a>
</c:otherwise>
</c:choose>
<hr />
</body>
</html>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" import="java.util.*" %>
<html>
<head></head>
<center><h3>用户登录</h3></center>
<body style="text-align: center;">
<form action="${pageContext.request.contextPath }/LoginServlet" method="post">
<table border="1" width="600px" cellpadding="0" cellspacing="0" align="center">
<tr>
<td height="30" align="center">用户名:</td>
<td> <input type="text" name="username" />${errerMsg} </td>
</tr>
<tr>
<td height="30" align="center">密 码:</td>
<td> <input type="password" name="password" /></td>
</tr>
<tr>
<td height="35" align="center">自动登录时间</td>
<td><input type="radio" name="autologin" value="${60*60*24*31}" />一个月
<input type="radio" name="autologin" value="${60*60*24*31*3}" />三个月
<input type="radio" name="autologin" value="${60*60*24*31*6}" />半年
<input type="radio" name="autologin" value="${60*60*24*31*12}" />一年
</td>
</tr>
<tr>
<td height="30" colspan="2" align="center">
<input type="submit" value="登录" />
<input type="reset" value="重置" />
</td>
</tr>
</table>
</form>
</body>
</html>
User:
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
LoginServlet:
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//检查用户名和密码
if ("GlassMaple".equals(username) && "123456789".equals(password)){
//登陆成功,将用户状态user对象存入session
User user = new User();
user.setUsername(username);
user.setPassword(password);
request.getSession().setAttribute("user",user);
//发送自动登录的cookie
String autoLogin = request.getParameter("autologin");
if (autoLogin != null){
Cookie cookie = new Cookie("autologin",username + "-" + password);
cookie.setMaxAge(Integer.parseInt(autoLogin));
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}
//跳转至首页
response.sendRedirect(request.getContextPath() + "/index1.jsp");
}
else {
request.setAttribute("errerMsg","用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
super.doGet(request, response);
}
}
LogoutServlet
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//用户注销
request.getSession().removeAttribute("user");
//从客户端删除自动登录的cookie
Cookie cookie = new Cookie("autologin","msg");
cookie.setPath(request.getContextPath());
cookie.setMaxAge(0);
response.addCookie(cookie);
response.sendRedirect(request.getContextPath() + "/index1.jsp");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
super.doGet(request, response);
}
}
AutologinFilter
import jakarta.servlet.http.*;
import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.*;
import java.io.IOException;
public class AutoLoginFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
//获得一个名为autologin的cookie
Cookie[] cookies = request.getCookies();
String autologin = null;
for (int i = 0; cookies != null && i < cookies.length; i++){
if ("autologin".equals(cookies[i].getName())){
//找到了指定的cookie
autologin = cookies[i].getValue();
break;
}
}
if (autologin != null){ //自动登录
String[] parts = autologin.split("-");
String username = parts[0];
String password = parts[1];
//检查用户名和密码
if("GlassMaple".equals(username) && ("123456789").equals(password)){
User user = new User();
user.setUsername(username);
user.setPassword(password);
request.getSession().setAttribute("user",user);
}
}
//放行
chain.doFilter(req,response);
}
@Override
public void destroy() {
}
}
web.xml
<filter>
<filter-name>AutoLoginFilter</filter-name>
<filter-class>com.GlassMaple.Servlet.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AutoLoginFilter</filter-name>
<url-pattern>/*
LoginServlet
com.GlassMaple.Servlet.LoginServlet
LoginServlet
/LoginServlet
LogoutServlet
com.GlassMaple.Servlet.LogoutServlet
LogoutServlet
/LogoutServlet
(持续更新中…)