Servlet-Request
<1> 简介
request 和 respons 对象是服务器生成的, 在本机上可以使用
request 对象是来获取请求消息, response 对象是来设置响应消息
<2> 功能
(0) 准备
首先在 servlet 中 src 目录下任意路径下创建 Servlet 对象
若新建菜单中无此项目, 请参考 Intellij IDEA 2021.1 创建Servlet 详细步骤:
https://blog.youkuaiyun.com/weixin_45518468/article/details/116902257
(1) 获取数据
1.获取请求行
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取请求方式 :GET / POST
String method = request.getMethod();
System.out.println(method);
//2. 获取虚拟目录:
String contextPath = request.getContextPath();
System.out.println(contextPath);
//3. 获取Servlet路径:
String servletPath = request.getServletPath();
System.out.println(servletPath);
//4. 获取get方式请求参数:(用"&"分隔每一对请求参数(提交的表单))
String queryString = request.getQueryString();
System.out.println(queryString);
//5. 获取请求URI/URL (URL是完整地址,包含http和localhost;URI不包含http和localhost,是URL的一部分)
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
//6. 获取协议及版本: HTTP/1.1
String protocol = request.getProtocol();
System.out.println(protocol);
//7. 获取客户机的IP地址:
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
2. 获取请求头
<1> 判断当前使用的浏览器:
String agent=request.getHeader("user-agent");
System.out.println(agent);
if (agent.contains("Chrome")) System.out.println("谷歌");
<2> 防盗链
注: 手动访问页面获取到的 referer 是 null.
String referer=request.getHeader("referer");
System.out.println(referer);
if(referer.contains("www.youku.com")) System.out.println("播放电影");
3. 获取请求体
注: 只有 POST 请求方式才有请求体, 即将请求参数分装成为的整体 (需要将代码写于 doPost 下).
虚拟目录为 /Request05
的类下的内容:
BufferedReader br = request.getReader();
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
HTML 文档中的内容:
<form action="/Request05" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" placeholder="请输入密码" name="password"><br>
<input type="radio" name="sex" value="male">男
<input type="radio" name="sex" value="female">女
<input type="radio" name="sex" value="else">非二元性别<br>
<input type="submit" value="注册">
</form>
注:
form 中 action 的路径要写: 虚拟目录+Servlet资源路径
在网页中输入并提交:
控制台输出的结果:
4. 获取请求参数
① 根据参数名称获取参数 (括号内的是参数名称, 即表单中的 name)
String username = request.getParameter("username");
注: 若相同的参数名称对应多个参数, 则返回值为应数组 String[ ]
② 获取所有参数的 map 集合
Map<String, String[]> parameterMap = request.getParameterMap();
③ 获取所有请求的参数名称
Enumeration<String> parameterNames = request.getParameterNames();
例: 打包获取参数:
Enumeration<String> parameterNames = request.getParameterNames();
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keyset = parameterMap.keySet();
for(String name:keyset){
String[] values = parameterMap.get(name);
for (String value:values){
System.out.println(name+":"+value);
}
System.out.println("===========俺是分割线===========");
}
5. 简便写法
当 doGet 和 doPost 内方法相同时, 可用一下方法省略
当 doPost 方法写完之后在 doGet 方法中写入
this.doPost(request,response);
6. 解决中文乱码问题
在 doPost 下首行添加一下代码, 可以解决获取的参数乱码问题:
request.setCharacterEncoding("utf-8");
(2) 资源跳转
1. 请求转发
RequestDispatcher requestDispatcher =request.getRequestDispatcher("/Request08"); //←-此处是跳转页面的虚拟目录
requestDispatcher.forward(request,response);
特点:
① 浏览器地址栏路径不发生变化
② 只能转发到当前服务器的内部资源中
③ 转发是一次请求
2. 数据共享
一次请求访问多个资源
Object msg=request.getAttribute("msg");
System.out.println(msg);
(3) 获取 ServletContext 对象
ServletContext sc=request.getServletContext();
System.out.println(sc);