Request
通过浏览器访问服务器时,tomcat将http请求所有信息都封装在Request中
开发人员可以通过request对象方法,来获取浏览器发送的所有信息。
Request获取请求信息
获取请求行
相关方法
String getMethod()获取请求方式
String getContextPath()获取项目虚拟路径(项目名)
String getRequestURI()获取URI
StringBuffer getRequestURL()获取URL http://localhost:8080/day03_request&response/requestDemo01
String getProtocol()获取协议和版本号 HTTP/1.1
String getRemoteAddr()获取客户端IP地址
代码演示
@WebServlet("/test/getHttpRequestLineServlet")
public class GetHttpRequestLineServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
//获取请求信息的相关方法
/**
* 方法说明
* String getMethod()获取请求方式
* String getContextPath()获取项目虚拟路径(项目名)
* String getRequestURI()获取URI day03_request&response/requestDemo01
* StringBuffer getRequestURL()获取URL http://localhost:8080/day03_request&response/requestDemo01
* String getProtocol()获取协议和版本号 HTTP/1.1
* String getRemoteAddr()获取客户端IP地址
*/
//String getMethod()获取请求方式
String method = request.getMethod();
System.out.println("method:"+method);
//String getContextPath()获取项目虚拟路径(项目名)
String contextPath = request.getContextPath();
System.out.println("contextPath:"+contextPath);
//String getRequestURI()获取URI day03_request&response/requestDemo01
//返回该请求的URL的一部分,从协议名一直到HTTP请求的第一行中的查询字符串。
String requestURI = request.getRequestURI();
System.out.println("requestURI:"+requestURI);
//StringBuffer getRequestURL()获取URL http://localhost:8080/day03_request&response/requestDemo01
//获取浏览器访问绝对路径名
StringBuffer requestURL = request.getRequestURL();
System.out.println("绝对路径名:"+requestURL);
//String getProtocol()获取协议和版本号 HTTP/1.1
String protocol = request.getProtocol();
System.out.println("协议版本号:"+protocol);
//String getRemoteAddr()获取客户端IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println("remoteAddr"+remoteAddr);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
获取请求头信息
相关方法
String getHeader(String name)获取请求头名称对应的值
Enumeration getHeaderNames()获取所有请求头的名称
代码演示
@WebServlet("/getHttpRequestHeaderServlet")
public class GetHttpRequestHeaderServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
//String getHeader(String name)获取请求头名称对应的值
// Enumeration<String> getHeaderNames()获取所有请求头的名称
//获取请求头
Enumeration<String> headerNames = request.getHeaderNames();
//迭代遍历
while (headerNames.hasMoreElements()){
//获取每一个请求头
String key = headerNames.nextElement();
//根据请求头得到相应的值
String value = request.getHeader(key);
System.out.println(key+":"+value);
}
//单独获取头
String user_agent = request.getHeader("USER-AGENT");
System.out.println(user_agent);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
请求头小案例
浏览器兼容
代码实现
@WebServlet("/getUserAgentRequestServlet")
public class GetUserAgentRequestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
// 1.获取浏览器版本信息
String userAgent = request.getHeader("user-agent");
// 2.判断浏览器版本
if (userAgent.contains("Chrome")) {
System.out.println("浏览器:谷歌");
} else if (userAgent.contains("Firefox")) {
System.out.println("浏览器:火狐");
} else {
System.out.println("浏览器:其他");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
获取请求题
相关方法
String getParameter(String name)根据参数名称获取参数值
String[] getParameterValues(String name)根据参数名称获取参数值的数组
Enumeration getParameterNames()获取所有请求的参数名称
Map<String,String[]> getParameterMap()获取所有参数的map集合
不论是post或者是get请求方式,都可以使用下列方法来获取请求参数
代码演示
@WebServlet("/getHttpRequestBodyServlet")
public class GetHttpRequestBodyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
System.out.println("==========手动获取=========");
String username = request.getParameter("username");
System.out.println("用户名:"+username);
String password = request.getParameter("password");
System.out.println("密码:"+password);
String[] hobbies = request.getParameterValues("hobby");
System.out.println("爱好:"+ Arrays.toString(hobbies));
System.out.println("===========自动获取============");
Map<String, String[]> map = request.getParameterMap();
Set<Map.Entry<String, String[]>> entrySet = map.entrySet();
for (Map.Entry<String, String[]> entry : entrySet) {
String key = entry.getKey();
String[] value = entry.getValue();
System.out.println(key+":"+Arrays.toString(value));
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
前端页面提交代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>form</title>
</head>
<body>
<h3>get方式:</h3>
<form action="/getHttpRequestBodyServlet" method="get">
用户:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
爱好:
<input type="checkbox" name="hobby" value="somke"/>抽烟
<input type="checkbox" name="hobby" value="drink"/>喝酒
<input type="checkbox" name="hobby" value="perm"/>烫头
<input type="submit" value="get提交...">
</form>
<h3>post方式:</h3>
<form action="/day09_request/requestDemo3" method="post">
用户:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
爱好:
<input type="checkbox" name="hobby" value="somke"/>抽烟
<input type="checkbox" name="hobby" value="drink"/>喝酒
<input type="checkbox" name="hobby" value="perm"/>烫头
<input type="submit" value="post提交...">
</form>
</body>
</html>
请求乱码
前端与后台的编码不一致,tomcat默认编码是ISO-8859-1(拉丁文)
而浏览器的编码通常是UTF-8或GBK编码
解决乱码
在HttpServletRequest中,设置编码,例如:
request.setCharacterEncoding("utf-8);
这一种不利于后期的维护
或者在web.xml中配置全变变量来设置编码,例如
encode
utf-8
有利于后期的维护
Request其他功能
请求转发
由多个Servlet来分工完成一个功能
请求转发步骤
- 通过request对象获取请求转发对象:RequestDispacther
- 使用RequestDispacther对象进行转发forward(req,resp)
代码演示
@WebServlet("/requestServletDemo01Servlet")
public class RequestServletDemo01Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
//获取请求转发器对象
RequestDispatcher dispatcher = request.getRequestDispatcher("/requestServletDemo02Servlet");
// //转发
dispatcher.forward(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/requestServletDemo02Servlet")
public class RequestServletDemo02Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
System.out.println("请求转发到这里");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
请求转发特点
- 浏览器地址栏不会发生变化
- 只能转发当前服务器内部资源中
- 转发是一次请求
- 共享同一个请求中的数据
- 请求转发可以访问WEB-INF目录下的内容
域对象
一个有作用范围的对象,可以在范围内共享数据
常见域对象
Request
Session
ServletContext(application)
域对象共有方法
void setAttribute(String name,Object obj)设置数据
Object getAttribute(String name)获取数据
void removeAttribute(String name)删除数据
Request域
代表一次引用,用于一次请求中转发的多个资源中共享数据
代码实现
@WebServlet("/requestDomain01Servlet")
public class RequestDomain01Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
System.out.println("处理功能的地方不在这");
request.setAttribute("tom","password");
request.getRequestDispatcher("/requestDomain02Servlet").forward(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/requestDomain02Servlet")
public class RequestDomain02Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
System.out.println("处理功能");
Object tom = request.getAttribute("tom");
System.out.println(tom);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
ServletContext
ServletContext官方叫上下文,服务器会为每一个工程创建一个ServletContext对象,全局唯一,该工程内部共享该ServletContext对象
作用
- 作用
- 是一个域对象
- 读取全局配置参数
- 可以搜索当前目录下面的资源文件
- 可以获取当前工程名
获取方式
- 通过request对象获取
request.getServletContext(); - 通过this获取
this.getServletContext();
生命周期
项目创建时,ServletContext()创建
项目卸载时,ServletContext()销毁
作用范围:与项目共存亡
代码演示
@WebServlet("/servletContextDomain01Servlet")
public class ServletContextDomain01Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
//配置全局变量
ServletContext servletContext = request.getServletContext();
//设置属性
servletContext.setAttribute("encode","gbk");
System.out.println("已保存全局变量数据");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/servletContextDomain02Servlet")
public class ServletContextDomain02Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
//获取全局变量ServletContext
ServletContext servletContext = request.getServletContext();
Object encode = servletContext.getAttribute("encode");
System.out.println(encode);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
获取资源文件真实路径
方法
String getRealPath(String path)获取文件的真实路径
代码演示
@WebServlet("/getRealPathServlet")
public class GetRealPathServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
//获取gril.jpg文件的真实路径
String realPath = request.getServletContext().getRealPath("/WEB-INF/img/gril.jpg");
System.out.println(realPath);
String realPath1 = request.getServletContext().getRealPath("/index.jsp");
System.out.println(realPath1);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
资源文件
获取MIME类型
互联网通信过程中定义的一种文件数据类型
代码演示
前端代码
<h3>post方式:</h3>
<form action="/getMimeTypeServlet" method="get">
<input type="file" name="filename">
<input type="submit" value="post提交...">
</form>
</body>
后端判断文件类型代码
@WebServlet("/getMimeTypeServlet")
public class GetMimeTypeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
//获取文件name属性
String filename = request.getParameter("filename");
String mimeType = request.getServletContext().getMimeType(filename);
System.out.println("文件类型:"+mimeType);
}
}