(10A)HttpServletRequest:获取客户机信息、获取消息头信息、获取客户机请求参数、请求转发forward

来源:互联网 发布:oracle数据库教程pdf 编辑:程序博客网 时间:2024/06/06 20:10

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