一:URL(Uniform Resource Locator)
1.概念:是对互联网上资源位置的一种表示,互联网上的每个资源都有一个唯一的URL
2.如图:
①:协议:http、https、ftp
②:域名/ip: 能够帮我们定位到互联网上的某一台服务器
③:端口号:端口号是一个应用程序在一台服务器上的编号。http协议的默认端:80
④:资源位置:用于描述WEB资源在服务器上的位置
⑤:参数: 浏览器和服务器交互传递的数据
二:HTTP请求(Hyper Text Transfer Protocol)
1.概念:超文本传输协议
2.作用:用来浏览器和服务器之间进行网页内容的传输
3.特点:
- 一问一答
- 先问后答
- 问和答是一一对应的
4.组成:
①:请求行:请求方式 URI 协议/版本号
②:请求头:多个键值对组成的数据
③:请求体:浏览器发送给服务器的实际内容(一般情况是表单数据)
请求体只在POST出现
三:Request对象
1.获取请求行信息
2.获取请求头信息
3. 获取请求参数[重点]–post方式,请求体中的数据
①:String getParameter(String name)–通过参数名得到参数的值
②:String[] getParameterValues(String name)–通过参数名得到一组参数值,返回是字符串的数组
③:Enumeration getParameterNames()–得到所有参数的名字,返回是枚举的类型
④:Map<String, String[]> getParameterMap()–得到表单提交的所有参数名和参数值,封装成一个Map集合
4.参数乱码问题(请求参数乱码问题)
①:GET方式的乱码解决方案
Tomcat 8.5,GET方式无乱码问题
②:POST方式的乱码解决方案
request.setCharacterEncoding(“utf-8”);
5.转发
①:语法:request.getRequestDispatcher("/resourceB").forward(request, response);
②:特点:
- 地址不变
- 服务器内部跳转
- 一次请求
6.请求域(一次请求中存取数据)
①:向作用域中添加键和值,如果之前没有这个键则是添加,如果有就是修改
②:从作用域中取出值
③:删除指定的键和值
应用案例:能够应用BeanUtils工具类对请求参数数据进行封装
1.先通过request.getParameterMap()获取前端所提交的所有数据
2.而后用BeanUtils工具类中的populate(Object bean, Map<String, String[]> properties)[重点]–方法将Map集合中的数据封装JavaBean对象中,后面的该请求中获取和存储数据就直接用实体类进行,非常方便。
①.index.html
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="login" method="post">
<input type="text" name="username" placeholder="用户名"/><br/>
<input type="password" name="password" placeholder="密码"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
②.UserInfo.java
public class UserInfo {
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;
}
public UserInfo() {
}
public UserInfo(String username, String password) {
this.username = username;
this.password = password;
}
}
③.LoginServlet.java
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Map<String, String[]> parameterMap = request.getParameterMap();
UserInfo userInfo = new UserInfo();
try {
BeanUtils.populate(userInfo, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if (userInfo.getUsername().equals("user") && userInfo.getPassword().equals("pass")) {
request.getRequestDispatcher("/login_success").forward(request, response);
} else {
request.getRequestDispatcher("/login_failure").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
四:response对象
1.HTTP响应报文
①:响应行:协议/版本号 状态码
②:响应头:以key:value的形式给客户端(浏览器)发送响应参数
③:响应体:响应的具体数据
2.HttpServletResponse
①:设置响应行
②:设置响应头(refresh,content-type,location,content-disposition)
③:设置响应体(1.用于向浏览器输出字符数据。【字符流–给浏览器响应数据】,2.用于向浏览器输出二进制数据。【字节流–文件下载】)
3.Servlet中处理请求和响应中文乱码问题:
【请求乱码】
post请求乱码: request.setCharacterEncoding(“utf-8”);
get请求乱码:不需要处理
【响应乱码】
response.setContentType(“text/html;charset=utf-8”);
4.实例:response字节流下载
①:新建download.html页面
书写几个超链接标签,链接地址为downloadServlet,每个链接后面需要携带要下载的文件的文件名;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<h2>通过超链接的方式下载资源</h2>
<a href="/downloadServlet?filename=1.zip">1.zip</a><br>
<a href="/downloadServlet?filename=2.exe">2.exe</a><br>
<a href="/downloadServlet?filename=3.txt">3.txt</a><br>
<a href="/downloadServlet?filename=4.jpg">4.jpg</a><br>
</body>
</html>
②:编写downloadServlet,处理下载业务逻辑
下载业务逻辑:两个头+两个流(流拷贝)
【两个头】
1. 设置响应头:Content-Disposition 告诉浏览器以附件的形式来处理文件;
2. 设置响应头: response.setContentType(mimeType) 告诉浏览器下载的文件的类型;
【两个流】
1. 将文件读取到流里边: FileInputStream fin = new FileInputStream(file);
2. 将流写给浏览器:response.getOutputStream().write(arr,0,len);
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author hanzhijian
* @version v1.0
* @date 2018/12/11 23:12
* @description TODO
**/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//文件下载
//filename
String filename = request.getParameter("filename");
//mimeType
String mimeType = request.getServletContext().getMimeType(filename);
//file
String realPath = request.getServletContext().getRealPath("resource");
File file = new File(realPath,filename);
//1、设置两个头信息
//告诉浏览器以附件的形式打开这个文件
response.setHeader("content-disposition","attachment;filename="+filename);
//告诉浏览器下载的文件的mimetype
response.setContentType(mimeType);
//2、设置两个流
//通过response获取输出流
ServletOutputStream out = response.getOutputStream();
//将需要下载的文件读取到输入流中
FileInputStream in = new FileInputStream(file);
//流拷贝:
int len = 0;
byte[] buff = new byte[1024];
while ((len = in.read(buff)) != -1) {
out.write(buff,0,len);
}
out.close();
in.close();
}
}
小结:
1、文件后台下载的本质:流拷贝,将文件以流的形式从服务器发用给浏览器;
2、文件下载的步骤:两个头+两个流
两个头:
设置content-disposition头,告诉浏览器以附件的形式下载当前文件
设置mimeType头,告诉浏览器下载的文件的mimeType
两个流:
输出流:从response中获取输出流
输入流:将文件读取到输入流中
流拷贝:将文件以流的形式发送给浏览器
3、注意事项:
mimeType可以不用设置:现在的浏览器已经很智能了,可自动辨别所下载的文件类型,因此可不用设置此参数
5.四大域对象:
①:page(jsp有效)
②:request(一次请求)
③:session(一次会话)
④:application(当前web应用)