HttpServletRequest
1.HttpServletRequest概述
客户端发送给服务器端的数据。
我们在创建Servlet时会覆盖service()⽅法,或doGet()/doPost(),这些⽅法都有两个参数,代表请求的request和代表响应response。
service⽅法中的request的类型是ServletRequest,⽽doGet/doPost⽅法的request的类型是HttpServletRequest,HttpServletRequestServletRequest的⼦接⼝,功能和⽅法更加强⼤,所以我们学习HttpServletRequest。
2.request的运⾏流程
3.通过request获得请求⾏
- 获得客户端的请求⽅式: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("/Demo01Request")
public class Demo01Request extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获得请求行
String url = req.getRequestURL().toString();
System.out.println(url);
String uri = req.getRequestURI();
System.out.println(uri);
String method = req.getMethod();
System.out.println(method);
//ip
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);
//端口
int remotePort = req.getRemotePort();
System.out.println(remotePort);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
4.通过request获得请求头
- long getDateHeader(String name)
- String getHeader(String name)
- int getIntHeader(String name)
- Enumeration <string> getHeaderNames() – 获取所有的请求头名称
常⻅的请求头:
- User-Agent:浏览器告诉服务器,我访问你使⽤的浏览器版本信息
作⽤:可以在服务器端获取该头的信息,解决浏览器的兼容性问题 - Referer:告诉服务器,我(当前请求)从哪⾥来?
作⽤:防盗链
4.1案例防盗链
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("/Demo01Referer")
public class Demo01Referer 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 evertbody~");
}else {
resp.getWriter().write("fuck you mother doing");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
5.通过request获得请求体
请求体:只有POST请求⽅式,才有请求体,在请求体中封装了POST请求的请求参数。
步骤:
- 获取流对象
BufferedReader getReader():获取字符输⼊流,只能操作字符数据ServletInputStream getInputStream():获取字节输⼊流,可以操作所有类型数据 - 再从流对象中拿数据
package c_parameter;
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.util.Arrays;
import java.util.Map;
import java.util.Set;
@WebServlet("/Demo02Parameter")
public class Demo02Parameter extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
//适用于一个name对应一个值的情况
String username = req.getParameter("username");
System.out.println(username);
/* byte[] bytes = username.getBytes("ISO8859-1");
username = new String(bytes, "UTF-8");*/
/*username= new String(username.getBytes("ISO8859-1"),"UTF-8");
System.out.println(username);*/
String password = req.getParameter("password");
System.out.println(password);
System.out.println("----------------------------");
//适用于多选,也就是一个name对应多个值的情况
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
System.out.println("----------------------------");
//将所有参数封装成map格式,key就是参数名,value就是参数值[数组]
Map<String, String[]> parameterMap = req.getParameterMap();
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry : entries) {
System.out.print(entry.getKey()+":");
System.out.println(Arrays.toString(entry.getValue()));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
6.request的其他功能
6.1 乱码问题
get⽅式:tomcat 8 已经将get⽅式乱码问题解决了
post⽅式:会乱码(ISO8859-1)
- 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
6.2 请求转发
请求转发:⼀种在服务器内部的资源跳转⽅式
- 步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher
getRequestDispatcher(String path) - 使⽤RequestDispatcher对象来进⾏转发:forward(ServletRequest request,ServletResponse response)
- 通过request对象获取请求转发器对象:RequestDispatcher
- 特点:
- 浏览器地址栏路径不发⽣变化
- 只能转发到当前服务器内部资源中
- 转发是⼀次请求
package e_servlet;
import JDBCutil.DruidUtils;
import JDBCutil.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
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.util.List;
@WebServlet("/Demo06Servlet")
public class Demo06Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getContextPath();
req.setAttribute("user","张三");
System.out.println("Demo06存进去了数据");
//请求转发 - Demo07Servlet
req.getRequestDispatcher("/Demo07Servlet").forward(req,resp);
//下面不要写代码
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
package e_servlet;
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("/Demo07Servlet")
public class Demo07Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object user = req.getAttribute("user");
System.out.println(user);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
6.3 共享数据
域对象:⼀个有作⽤范围的对象,可以在范围内共享数据
request域:代表⼀次请求的范围,⼀般⽤于请求转发的多个资源中共享数据
⽅法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
注意:ServletContext域与Request域的⽣命周期⽐较?
- ServletContext
创建:服务器启动
销毁:服务器关闭
域的作⽤范围:整个web应⽤ - request
创建:访问时创建request
销毁:响应结束request销毁
域的作⽤范围:⼀次请求中
6.4 注册登陆跳转案例
loginServlet
package D_loginServlet;
import JDBCutil.DruidUtils;
import JDBCutil.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
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.util.List;
@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
JdbcTemplate template = new JdbcTemplate(DruidUtils.getDataSource());
String sql = "select * from user1 where username = ? and password = ?";
List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class),username,password);
if (list.size() == 0 ){
System.out.println("登陆失败");
}else {
System.out.println("登陆成功,欢迎" +list.get(0).getUsername());
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
regServlet
package D_loginServlet;
import JDBCutil.DruidUtils;
import JDBCutil.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
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.util.Map;
@WebServlet("/regServlet")
public class regServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
JdbcTemplate template = new JdbcTemplate(DruidUtils.getDataSource());
String sql = "insert into user1(username, password) values(?, ?)";
String sql1 = "select * from user1 where username = ?";
Map<String, Object> map = template.queryForMap(sql1, username);
if(map==null){
template.update(sql, username, password);
System.out.println("注册成功");
resp.sendRedirect(req.getContextPath()+"/login.html");
}else {
System.out.println("注册失败");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
reg.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册</title>
</head>
<body>
<h1>注册</h1>
<form method="GET" action="regServlet" enctype="">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit">
</form>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登陆</title>
</head>
<body>
<h1>登陆</h1>
<form method="GET" action="loginServlet" enctype="">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit">
</form>
</body>
</html>