HttpServletRequest对象用来操作Http请求中的请求部分(请求消息行,请求消息头,请求正文),下面是常用的方法
1、请求行
①getMethod();获得请求方式(Get,Post)
②***getRequestURL();获得客户端请求的完整的URL
③***getRequestURI();获得请求行中的资源名部分
④***getContextPath();获得应用的目录
⑤getQueryString();获得请求消息行中的参数部分
2、请求消息头
①getHeader(String header);根据头名得到对应的信息值
②getHeaderNames();得到所有头名
③getHeaders(String header);更具头名得到所有相同头名对应的信息值
下面对请求行和请求消息头这些方法进行测试的Servlet:
package Test_HttpServletRequest;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test_HttpServletRequest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求消息行部分
System.out.println(req.getMethod());//得到请求方式
System.out.println(req.getRequestURL());//得到客户端请求的完整URL
System.out.println(req.getRequestURI());//得到请求行中的资源名部分
System.out.println(req.getContextPath());//得到应用的虚拟目录 Servlet
System.out.println(req.getQueryString());//得到请求消息行中的参数部分
//请求消息头部分
String header = req.getHeader("User-Agent");//得到客户端的信息
System.out.println(header);
Enumeration<String> names = req.getHeaderNames();//得到所有请求消息头中的name
while(names.hasMoreElements()){//得到每一个name对应的值
String name = names.nextElement();
System.out.println(name+":"+req.getHeader(name));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
Servlet对应的xml配置:
<servlet>
<servlet-name>request</servlet-name>
<servlet-class>Test_HttpServletRequest.Test_HttpServletRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>request</servlet-name>
<url-pattern>/request</url-pattern>
</servlet-mapping>
3、请求正文
常用如下方法来获取从form标签(表单)中提交的数据:
①***getParameter(String name) 根据表单中的name值获取value属性值
②***getPaeameterValues(String name) 根据name值获取复选框中value的值,该方法返回一个字符串数组
③getParameterNames() 获取表单中所有name值
④***getParameterMap 得到表单提交的所有值
⑤getInputStream 以字节流的方式得到所有表单数据
下面是一个例子,用来获取表单数据:
Servlet代码:
package Test_HttpServletRequest;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 获取表单数据
* @author wushijia
*
*/
public class getForm extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");//告诉服务器使用什么编码,HTML文档用的是什么编码,里面的值就传什么编码
//获取表单数据
String username = req.getParameter("username");//用户名
String pwd = req.getParameter("pwd");//密码
String sex = req.getParameter("sex");//性别
String[] hobby = req.getParameterValues("hobby");//爱好
String city = req.getParameter("city");//所在地
System.out.println(username);
System.out.println(pwd);
System.out.println(sex);
for (int i = 0;hobby != null && i < hobby.length; i++) {
System.out.print(hobby[i]+" ");
}
System.out.println();
System.out.println(city);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
html文档:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/Servlet/form" method="post"><!-- 提交到指定位置的servlet中 -->
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="pwd"><br/>
性别:<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女
<br/>
爱好:
<input type="checkbox" name="hobby" value="编程">编程
<input type="checkbox" name="hobby" value="健身">健身
<input type="checkbox" name="hobby" value="看书">看书
<br/>
所在城市:
<select name="city">
<option value="cq">重庆</option>
<option value="bj">北京</option>
</select>
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
3、操作非表单数据
想要向request对象中添加非表单数据(即不是从表单里提交的数据),使用setAttribute(String name,Object obj)即可,如果想要获取添加的数据,使用getAttribute(String name)即可
4、请求转发和请求重定向的区别
我们都知道,请求转发是利用request对象中的getRequestDispatcher()和forward()方法来完成的,而请求重定向是用response对象中的sendRedirect()方法来完成的,下面说说他们的区别。
请求转发:①请求转发后,浏览器地址栏的地址不会改变
②客户端始终只请求一次
③请求转发只能跳转到当前应用下的Servlet,不能跳转到其他应用
④请求转发能够传递数据
⑤转发由服务器执行
请求重定向:①不能传递数据
②客户端发送两次请求
③请求重定向能够跳转到其他应用
④浏览器的地址栏的地址会发生改变
⑤重定向由客户端执行