HttpServletRequest对象表明客户端的请求,当客户端经过HTTP协议访问服务器时,HTTP请求头中的全部信息都封装在这个对象中,经过这个对象提供的方法,能够得到客户端请求的全部信息。html
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径以后和查询参数以前的内容,它以“/”开头。
getRemoteAddr方法返回发出请求的客户机的IP地址。
getRemoteHost方法返回发出请求的客户机的完整主机名。
getRemotePort方法返回客户机所使用的网络端口号。
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名。java
经过request对象获取客户端请求信息web
public class RequestDemo01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 1.得到客户机信息 */ String requestUrl = request.getRequestURL().toString();//获得请求的URL地址 String requestUri = request.getRequestURI();//获得请求的资源 String queryString = request.getQueryString();//获得请求的URL地址中附带的参数 String remoteAddr = request.getRemoteAddr();//获得来访者的IP地址 String remoteHost = request.getRemoteHost(); int remotePort = request.getRemotePort(); String remoteUser = request.getRemoteUser(); String method = request.getMethod();//获得请求URL地址时使用的方法 String pathInfo = request.getPathInfo(); String localAddr = request.getLocalAddr();//获取WEB服务器的IP地址 String localName = request.getLocalName();//获取WEB服务器的主机名 response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器 //经过设置响应头控制浏览器以UTF-8的编码显示数据,若是不加这句话,那么浏览器显示的将是乱码 response.setHeader("content-type", "text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.write("获取到的客户机信息以下:"); out.write("<hr/>"); out.write("请求的URL地址:"+requestUrl); out.write("<br/>"); out.write("请求的资源:"+requestUri); out.write("<br/>"); out.write("请求的URL地址中附带的参数:"+queryString); out.write("<br/>"); out.write("来访者的IP地址:"+remoteAddr); out.write("<br/>"); out.write("来访者的主机名:"+remoteHost); out.write("<br/>"); out.write("使用的端口号:"+remotePort); out.write("<br/>"); out.write("remoteUser:"+remoteUser); out.write("<br/>"); out.write("请求使用的方法:"+method); out.write("<br/>"); out.write("pathInfo:"+pathInfo); out.write("<br/>"); out.write("localAddr:"+localAddr); out.write("<br/>"); out.write("localName:"+localName); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
getHeader(string name)方法:String
getHeaders(String name)方法:Enumeration
getHeaderNames()方法编程
/** * @author gacl * 获取客户端请求头信息 * 客户端请求头: * */ public class RequestDemo02 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器 //经过设置响应头控制浏览器以UTF-8的编码显示数据 response.setHeader("content-type", "text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); Enumeration<String> reqHeadInfos = request.getHeaderNames();//获取全部的请求头 out.write("获取到的客户端全部的请求头信息以下:"); out.write("<hr/>"); while (reqHeadInfos.hasMoreElements()) { String headName = (String) reqHeadInfos.nextElement(); String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值 out.write(headName+":"+headValue); out.write("<br/>"); } out.write("<br/>"); out.write("获取到的客户端Accept-Encoding请求头的值:"); out.write("<hr/>"); String value = request.getHeader("Accept-Encoding");//获取Accept-Encoding请求头对应的值 out.write(value); Enumeration<String> e = request.getHeaders("Accept-Encoding"); while (e.hasMoreElements()) { String string = (String) e.nextElement(); System.out.println(string); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
getParameter(String)方法(经常使用)设计模式
getParameterValues(String name)方法(经常使用)数组
getParameterNames()方法(不经常使用)浏览器
getParameterMap()方法(编写框架时经常使用)服务器
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <fieldset style="width:500px;"> <legend>Html的Form表单元素</legend>
<form action="${pageContext.request.contextPath}/servlet/RequestDemo03" method="post"> 编 号(文本框):<input type="text" name="userid" value="NO." size="2" maxlength="2"><br>
用户名(文本框):<input type="text" name="username" value="请输入用户名"><br> 密 码(密码框):<input type="password" name="userpass" value="请输入密码"><br>
性 别(单选框): <input type="radio" name="sex" value="男" checked>男 <input type="radio" name="sex" value="女">女<br> 部 门(下拉框): <select name="dept"> <option value="技术部">技术部</option> <option value="销售部" SELECTED>销售部</option> <option value="财务部">财务部</option> </select><br> 兴 趣(复选框): <input type="checkbox" name="inst" value="唱歌">唱歌 <input type="checkbox" name="inst" value="游泳">游泳 <input type="checkbox" name="inst" value="跳舞">跳舞 <input type="checkbox" name="inst" value="编程" checked>编程 <input type="checkbox" name="inst" value="上网">上网 <br>
说 明(文本域): <textarea name="note" cols="34" rows="5"> </textarea> <br> <input type="hidden" name="hiddenField" value="hiddenvalue"/> <input type="submit" value="提交(提交按钮)"> <input type="reset" value="重置(重置按钮)"> </form> <!--表单结束--> </fieldset>
在服务器端使用getParameter方法和getParameterValues方法接收表单参数:网络
/** * 获取客户端经过Form表单提交上来的参数 */ public class RequestDemo03 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //客户端是以UTF-8编码提交表单数据的,因此须要设置服务器端以UTF-8的编码进行接收,不然对于中文数据就会产生乱码 request.setCharacterEncoding("UTF-8"); /** * 编 号(文本框): <input type="text" name="userid" value="NO." size="2" maxlength="2"> */ String userid = request.getParameter("userid");//获取填写的编号,userid是文本框的名字,<input type="text" name="userid"> /** * 用户名(文本框):<input type="text" name="username" value="请输入用户名"> */ String username = request.getParameter("username");//获取填写的用户名 /** * 密 码(密码框):<input type="password" name="userpass" value="请输入密码"> */ String userpass = request.getParameter("userpass");//获取填写的密码 String sex = request.getParameter("sex");//获取选中的性别 String dept = request.getParameter("dept");//获取选中的部门 //获取选中的兴趣,由于能够选中多个值,因此获取到的值是一个字符串数组,所以须要使用getParameterValues方法来获取 String[] insts = request.getParameterValues("inst"); String note = request.getParameter("note");//获取填写的说明信息 String hiddenField = request.getParameter("hiddenField");//获取隐藏域的内容 String instStr=""; /** * 获取数组数据的技巧,能够避免insts数组为null时引起的空指针异常错误! */ for (int i = 0; insts!=null && i < insts.length; i++) { if (i == insts.length-1) { instStr+=insts[i]; }else { instStr+=insts[i]+","; } } String htmlStr = "<table>" + "<tr><td>填写的编号:</td><td>{0}</td></tr>" + "<tr><td>填写的用户名:</td><td>{1}</td></tr>" + "<tr><td>填写的密码:</td><td>{2}</td></tr>" + "<tr><td>选中的性别:</td><td>{3}</td></tr>" + "<tr><td>选中的部门:</td><td>{4}</td></tr>" + "<tr><td>选中的兴趣:</td><td>{5}</td></tr>" + "<tr><td>填写的说明:</td><td>{6}</td></tr>" + "<tr><td>隐藏域的内容:</td><td>{7}</td></tr>" + "</table>"; htmlStr = MessageFormat.format(htmlStr, userid,username,userpass,sex,dept,instStr,note,hiddenField); response.setCharacterEncoding("UTF-8");//设置服务器端以UTF-8编码输出数据到客户端 response.setContentType("text/html;charset=UTF-8");//设置客户端浏览器以UTF-8编码解析数据 response.getWriter().write(htmlStr);//输出htmlStr里面的内容到客户端浏览器显示 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
在服务器端使用getParameterNames方法接收表单参数:框架
Enumeration<String> paramNames = request.getParameterNames();//获取全部的参数名 while (paramNames.hasMoreElements()) { String name = paramNames.nextElement();//获得参数名 String value = request.getParameter(name);//经过参数名获取对应的值 System.out.println(MessageFormat.format("{0}={1}", name,value)); }
在服务器端使用getParameterMap方法接收表单参数:
//request对象封装的参数是以Map的形式存储的 Map<String, String[]> paramMap = request.getParameterMap(); for(Map.Entry<String, String[]> entry :paramMap.entrySet()){ String paramName = entry.getKey(); String paramValue = ""; String[] paramValueArr = entry.getValue(); for (int i = 0; paramValueArr!=null && i < paramValueArr.length; i++) { if (i == paramValueArr.length-1) { paramValue+=paramValueArr[i]; }else { paramValue+=paramValueArr[i]+","; } } System.out.println(MessageFormat.format("{0}={1}", paramName,paramValue)); }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <form action="<%=request.getContextPath()%>/servlet/RequestDemo04" method="post"> 用户名:<input type="text" name="userName"/> <input type="submit" value="post方式提交表单"> </form>
此时在服务器端接收中文参数时就会出现中文乱码,以下所示:
之因此会产生乱码,就是由于服务器和客户端沟通的编码不一致形成的,所以解决的办法是:在客户端和服务器之间设置一个统一的编码,以后就按照此编码进行数据的传输和接收。
因为客户端是以UTF-8字符编码将表单数据传输到服务器端的,所以服务器也须要设置以UTF-8字符编码进行接收,要想完成此操做,服务器能够直接使用从ServletRequest接口继承而来的"setCharacterEncoding(charset)"方法进行统一的编码设置。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 客户端是以UTF-8编码传输数据到服务器端的,因此须要设置服务器端以UTF-8的编码进行接收,不然对于中文数据就会产生乱码 */ request.setCharacterEncoding("UTF-8"); String userName = request.getParameter("userName"); System.out.println("userName:"+userName); }
使用request.setCharacterEncoding("UTF-8");设置服务器以UTF-8的编码接收数据后,此时就不会产生中文乱码问题了。
对于以get方式传输的数据,request即便设置了以指定的编码接收数据也是无效的(至于为何无效我也没有弄明白),默认的仍是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致所以才会产生中文乱码的。解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,而后经过字节数组以指定的编码构建字符串,解决乱码问题。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /**
* 对于以get方式传输的数据,request即便设置了以指定的编码接收数据也是无效的,默认的仍是使用ISO8859-1这个字符编码来接收数据 */ String name = request.getParameter("name");//接收数据 name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,而后经过字节数组以指定的编码构建字符串,解决乱码问题 System.out.println("name:"+name); }
客户端想传输数据到服务器,能够经过表单提交的形式,也能够经过超连接后面加参数的形式:
<a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=张三">点击</a>
点击超连接,数据是以get的方式传输到服务器的,因此接收中文数据时也会产生中文乱码问题,而解决中文乱码问题的方式与上述的以get方式提交表单中文数据乱码处理问题的方式一致,以下所示:
String name = request.getParameter("name"); name =new String(name.getBytes("ISO8859-1"), "UTF-8");
另外,须要提的一点就是URL地址后面若是跟了中文数据,那么中文参数最好使用URL编码进行处理:
<a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=<%=URLEncoder.encode("张三", "UTF-8")%>">点击</a>
一、若是提交方式为post,想不乱码,只须要在服务器端设置request对象的编码便可,客户端以哪一种编码提交的,服务器端的request对象就以对应的编码接收,好比客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding("UTF-8"))
二、若是提交方式为get,设置request对象的编码是无效的,request对象仍是以默认的ISO8859-1编码接收数据,所以要想不乱码,只能在接收到数据后再手工转换,步骤以下:
1).获取获取客户端提交上来的数据,获得的是乱码字符串,data="???è?????"
String data = request.getParameter("paramName");
2).查找ISO8859-1码表,获得客户机提交的原始数据的字节数组
byte[] source = data.getBytes("ISO8859-1");
3).经过字节数组以指定的编码构建字符串,解决乱码
data = new String(source, "UTF-8");
经过字节数组以指定的编码构建字符串,这里指定的编码是根据客户端那边提交数据时使用的字符编码来定的,若是是GB2312,那么就设置成data = new String(source, "GB2312"),若是是UTF-8,那么就设置成data = new String(source, "UTF-8")
请求转发:指一个web资源收到客户端请求后,通知服务器去调用另一个web资源进行处理。
请求转发的应用场景:MVC设计模式
在Servlet中实现请求转发的两种方式:
一、经过ServletContext的getRequestDispatcher(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法能够实现请求转发。
例如:将请求转发的test.jsp页面
RequestDispatcher reqDispatcher =this.getServletContext().getRequestDispatcher("/test.jsp"); reqDispatcher.forward(request, response);
二、经过request对象提供的getRequestDispatche(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法能够实现请求转发。
例如:将请求转发的test.jsp页面
request.getRequestDispatcher("/test.jsp").forward(request, response);
request对象同时也是一个域对象(Map容器),开发人员经过request对象在实现转发时,把数据经过request对象带给其它web资源处理。
例如:请求RequestDemo06 Servlet,RequestDemo06将请求转发到test.jsp页面
public class RequestDemo06 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data="拉拉"; /** * 将数据存放到request对象中,此时把request对象看成一个Map容器来使用 */ request.setAttribute("data", data); //客户端访问RequestDemo06这个Servlet后,RequestDemo06通知服务器将请求转发(forward)到test.jsp页面进行处理 request.getRequestDispatcher("/test.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
test.jsp页面代码以下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Request对象实现请求转发</title> </head> <body> 使用普通方式取出存储在request对象中的数据: <h3 style="color:red;"><%=(String)request.getAttribute("data")%></h3> 使用EL表达式取出存储在request对象中的数据: <h3 style="color:red;">${data}</h3> </body> </html>
request对象做为一个域对象(Map容器)使用时,主要是经过如下的四个方法来操做
一个web资源收到客户端请求后,通知服务器去调用另一个web资源进行处理,称之为请求转发/307。
一个web资源收到客户端请求后,通知浏览器去访问另一个web资源进行处理,称之为请求重定向/302。
参考:http://www.cnblogs.com/xdp-gacl/p/3798347.html