(10A)HttpServletRequest:获取客户机信息、获取消息头信息、获取客户机请求参数、请求转发forward
HttpServletRequest
该对象表示浏览器的请求,当web服务器得到该请求后,会把请求信息封装成一个HttpServletRequest对象,所以在servlet中可以通过request取数据。
一、获取客户机信息
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//得到URL
String url=request.getRequestURL().toString();
out.println("url:"+url+"<br/>");http://localhost:8080/request/demo
//获取URI
String uri=request.getRequestURI().toString();
out.println("uri:"+uri+"<br/>");uri:/request/demo
//获取请求部分的数据,http://localhost:8080/request/demo?username=zhangsan&psw=1234
//得到的是请求行中的参数部分(参数名+值)
String queryString=request.getQueryString();
out.println("queryString"+queryString+"<br/>");//queryStringusername=zhangsan&psw=1234
//获取发送请求的客户端ip地址
String addr=request.getRemoteAddr();
out.println("addr"+addr+"<br/>");
//用途:可以封杀某个客户端,不让其访问该界面
if(addr.equals("192.168.2.4"))
{
//response.sendRedirect("/request/error");//简单封杀,转到某个页面
}
//获取发送请求的主机名,在dns中注册,则会返回主机名。否则返回ip地址
String host=request.getRemoteHost();
out.println("host:"+host+"<br/>");
//获取客户机使用的端口
int port=request.getRemotePort();
int serverport=request.getLocalPort();
out.println("客户端口:"+port+"---服务器端口"+serverport);
}
二、获取消息头信息
getHeader方法:根据键获得值
getHeaders方法(用的少)
getHeaderNames方法
Enumeration <String> headers=request.getHeaderNames();
while(headers.hasMoreElements())
{
//获取键
String name=headers.nextElement();
String value=request.getHeader(name);
out.println(name+"---"+value+"<br/>");
}
三、获取客户机请求参数
注意
①复选框的提交:request.getParameterValues(name)
②文本域textarea标签
③下拉菜单select标签
④隐藏标签hiddern
<body>
<form action="/request/Demo2" method="post">
用户名:<input type="text" name="username"/><br/>
密 码:<input type="password" name="psw"/><br/>
性 别:<input type="radio" name="sex" value="man" >男
<input type="radio" name="sex" value="girl" >女<br/>
爱 好:<input type="checkbox" name="hobbies" value="dance"/>跳舞
<input type="checkbox" name="hobbies" value="sing"/>唱歌
<input type="checkbox" name="hobbies" value="basketball"/>篮球
<input type="checkbox" name="hobbies" value="football"/>足球<br/>
城 市:<select name="cities">
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="guangdong">广东</option>
<option value="shenzhen">深圳</option>
</select><br/>
简 介:<textarea cols="20" row="10" name="intro" value="">请输入介绍</textarea><br/>
提交照片:<input type="file" name="image" value=""/> <br/>
<input type="hidden" name="hidden1" value="avb" ><br/>
<input type="submit" value="提交"/>
</form>
</body>
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
Enumeration<String> names=request.getParameterNames();
while(names.hasMoreElements())
{
String name=names.nextElement();
if(name.equals("hobbies"))//
{
String[] str=request.getParameterValues(name);
out.println(name+":");
for(int i=0;i<str.length;i++)
{
if(i==str.length-1){
out.print(str[i]);
}
else{
out.print(str[i]+",");
}
}
out.println();
}
else
{
String value=request.getParameter(name);
out.println(name+":"+value+"<br/>");
}
}
}
四、请求转发
使用请求转发来实现response.sendDedirect()方法效果
request一次请求有效时间是:未返回浏览器前
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<form action='/forward/servlet1' method='post'>");
out.println("用户名:<input type='text' name='username' value=''/>");
out.println("<input type='submit' value='提交'/>");
out.println("</form");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String username=request.getParameter("username");
//把username放入request域对象中
request.setAttribute("username", username);
//表示使用转向的方法,把request和response对象转向/servlet2
request.getRequestDispatcher("/servlet2").forward(request, response);
}
public class servlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String u=(String) request.getAttribute("username");
out.println("接收到的用户名为:"+u);
}
注意
①使用forward不能转到该web应用之外的URL
②因为forward是发生在web服务器,所以servlet1与servlet2使用的是同一个request和response
使用sendRedirect()方法不能通过request.setAttribute()把属性传递给下一个servlet
(因为已经返回给客户端,request不同)
sendRedirect()和forward的区别是什么?
①叫法不同,sendRedirect()重定向(转发),forward叫转发
②实际发生的位置不同
sendRedirect发生在浏览器
forward发生在web服务器
③用法不一样
request.getRequestDispatcher(“/servlet2”).forward(request, response);[]
response.sendRedirect(“/web应用/资源URI”);
④跳转范围不同
sendRedirect可以去任何的URL
forward只能当前的web应用的资源名
一次http请求?
只要没有停止,也没有回到浏览器重定向,一次http中可以有多个servlet forward
如果转发多次,浏览器地址栏保留的是第一次转向的servletURL