HttpServleRequest

HttpServletRequest
1.Request的常用方法
System.out.println("getRequestURL= "+request.getRequestURL());
System.out.println("getRequestURI= "+request.getRequestURI());
System.out.println("getQueryString= "+request.getQueryString());
System.out.println("getRemoteAddr= "+request.getRemoteAddr());
System.out.println("getRemoteHost= "+request.getRemoteHost());
System.out.println("getRemotePort= "+request.getRemotePort());
System.out.println("getMethod= "+request.getMethod());
//请求路径为 http://localhost:8080/ServletDemo/requestDemo1?aa=111
getRequestURL= http://localhost:8080/ServletDemo/requestDemo1
getRequestURI= /ServletDemo/requestDemo1
getQueryString= aa=111
getRemoteAddr= 127.0.0.1
getRemoteHost= 127.0.0.1
getRemotePort= 52859
getMethod= GET
// Request获取请求头的相关方法
2.获取所有请求头并输出
Enumeration e = request.getHeaders("Accept-Encoding");
while (e.hasMoreElements()) {
String value = (String) e.nextElement();
System.out.println("foreach getHeaders(‘Accept-Encoding‘) = "+ value);
}
//
System.out.println("*******************************");
e = request.getHeaderNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
String vlaue = request.getHeader(name);
System.out.println("foreach getHeaderNames() = " + "name:[" + name+ "] value: [" + vlaue + "]");
}
foreach getHeaderNames() = name:[host] value: [localhost:8080]
foreach getHeaderNames() = name:[connection] value: [keep-alive]
foreach getHeaderNames() = name:[accept] value: [text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8]
foreach getHeaderNames() = name:[user-agent] value: [Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 SE 2.X MetaSr 1.0]
foreach getHeaderNames() = name:[referer] value: [http://localhost:8080/ServletDemo/requestDemo2.html]
foreach getHeaderNames() = name:[accept-encoding] value: [gzip,deflate,sdch]
foreach getHeaderNames() = name:[accept-language] value: [zh-CN,zh;q=0.8]

3.获取用户传送过来的数据
System.out.println("**************获取数据方法1*****************");
System.out.println("username=" + request.getParameter("username"));
//
System.out.println("************获取数据方法2*******************");
String[] e1 = request.getParameterValues("username");
for (String vale : e1) {
System.out.println("username=" + vale);
}
//
System.out.println("************获取数据方法3*******************");
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
String vale = request.getParameter(name);
System.out.println(name + "=" + vale);
}
4.获取表单提交数据
/* 用户名:<input type="text" name="username" /><br /> */
System.out.println(request.getParameter("username"));

/* 密码:<input type="password" name="password" /><br /> */
System.out.println(request.getParameter("password"));
/*
* 性别:<input type="radio" name="gender" value="male" />男 <input
* type="radio" name="gender" value="female" />女<br />
*/
System.out.println(request.getParameter("gender"));

/*
* 所在地: <select name="city"> <option value="beijing">北京</option> <option
* value="shanghai">上海</option> <option value="guangzhou">广州</option>
* <option value="shenzhen">深圳</option> </select><br />
*/
System.out.println(request.getParameter("city"));

/*
* 爱好:<input type="checkbox" name="likes" value="changge">唱歌 <input
* type="checkbox" name="likes" value="tiaowu">跳舞 <input type="checkbox"
* name="likes" value="kanshu">看书 <input type="checkbox" name="likes"
* value="paobu">跑步 <input type="checkbox" name="likes" value="daqiu">打球
* <br />
*/
String[] likes = request.getParameterValues("likes");
if (likes != null) {
for (String like : likes) {
System.out.print(like+" ");
}
System.out.println("");
}
5.中文数据提交
// 对于使用get方式传送过来的中文数据
// 先将数据转换为iso8859-1,然后再转化为utf-8。 这是因为 浏览器传输中文是以UTF-8的形式编码的,
// 但是传输到Servlet过程中Servlet是以iso8859-1形式接收
String username = request.getParameter("username");
username = new String(username.getBytes("iso8859-1"), "UTF-8");
System.out.println(username);

// 对于使用post方式传送过来的中文数据,直接设置setCharacterEncoding()方法的编码格式就行了。
request.setCharacterEncoding("UTF-8");
System.out.println(request.getParameter("username"));
6.利用request实现请求转发,以及使用request域对象将数据带给转发资源

// request实现请求转发的特点
// 1、客户机只发送一次请求,服务器会有多个资源响应
//2、客户机的地址栏没有发生变化

String data = "你是逗比";
request.setAttribute("data", data);
request.getRequestDispatcher("/message.jsp").forward(request, response);

*.jsp
${data}

7.//forward()方法细节
// 如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容,
// 只要写入到缓冲区的内容还没有真正输出到客户端,forward方法就可以被正常执行,
// 原来写入到输出缓冲区中的内容将被清空,但是已写入到HttpServletRespone对象中的响应头字段信息保持有效。
String data = "你是逗比";
request.setAttribute("data", data);//执行了forward方法后,这个不会被清空
response.getWriter().write(data);//执行了forward方法后,会清空response所在缓冲区的data数据。
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;

/*
* 下面代码报这个错误 java.lang.IllegalStateException: Cannot forward after response has been committed
* 这是因为上面forward()方法调用后,response.getWriter().close();被执行
* 然后再执行下面的forward()方法就会抛这个异常。 解决这个问题的方法是,执行完forward()方法后面跟着一句 return;
*/
request.getRequestDispatcher("/index.jsp").forward(request, response);

8.使用Request实现页面包含
request.getRequestDispatcher("/requestDemo7/Head.jsp").include(request,response);
9.利用getHeader("referer");实现防盗链
String referer = request.getHeader("referer");
if (referer == null || !referer.equals("http://localhost")) {
response.sendRedirect("/ServletDemo/index.jsp");
}

 


request请求的转发过程,
首先是客户机向web服务器请求数据,服务器收到请求之后,解释到请求的Servlet,然后创建request和response对象,交给Servlet处理。首次访问的Servlet会创建实例化对象,调用init方法进行实例化,然后调用Service()方法,读取请求信息,写入响应数据,当service执行到forward后,向web服务器发出forward命令,forward将request和response对象传送到Servlet2,Servlet2调用Service方法 读取请求信息,写入响应数据,Service方法执行后,Servlet2将返回web服务器,这时Servlet1的Service方法才算执行完,然后由Servlet1将request和response对象返回给web服务器。然后服务器将request和response对象构造Http响应发送到客户机。

 

response请求的重定向过程
首先是客户机向web服务器请求数据,服务器收到请求之后,解释到请求的Servlet,然后创建request和response对象,交给Servlet处理。首次访问的Servlet会创建实例化对象,调用init方法进行实例化,然后调用Service()方法,读取请求信息,写入响应数据 ,将request和response对象返回给web服务器,服务器将Http响应发送到客户机。客户机发现收到的是302重定向根据响应的Location的URL,改变浏览器的URL地址栏,根据URL再次向服务器发送请求,首次访问的Servlet会创建实例化对象,调用init方法进行实例化,然后调用Service()方法,读取请求信息,写入响应数据 ,将request和response对象返回给web服务器,服务器将Http响应发送到客户机。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。