servlet关于HttpServletRequest 对象
常见方法的具体实现
已经学习完了,Servlet的一些基本原理,现在开始进行实际的运用实现。
文中web.xml 和 index.html是共用的代码
回顾一下Servlet的作用:
- 获取用户提交数据
- 获取浏览器附加信息
- 处理数据(访问数据库或调用接口)
- 给浏览器产生一个响应
- 在响应中添加附加信息
获取请求头信息常见方法
package com.hhxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 获取请求信息,使用的是HttpServletRequest
* */
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//返回客户端浏览器发出请求的完整URL,属于StringBuffer类型
StringBuffer requestURL =req.getRequestURL();
//返回请求行中制定的URI(除去主机端口)
String requestURI= req.getRequestURI();
//返回发送请求的主机IP地址
String remoteAddr =req.getRemoteAddr();
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println("requestURL:"+requestURL+"<br/>");
out.println("requestURI:"+requestURI+"<br/>");
out.println("remoteAddr:"+remoteAddr+"<br/>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
输出结果:
// requestURL:http://localhost:8080/demo//test.do
// requestURI:/demo//test.do
// remoteAddr:0:0:0:0:0:0:0:1
获取请求数据
由于会有单选框和多选框的形式因此在获取值得时候,方法是不一样的。有的是指,有的是键值对,有的是枚举。这里难度不在于使用这个方法,而在于如何把这个内容响应到浏览器页面,会涉及之前的容器内容
需要注意的是,是请求数据,因此使用doPost提交方式下面代码主要反映主要的代码
根据key获取指定的value,适合单选框
//参数是表单当中的name=“”
String username = req.getParameter("username");
获取复选框(Checkbox)中的值,一个key,可能对应多个值
//返回的是数组类型
String[] userlikes =req.getParameterValues("userlike");
//传入的内容必须是对象或者对象数组,不能是基本数据类型通过Arrays.asList()方法转为List类型
List<String> strings =Arrays.asList(userlikes);
由于String数组直接打印的话是对象的引用,因此需要进行遍历,可以转为List,而可以通过Arrays.toString(int[] )函数来输出;而因为List Set Map等集合类都实现了toString()方法,所以可以直接打印输出
获取所提交数据的key
Enumeration<String> parameterNames =req.getParameterNames();
List<String> keys =new ArrayList<>();
while(parameterNames.hasMoreElements()){
//为了便于遍历,将放在List当中
keys.add(parameterNames.nextElement());
}
该方法返回的是一个枚举类型,因此需要通过遍历获取,依旧采用List获取
使用Map结构获取提交数据
Map<String,String[]> parameterMap = req.getParameterMap();
Iterator<Map.Entry<String,String[]>> iterator =parameterMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String ,String[]> entry =iterator.next();
out.println("keys:"+entry.getKey()+"Value:"+Arrays.asList(entry.getValue())+"<br/>");
}
//或者使用
Set<Map.Entry<String,String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> stringEntry : entries) {
value是一个字符串数组,直接输出是对象的引用,使用Arrays.asList进行转换
out.println("keys:"+stringEntry.getKey()+"Value:"+Arrays.asList(stringEntry.getValue())+"<br/>");
}
获取请求中所有的数据并存放到一个 Map 结构中,该方法返回一个 Map,其中 key 为 String 类型 value 为 String[]类型。
以上调用,都是以字符形式进行的,而响应的获取使用即可
PrintWriter out = resp.getWriter();
设置数据编码
请求的数据包基于字节在网络上传输,Tomcat 接收到请求的数据包后会将数据包中的 字节转换为字符。在 Tomcat 中使用的是 ISO-8859-1 的单字节编码完成字节与字符的转换, 所以数据中含有中文就会出现乱码,可以通过 req.setCharacterEncoding("utf-8")方法来对提交的数据根据指定的编码方式重新做编码处理。这个方法要写在其他请求方法之前,解决因输入中文,请求乱码的问题
req.setCharacterEncoding("utf-8");
获取请求头信息
- 根据请求头中的 key 获取对应的 value。
String header = req.getHeader("Accept-Language");
- 获取请求头中所有的 key,该方法返回枚举类型。获得所有key之后,可以通过getHeader()获得值
Enumeration<String> headerNames =req.getHeaderNames();
PrintWriter out = resp.getWriter();
while (headerNames.hasMoreElements()){
String key = headerNames.nextElement();
String value = req.getHeader(key);
out.println("key:"+key+" Value:"+value+"<br/>");
}
HttpServletRequest 对象的生命周期
当有请求到达 Tomcat 时,Tomcat 会创建 HttpServletRequest 对象,并将该对象通过参数 的方式传递到我们 Servlet 的方法中,当处理请求处理完毕并产生响应后该对象生命周期结束。
补充 请求方式get和post区别
get
向指定的资源发出“显示”请求。GET 请求中会将请求中传递的数据包含在 URL 中并在 浏览器的地址栏中显示。GET 请求传递数据时要求数据必须是 ASCII 字符。GET 请求可以被 浏览器缓存。
GET - 从指定的服务器中获取数据
post
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包 含在请求体中。POST 请求传递数据时,数据可以试试 ASCII 字符也可以是字节型数据,默认 为字符型。POST 请求默认情况下不会被浏览器所缓存。
POST - 提交数据给指定的服务器处理
区别
- get在浏览器回退时是无害的,而post会再次提交请求(get方式不会发送请求,post的则会向url发出请求)
- get产生的url地址可以被bookmark(添加到书签),post的不行
- get请求会被浏览器主动缓存(cache),而post不会,除非手动
- get请求只能进行url编码,而post支持多种编码
- get请求参数会被完整保留在浏览器历史记录中(因为是在url中传递的,而历史记录保存的是url),而post中参数不会被保留(只会保留post请求参数,而提交数据不会保留)
- get请求在url中传送有长度限制,而post没有。对参数的数据类型get只支持ASII字符,而post可以是字符和字节
- post更安全,因为get参数直接暴露在url上,因此不能用来传递敏感信息
- get参数通过url传递,post放在请求体中(request body)