文章目录标题
1 HttpServlet概述
Servlet: 动态页面, 接收请求, 返回响应
接口: Servlet: init service destroy
类: HttpServlet doGet doPost
生命周期: 默认第一次访问创建, 服务器关闭销毁
load-on-startup: 服务器开启时启动
init中的ServletConfig对象: getServletName() getInitParameter()
getServletContext()
ServletContext对象: getContextPath() getInitParameter()
getRealPath() 域对象
域对象: ServletContext范围 - 服务器运行期间
getAttribute() setAttribute() removeAttribute()
url-pattern的配置: /path /xx/* *.do
/ -> DefaultServlet
== request: 请求行[方式 URI 协议版本] 请求头[map] 请求体[post参数]
response:响应行[状态码] 响应头[map] 响应体[内容] ==
2 request的运⾏流程
3 抓取Http请求
因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求⾏、请求头和请求体。
4 通过request获得请求⾏
request:是客户端 -> 服务器(Servlet) 都是get方法
URL: 协议 + ip + port + uri
URI: 统一资源路径 从 / 开始
如果要跨服务器访问, 必须使用URL
步骤:
1.创建一个类extends Httpservlet
2.重写doget和dopost方法
获得客户端的请求⽅式:String getMethod()
获得请求的资源:
String getRequestURI() -- 获取请求URI
StringBuffer getRequestURL()
String getContextPath() -- 获取虚拟⽬录
String getServletPath() -- 获取Servlet路径
String getQueryString() -- 获取get⽅式请求参数
username=zhangsan&password=123
String getRemoteAddr() -- 获取客户机的IP地址
package a_request;
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;
@WebServlet("/Demo01Servlet")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获得请求行信息
// 请求方式 有get和post
String method = req.getMethod(); // 大写
System.out.println(method);
// URI
String uri = req.getRequestURI();
System.out.println(uri);
String url = req.getRequestURL().toString();
System.out.println(url);
// 获得客户端IP地址
String addr = req.getRemoteAddr();
System.out.println(addr);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5 通过request获得请求头
long getDateHeader(String name)
String getHeader(String name)
int getIntHeader(String name)
Enumeration<String> getHeaderNames() -- 获取所有的请求头名称
常⻅的请求头:
1. User-Agent:浏览器告诉服务器,我访问你使⽤的浏览器版本信息
作⽤:可以在服务器端获取该头的信息,解决浏览器的兼容性问题
作⽤:防盗链
步骤: 用一个当前应用体的页面访问下面的这个资源,再用一个外面的应用体访问这个资源,外面的应用体被阻挡,无法访问。
package b_referer;
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;
/**
* 这里模拟的是一个要访问的资源
*/
@WebServlet("/Demo3Servlet")
public class Demo03Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理盗链
String referer = req.getHeader("referer");
// 判断来源是不是当前应用
if (referer == null || referer.contains("/day03_war_exploded")) {
resp.getWriter().write("success! hi everybody~");
} else {
System.out.println("你个小偷, 走开");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6 通过request获得请求体
请求体:只有POST请求⽅式,才有请求体,在请求体中封装了POST请求的请求参数。
步骤:
- 获取流对象
BufferedReader getReader():获取字符输⼊流,只能操作字符数据
2、ServletInputStream getInputStream():获取字节输⼊流,可以操作所有类型数据
package c_parameter;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Demo04Servlet")
public class Demo04Servlet extends HttpServlet {
// 获得请求参数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// get请求参数在URI上 ?后面的参数
String queryString = req.getQueryString();
// username=lucy&password=111
System.out.println(queryString);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// post请求参数在请求体里 -> 输入流
ServletInputStream is = req.getInputStream();
byte[] bytes = is.readAllBytes();// 读取所有字节
String s = new String(bytes);//将字节数组转换成字符串
// name=lisi&age=18
System.out.println(s);
}
}
7 request的其他功能
7.1 获取请求参数
不论get还是post请求⽅式都可以使⽤下列⽅法来获取请求参数
1. String getParameter(String name):根据参数名称获取参数值
username=zs&password=123
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组
hobby=xx&hobby=game
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合
7.2 中⽂乱码问题
get⽅式:tomcat 8 已经将get⽅式乱码问题解决了,都是utf-8
post⽅式:会乱码(是ISO8859-1)
乱码问题:
Post提交: ISO8859-1 字符集 - 流
Get提交: 跟tomcat字符集一致 UTF8
修改tomcat字符集, 在修改端口的地方, 添加 URIEncoding="字符集"
tomcat8之前, 默认字符集是 ISO8859-1
tomcat8开始, 默认字符集就是 UTF8
== 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”); ==