【Web入门系列】初探HttpServletRequest
学习HttpServletRequest之前,先来要搞清楚http请求中GET请求和POST请求的区别。
GET请求与POST请求区别
1、GET请求方式,请求参数会跟在URI后面;POST请求方式,请求参数不会跟在URI后面,而是放在在实体内容里。
2、GET请求方式,提交参数数据有大小限制,不超过1KB;POST请求参数没有大小限制。
3、GET请求方式,不适合提交敏感数据;POST请求方式可以用来提交敏感数据。
默认GET提交方式,只有POST请求方式才有实体内容
HttpServletRequest获取请求行、请求头、实体
获取请求方式:request.getMethod()
获取请求资源:request.getRequetURI() / request.getRequetURL()
获取请求http协议版本:request.getProtocol()
根据请求头获取请求值:request.getHeader("名称")
获取所有的请求头名称:request.getHeaderNames()
获取实体内容:request.getInputStream()
public class RequestDemo extends HttpServlet {
/**
* 注意:tomcat服务器首先会调用servlet的service方法,然后在service方法中再根据请求方式来分别调用对应的doXX方法
* (例如,如果是GET请求方式,在service方法中调用doGet方法)
* 因为最常的请求方式是GET 和POST,所以编写servlet程序,只需要覆盖doGet和doPost即可.
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
System.out.println("service方法被调用");
System.out.println(request.getMethod());
}
/**
* tomcat服务器接收到浏览器发送的请求数据,然后封装到HttpServletRequest对象
* tomcat服务器调用doGet方法,把request对象传入到servlet中
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
t1(request);
t2(request);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
/**
* 3.3 请求的实体内容
*/
//得到实体内容
InputStream in = request.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while( (len=in.read(buf))!=-1 ){
String str = new String(buf,0,len);
System.out.println(str);
}
}
private void t1(HttpServletRequest request) {
/**
* 3.1 请求行 格式:(GET /day09/hello HTTP/1.1)
*/
System.out.println("请求方式:"+request.getMethod());
System.out.println("URI:"+request.getRequestURI());
System.out.println("URL:"+request.getRequestURL());
System.out.println("http协议版本:"+request.getProtocol());
}
private void t2(HttpServletRequest request) {
/**
* 3.2 请求头
*/
//根据头名称的到头的内容
String host = request.getHeader("Host");
System.out.println(host);
//得到所有的请求头名称列表
Enumeration<String> enums = request.getHeaderNames();
//判断是否有下一个元素
while(enums.hasMoreElements()){
//取出下一个元素
String headerName = enums.nextElement();
String headerValue = request.getHeader(headerName);
System.out.println(headerName+":"+headerValue);
}
}
}
HttpServletRequest获取请求参数
获取GET方式参数:request.getQueryString();
获取POST方式参数:request.getInputStream();
上面两种方法我们可以分别获取到GET和POST方式提交的请求参数,但是这样不是很统一,而且获取到的参数还需要进一步地解析。
request.getParameterValues(String name)是获得如checkbox类(名字相同,但值有多个)的数据。接收数组变量,如checkobx类型
request.getParameter(String name)是获得相应名的数据,如果有重复的名,则返回第一个的值.。接收一般变量,如 text类型。
request.getParameterNames() 获取所有参数名称列表:
public class RequestParamServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 设置参数查询的编码
* 该方法只能对请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效!
* GET方法的参数放在URI后面,所以对GET方式无效。
*/
request.setCharacterEncoding("utf-8");
/*System.out.println("GET方式");
//接收GET方式提交的参数
String value = request.getQueryString();
System.out.println(value);*/
/**
* 统一方便地获取请求参数的方法
*/
//根据参数名得到参数值
String name = request.getParameter("name");
/**
* 手动重新解码(iso-8859-1 字符串-> utf-8 字符串)
*/
if("GET".equals(request.getMethod())){
name = new String(name.getBytes("iso-8859-1"),"utf-8");
}
System.out.println("name:"+name);
String password = request.getParameter("password");
System.out.println("password:"+password);
System.out.println("=============================");
Enumeration<String> enums = request.getParameterNames();
while( enums.hasMoreElements() ){
String paramName = enums.nextElement();
String paramValue = request.getParameter(paramName);
System.out.println(paramName+":"+paramValue);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*System.out.println("POST方式");
InputStream in = request.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf))!=-1 ){
System.out.println(new String(buf,0,len));
}*/
doGet(request,response);
}
}