JavaWeb
1、基本概念
1.1前言
web开发
-
web,网页的意思 例: www.baidu.com
-
静态web
- html,css
- 提供给所有人看的数据始终不会发生变化
-
动态web
- 几乎所有的网站都是动态的;
- 提供给所有人看的数据始终会发生变化,(不同的人在不同的事件,不同的地点看到的信息不相同)
- 技术栈:Servlet/JSP,ASP,PHP
在Java中,动态web资源开发的技术统称为JavaWeb;
1.2web应用程序
web应用程序:可以提供浏览器访问的程序;
- a.html、b.html……多个web资源,这些web资源可以被外界访问,对外界提供服务;
- 能访问到的任何一个页面和资源,都存在于页面的某一个角落的计算机上
- URL:
- 这些统一的外部资源都放在同一个文件夹下, 这些就是一个web应用程序 他们必须依赖一个服务器 Tomcat:服务器
- 一个web应用由多个部分组成(静态web,动态web)
- html.css,js
- jsp,servlet
- java程序
- jar包
- 配置文件(Properties)
web应用程序编写完毕后,若想提供给外界访问,需要服务器来统一管理;
1.3静态web
- *.html*.htm,这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接读取。通过网络
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LQNb3en-1616469489589)(Day23JavaWeb.assets/image-20210304183347032.png)]
- 静态web存在缺点
- web页面无法更新,所有用户看到的都是同一个页面
- 轮播图,点击特效:为动态
- 利用JavaScript【实际开发中使用最多】
- VBScript
- 它无法和数据库交互(数据无法持久化,用户无法交互)
- web页面无法更新,所有用户看到的都是同一个页面
1.4动态web
页面会动态展示:”Web的页面展示的效果因人而异“
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iNMK6M7q-1616469489593)(Day23JavaWeb.assets/image-20210304184124520.png)]
缺点
- 假如服务器的动态web资源出现错误,我们需要重新编写我们的后台程序,重新发布
- 停机维护
优点
- Web也买你可以动态更新,所有用户看到的都不是同一个页面
- 它可以与数据库交互(数据永久化: 注册,商品信息,……)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j6j7QJH5-1616469489595)(Day23JavaWeb.assets/image-20210304184533427.png)]
2、web服务器
2.1技术讲解
ASP
- 微软:国内最早流行的就时ASP
- 在HTML中嵌入了VB的脚本,ASP+COM;
- 在ASP开发中,基本一个页面 都有几千行业务代码,页面极其混乱,
- 维护成本高
- C#
PHP
- PHP开发速度很快,功能很强大,可跨平台,代码简单(70%的网站都是PHP)
- 无法承载大访问量的情况(局限性)
JSP/Servlet
B/S:浏览器和服务器
C/S:客服端和服务器
- SUN公司主推的B/S架构
- 基于Java语言的(所有的大公司,或者一些开源的组件们都是用java写的)
- 可以承载三高问题带来的影响;(高并发,高可用,高性能)
- 语法像ASP
2.2、web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户响应一些信息;
IIS
微软的;ASP…Windows中自带的
Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个Java初学web来说,它是最佳的选择
omcat 实际上运行JSP 页面和Servlet。目前Tomcat最新版本为9.0.41**。**
3、Tomcat
文件夹的作用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3SqMfjn-1616469489598)(Day23JavaWeb.assets/image-20210304193125190.png)]
3.1启动和关闭tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OjVYFUco-1616469489600)(Day23JavaWeb.assets/image-20210304193532917.png)]
访问测试:http://localhost:8080/
3.2服务器核心配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MSj8DMlP-1616469489601)(Day23JavaWeb.assets/image-20210304193942194.png)]
可以配置启动的端口号
- 默认端口号:8080
- mysql:3306
- http:80
- https:443
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
可以配置主机的名称 localhost
- 默认的主机名为:localhost->127.0.0.1
- 默认的网站应用存放位置为:webapps
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
面试题:
请你谈谈网站是如何进行访问的?
- 输入域名;点击回车
- 然会就会自动检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名的映射
- 有:直接返回对应的ip地址 127.0.0.1 localhost 这个地址中有我们要访问的web程序,就可以直接访问
- 没有:去DNS找,找到就返回,找不到就返回找不到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ca0ZVTh0-1616469489602)(Day23JavaWeb.assets/image-20210304202951954.png)]
3.发布一个网站
- 将自己写的网站放在服务器(tomcat)中指定的web应用的文件夹下(webapps),就可以访问了
网站应该有的结构
--webapps :Tomcat服务器的web目录
-ROOT
-lvstudy:网站的目录名
-index.html 网站的的默认首页
-static
-css
-js
-img
-WEB-INF
-web.xml 配置文件
-classes:java程序
-lib:web应用所依赖的jar包
.......
4、HTTP
4.1、什么是HTTP
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,
- 文本:html,字符串…
- 超文本:图片,音乐,视频,定位,地图
- 默认端口80
HTTPS 是指安全的
- 默认端口443
4.2、两个时代
- http1.0
- HTTP/1.0 客服端可以和web服务器连接后,只能获得一个web资源 就断开连接了
- http2.0
- HTTP/1.1 客服端可以和web服务器连接后,可以获得一个web资源
4.3、HTTP请求
-
客户端—发请求(Request)—服务器
百度
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get提交方法/post提交方法
Status Code: 200 OK 状态码: 200
Remote(远程) Address: 180.101.49.11:443
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9 语言
Cache-Control: max-age=0
Connection: keep-alive
1、请求行
- 请求行中的请求方式:GET
- 请求方式:**Get、Post、**HEAD、DELETE\PUT\TRACT…
- get:请求能够携带的参数比价少,大小有限制,会在浏览器URL的地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数没有先执,大小没有限制,不会在浏览器URL地址栏显示数据内容,安全,但不高效
2、消息头
Accept:告诉浏览器支持的数据类型
Accept-Encoding: 支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,他的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机
4.4、HTTP响应
-
服务器—响应—客户端
百度
Cache-Control: private 缓存控制
Connection: keep-alive 连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
1、响应体
Accept:告诉浏览器支持的数据类型
Accept-Encoding: 支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,他的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机....
Refresh:告诉客户端,多久刷新一次
Location:让网页重新定位;
2.响应状态码
200:请求响应成功
3xx:请求重定向
- 重定向:你重新到我给你的新位置去
4xx:找不到资源 404
- 资源不存在
5xx:服务器代码错误 500 502(网关错误)
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能展示回来,经历了什么
1、先是在windows/system32/drivers/etc/hosts 查找有没有相关的地址映射
2、然后再用dns服务解析地址,解析到相应地址之后
3、完成三次握手,四次挥手,来确保客户端与服务器之间可以完成响应
4、最后由浏览器来完成最后的页面渲染部分
作为客户端,浏览器接收到地址之后,首先会到windows系统文件hosts中查找是否有需要劫持的ip地址,若没有则需要询问DNS域名解析服务器该域名对应的ip地址。(DNS缓存)
浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存
获取到正确的ip地址后,客户端会与服务器建立TCP连接(三次握手),(网络层、数据链路层、物理层)
客户端向服务端发送请求,包含请求行、请求头、请求正文。多种请求方式(GET,POST、PUT等)
服务端处理请求,并返回响应,包含状态码、响应头、响应体
浏览器收到响应,解析渲染页面,展示出来
断开连接(http1.0短连接,http1.1长连接)
5、Maven
为什么要学习这个技术
- 在学习javaweb过程中要导入大量的jar包,手动导入特麻烦
- Maven就可以实现自动导入jar包
5.1、Maven项目架构管理工具
目前用来方便导入jar包
Maven核心思想:约定大于配置
- 有约束,不要去违反
Maven会规定好你如何去编写我i们的java代码,必须按照这个规定来
5.2、下载安装Maven
官网下载解压
5.3、配置环境变量
- M2_HOME maven目录下的bin目录
- MAVEN_HOME maven的目录
- 在系统的path中配置 %MAVEN_HOME%\bin
5.4、阿里云镜像
- 镜像:mirrors
- 作用:加速我们下载
- 国内使用阿里云
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
5.5本地仓库
本地仓库 远程仓库
**建立一个本地仓库:**localRepository
<localRepository>D:\MarkDown\apache-maven-3.6.3-bin\apache-maven-3.6.3\maven-repo</localRepository>
5.6、在IDEA中使用Maven
- 启动IDEA
- 创建一个MavenWeb项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AGf1fPTe-1616469489603)(Day23JavaWeb.assets/image-20210304222345997.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lDK1g0rz-1616469489603)(Day23JavaWeb.assets/image-20210304222820057.png)]
等待初始化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWfMJsir-1616469489604)(Day23JavaWeb.assets/image-20210304223223713.png)]
IDEA项目创建成功看一下设置中的maven防止自动配置到自带的maven
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVwKlk3m-1616469489605)(Day23JavaWeb.assets/image-20210304224710847.png)]
5.7、在IDEA中配置Tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opH2SM71-1616469489605)(Day23JavaWeb.assets/image-20210304230608685.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SBoHzPKM-1616469489606)(Day23JavaWeb.assets/image-20210304234342988.png)]
6、Servlet
package com.lv.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{
//由于get和post只是请求不同的方式,可以相互调用,业务逻辑相同
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
writer.print("HelloServlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
编写Servlet的映射
写的java程序,需要通过浏览器访问,而浏览器需要通过连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,海域要给浏览器一个能访问的路径
<!--注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.lv.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet的请求路径 映射路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
配置tomcat
Servlet原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xJ7vQlwR-1616469489607)(Day23JavaWeb.assets/image-20210305195500245.png)]
Mapping问题
-
一个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>/hello</url-pattern> </servlet-mapping> <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-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello5</url-pattern> </servlet-mapping> 效果都一样
-
一个Servlet请求可以指定通用映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping> /hello/这里可以天任何字符,都会访问到最后的地址 <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>默认请求路径会直接打开这个跳过首页
-
指定一些后缀或者前缀
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.lv</url-pattern>
</servlet-mapping>
只要以.lv结尾就可以访问
- 优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRvemZmW-1616469489608)(Day23JavaWeb.assets/image-20210305202359874.png)]
ServletContext
web容器在启动的时候,它会为每个web程序创建一个对应的ServletContext对象, 它代表了当前的web应用
共享数据
我在这个Servlet保存的数据可以在另外一个Servlet中拿到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5181yCI6-1616469489608)(Day23JavaWeb.assets/image-20210305211420932.png)]
- 存放
package com.lv.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
// this.getInitParameter(); 初始化参数
// this.getServletConfig(); servlet配置
// this.getServletContext(); servlet上下文
ServletContext context = this.getServletContext();
String name="你好呀";
context.setAttribute("name",name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 读取
package com.lv.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String name = (String)context.getAttribute("name");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 配置文件
<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>hello</servlet-name>
<servlet-class>com.lv.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>good</servlet-name>
<servlet-class>com.lv.servlet.GetContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>good</servlet-name>
<url-pattern>/good</url-pattern>
</servlet-mapping>
</web-app>
需要先存放,才可以拿到这个数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UDES5AYo-1616469489609)(Day23JavaWeb.assets/image-20210305211835275.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEbP7HlM-1616469489609)(Day23JavaWeb.assets/image-20210305211817801.png)]
获取初始化参数
package com.lv.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<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">
<context-param>
<param-name>url</param-name>//设置一些初始参数
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<servlet>
<servlet-name>yg</servlet-name>
<servlet-class>com.lv.servlet.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>yg</servlet-name>
<url-pattern>/yg</url-pattern>
</servlet-mapping>
</web-app>
请求转发
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/yg");//转发的路径
requestDispatcher.forward(req,resp);//调用forward方法实现请求转发
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>com.lv.servlet.ServletDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJkSQNnT-1616469489610)(Day23JavaWeb.assets/image-20210305215712767.png)]
转发地址不变 重定向地址会发生改变
读取资源文件
Properties
- 在Java目录下新建一个properties
- 在resourcess目录下新建一个properties
发现都会打包到路径下的;classes。我们俗称这个路径为classpath
思路: 需要一个文件流
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/nb.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String user=properties.getProperty("username");
String pwd=properties.getProperty("password");
resp.getWriter().print(user);
resp.getWriter().print(pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
username=toot
password=123456
HttpServletResbonse
web服务器接收到客户端http请求,会针对这个请求分别创建一个代表请求的HttpServletRequest对象和代表响应的HttpServletResbonse对象;
- 如果要获取客户端请求过来的参数:找HttpServletResbonse
- 如果要给客户端返回一些信息:就找HttpServletResbonse
1、简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
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);
常见应用
- 向浏览器输出消息
- 下载文件
- 要获取下载文件路径
- 下载的文件名
- 想办法让浏览器支持我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端!
package com.lv.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 要获取下载文件路径
// String realPath = "D:\\MarkDown\\javaweb-01-servlet\\response\\src\\main\\resources\\1.png";
String realPath = "D:\\MarkDown\\javaweb-01-servlet\\response\\src\\main\\resources\\机密文件.txt";
// 2. 下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);//获取最后一个\字符串的下一个字符,这个字符一定是文件名,substring 截取字符串
// 3. 想办法让浏览器支持我们需要下载的东西
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));//URLEncoder让中文文件名能够显示
// 4. 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// 5. 创建缓冲区
int len=0;
byte[] buffer = new byte[1024];
// 6. 获取OutputStream对象
ServletOutputStream outputStream = resp.getOutputStream();
// 7. 将FileOutStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
while((len=in.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
// 8. 关闭流
outputStream.close();
in.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
验证码实现
-
实现重定向(重要)
当一个web资源收到客户端请求后,他会通知客户端访问另一个web资源,这个过程叫做重定向
void sendRedirect(String var1) throws IOException;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setHeader("Location","/response_war/oo");
// resp.setStatus(302);
resp.sendRedirect("/response_war/oo");// 重定向
}
面试题:重定向和转发区别?
相同点:
- 页面都会跳转
不同点:请求转发的时候url不会发生变化 307,重定向的时候,url地址栏会发生变化302
package com.lv.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("通过表单提交进入了");
resp.getWriter().print("nihao");
String username = req.getParameter("username");
String password = req.getParameter("password");
if (username.equals("root")&&password.equals("123456")){
resp.sendRedirect("/response_war/success.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<html>
<body>
<h2>Hello World!</h2>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%--${pageContext.request.contextPath} 代表当前的项目--%>
<%-- 当提交后就会转到 ${pageContext.request.contextPath}/request的项目路径下--%>
<form action="${pageContext.request.contextPath}/request" method="get">
<p>账户:<input type="text" name="username"></p>
<p>密码:<input type="password" name="password"></p>
<p>提交<input type="submit"></p>
</form>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: lcj
Date: 2021/3/6
Time: 12:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>login is success</h1>
</body>
</html>
HttpServletRequest
HttpServletRequest代表客户端请求,用户通过Http协议访问服务器,HTTP请求中所有的信息都会被封装到HttpServletRequest,通过这个HttpServletRequest对象的方法,可以获得客户端的所有信息
-
获取前端传递的参数
package com.lv.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.util.Arrays; public class RequestText01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); // resp.getWriter().print("你输入的账号或者密码错误请再试一次"); // System.out.println("你输入的账号或者密码错误请再试一次"); String username = req.getParameter("username"); String password = req.getParameter("password"); String[] likes = req.getParameterValues("like");//多个内容用这个 String s = Arrays.toString(likes); System.out.println("=============================="); System.out.println("username:"+username); System.out.println("password:"+password); System.out.println("likes:"+s); System.out.println("=============================="); if (username.equals("root")&&password.equals("123456")){ resp.sendRedirect("/r/login.jsp"); } else { req.getRequestDispatcher("/login.jsp").forward(req,resp);//转发 这里只用填一个 / 应为/在这里代表的是当前的webapp木留 } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
<%-- Created by IntelliJ IDEA. User: lcj Date: 2021/3/6 Time: 14:23 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录</title> </head> <body> <h2>请登录</h2> <div> <form action="${pageContext.request.contextPath}/login" method="post"> <div>账号: <input type="text" name="username"></div> <div>密码: <input type="password" name="password"></div> 爱好: <input type="checkbox" name="like" value="唱歌">唱歌 <input type="checkbox" name="like" value="跳舞">跳舞 <input type="checkbox" name="like" value="学习">学习 <input type="checkbox" name="like" value="打游戏">打游戏 <div><input type="submit">提交</div> </form> </div> </body> </html>
-
请求转发