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


2.获取所有请求头并输出 // Request获取请求头的相关方法


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.HttpServletRequest获取用户传送过来的数据


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");
}


9.request请求的转发过程,


首先是客户机向web服务器请求数据,服务器收到请求之后,解释到请求的Servlet,然后创建request和response对象,交给Servlet处理。

若是首次访问的Servlet文件会创建实例化对象,调用init方法进行初始化,实例化后调用Service()方法,读取请求信息,写入响应数据。

当service执行到forward后,向web服务器发出forward命令,forward命令将request和response对象传送到Servlet2。

若是首次访问Servlet2文件会创建实例化对象,调用init方法进行初始化,实例化后调用Service方法() ,读取请求信息,写入响应数据,Servlet2的Service()方法执行后,

Servlet2将返回web服务器,这时Servlet1的Service方法才算执行完,然后由Servlet1将request和response对象返回给web服务器。

然后服务器将request和response对象构造Http响应发送到客户机。

10.response请求的重定向过程


首先是客户机向web服务器请求数据,服务器收到请求之后,解释到请求的Servlet,然后创建request和response对象,交给Servlet处理。

首次访问的Servlet会创建实例化对象,调用init方法进行初始化,然后调用Service()方法,读取请求信息,写入响应数据 。

Service()方法执行结束后,Servlet将request和response对象返回给web服务器,服务器将构造Http响应发送到客户机。

当客户机发现收到的是302重定向根据响应头中的"Location"的URL值,先改变浏览器的URL地址栏,然后根据提供URL地址再次向服务器发送请求,

首次访问的Servlet2会创建实例化对象,调用init方法进行初始化,然后调用Service()方法,读取请求信息,写入响应数据 。

Setvice()方法执行结束后,Servlet2将request和response对象返回给web服务器,服务器将构造Http响应发送到客户机。

原文地址:https://www.cnblogs.com/lhy_2011/p/4044816.html