(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

posted @ 2017-08-29 20:07  测试开发分享站  阅读(200)  评论(0编辑  收藏  举报