zoukankan      html  css  js  c++  java
  • 2018年5月9日JAVA-servlet01

    request请求

    request概述

    request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。

    request的功能可以分为以下几种:

    l  封装了请求头数据;

    l  封装了请求正文数据,如果是GET请求,那么就没有正文;

    l  request是一个域对象,可以把它当成Map来添加获取数据;

    l  request提供了请求转发和请求包含功能。

    request域方法

    request是域对象!在JavaWeb中一共四个域对象,其中ServletContext就是域对象,它在整个应用中只创建一个ServletContext对象。request其中一个,request可以在一个请求中共享数据。

    一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据。现在我们还不知道如何在一个请求中经历几个Servlet,后面在学习请求转发和请求包含后就知道了。

    下面是request的域方法:


    l  void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

    l  Object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;

    l  void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;

    l  Enumeration getAttributeNames():获取所有域属性的名称;

    request获取请求头数据

    request与请求头相关的方法有:

    l  String getHeader(String name):获取指定名称的请求头;

    l  Enumeration getHeaderNames():获取所有请求头名称;

    l  int getIntHeader(String name):获取值为int类型的请求头。

    request请求相关方法

    request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法。

    l  int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;

    l  String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;

    l  String getMethod():返回请求方法,例如:GET

    l  Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;

    l  String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;

    l  void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!

    l  String getContextPath():返回上下文路径,例如:/hello

    l  String getQueryString():返回请求URL中的参数,例如:name=zhangSan

    l  String getRequestURI():返回请求URI路径,例如:/hello/oneServlet

    l  StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;

    l  String getServletPath():返回Servlet路径,例如:/oneServlet

    l  String getRemoteAddr():返回当前客户端的IP地址;

    l  String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;

    l  String getScheme():返回请求协议,例如:http;

    l  String getServerName():返回主机名,例如:localhost

    l  int getServerPort():返回服务器端口号,例如:8080

        System.out.println("request.getContentLength(): " + request.getContentLength());

        System.out.println("request.getContentType(): " + request.getContentType());

        System.out.println("request.getContextPath(): " + request.getContextPath());

        System.out.println("request.getMethod(): " + request.getMethod());

        System.out.println("request.getLocale(): " + request.getLocale());

           

        System.out.println("request.getQueryString(): " + request.getQueryString());

        System.out.println("request.getRequestURI(): " + request.getRequestURI());

        System.out.println("request.getRequestURL(): " + request.getRequestURL());

        System.out.println("request.getServletPath(): " + request.getServletPath());

        System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr());

        System.out.println("request.getRemoteHost(): " + request.getRemoteHost());

        System.out.println("request.getRemotePort(): " + request.getRemotePort());

        System.out.println("request.getScheme(): " + request.getScheme());

        System.out.println("request.getServerName(): " + request.getServerName());

        System.out.println("request.getServerPort(): " + request.getServerPort());

    案例:request.getRemoteAddr():封IP

      可以使用request.getRemoteAddr()方法获取客户端的IP地址,然后判断IP是否为禁用IP。

           String ip = request.getRemoteAddr();

           System.out.println(ip);

           if(ip.equals("127.0.0.1")) {

               response. getWriter().print("您的IP已被禁止!");

           } else {

               response.getWriter().print("Hello!");

           }

    request获取请求参数

    最为常见的客户端传递参数方式有两种:

    l  浏览器地址栏直接输入:一定是GET请求;

    l  超链接:一定是GET请求;

    l  表单:可以是GET,也可以是POST,这取决与<form>的method属性值;

    GET请求和POST请求的区别:

    l  GET请求:

    a.请求参数会在浏览器的地址栏中显示,所以不安全;

    b.请求参数长度限制长度在1K之内;

    c.GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

    l  POST请求:

    a.请求参数不会显示浏览器的地址栏,相对安全;

    b.请求参数长度没有限制;

        <a href="/hello/ParamServlet?p1=v1&p2=v2">超链接</a>

        <hr/>

        <form action="/hello/ParamServlet" method="post">

        参数1:<input type="text" name="p1"/><br/>

        参数2:<input type="text" name="p2"/><br/>

        <input type="submit" value="提交"/>

        </form>

    下面是使用request获取请求参数的API:

    l  String getParameter(String name):通过指定名称获取参数值;

        public void doGet(HttpServletRequest request, HttpServletResponse response)

               throws ServletException, IOException {

           String v1 = request.getParameter("p1");

           String v2 = request.getParameter("p2");

           System.out.println("p1=" + v1);

           System.out.println("p2=" + v2);

        }

       

        public void doPost(HttpServletRequest request, HttpServletResponse response)

               throws ServletException, IOException {

           String v1 = request.getParameter("p1");

           String v2 = request.getParameter("p2");

           System.out.println("p1=" + v1);

           System.out.println("p2=" + v2);   

        }

    l  String[] getParameterValues(String name):当多个参数名称相同时,可以使用方法来获取;

    <a href="/hello/ParamServlet?name=zhangSan&name=liSi">超链接</a>

        public void doGet(HttpServletRequest request, HttpServletResponse response)

               throws ServletException, IOException {

           String[] names = request.getParameterValues("name");

           System.out.println(Arrays.toString(names));

        }

    l  Enumeration getParameterNames():获取所有参数的名字;

        <form action="/hello/ParamServlet" method="post">

        参数1:<input type="text" name="p1"/><br/>

        参数2:<input type="text" name="p2"/><br/>

        <input type="submit" value="提交"/>

        </form>

        public void doPost(HttpServletRequest request, HttpServletResponse response)

               throws ServletException, IOException {

           Enumeration names = request.getParameterNames();

           while(names.hasMoreElements()) {

               System.out.println(names.nextElement());

           }

        }

    l  Map getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String。

    <a href="/day05_1/ParamServlet?p1=v1&p1=vv1&p2=v2&p2=vv2">超链接</a>

           Map<String,String[]> paramMap = request.getParameterMap();

           for(String name : paramMap.keySet()) {

               String[] values = paramMap.get(name);

               System.out.println(name + ": " + Arrays.toString(values));

           }

    p2: [v2, vv2]

    p1: [v1, vv1]

    请求转发和请求包含

    无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

    请求转发

    在AServlet中,把请求转发到BServlet:

    public class AServlet extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response)

               throws ServletException, IOException {

           System.out.println("AServlet");

           RequestDispatcher rd = request.getRequestDispatcher("/BServlet");

           rd.forward(request, response);

        }

    }

    public class BServlet extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response)

               throws ServletException, IOException {

           System.out.println("BServlet");

        }

    }

    Aservlet

    BServlet

    请求包含

    在AServlet中,把请求包含到BServlet:

    public class AServlet extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response)

               throws ServletException, IOException {

           System.out.println("AServlet");

           RequestDispatcher rd = request.getRequestDispatcher("/BServlet");

           rd.include(request, response);

        }

    }

    public class BServlet extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response)

               throws ServletException, IOException {

           System.out.println("BServlet");

        }

    }

    Aservlet

    BServlet

    请求转发与请求包含比较

    l  如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;如果是使用请求包含,那么没有这个限制;

    l  请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);

    l  请求包含大多是应用在JSP页面中,完成多页面的合并;

    l  请求请求大多是应用在Servlet中,转发目标大多是JSP页面;

     

    请求转发与重定向比较

    l  请求转发是一个请求,而重定向是两个请求;

    l  请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;

    l  请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;

    l  请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;

    重定向的第二个请求一定是GET(超链接都是GET请求);
  • 相关阅读:
    例题6-8 Tree Uva548
    例题6-7 Trees on the level ,Uva122
    caffe Mac 安装
    Codeforces Round #467 (Div. 1) B. Sleepy Game
    Educational Codeforces Round37 E
    Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons
    Good Bye 2017 E. New Year and Entity Enumeration
    Good Bye 2017 D. New Year and Arbitrary Arrangement
    Codeforces Round #454 D. Seating of Students
    浙大紫金港两日游
  • 原文地址:https://www.cnblogs.com/jason111/p/9054582.html
Copyright © 2011-2022 走看看