Servlet开发(三)Request对象常用方法、常见应用

(WEB学习笔记 二)
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。简而言之,Request对象是用来获取服务器端发送的各种数据。

一、Request常用方法

1、获得客户机信息

getRequestURL方法:返回客户端发出请求时的完整URL
getRequestURI方法:返回请求行中的资源名部分
getQueryString 方法:返回请求行中的参数部分
getPathInfo方法:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头
getRemoteAddr方法:返回发出请求的客户机的IP地址
getRemoteHost方法:返回发出请求的客户机的完整主机名
getRemotePort方法:返回客户机所使用的网络端口号
getLocalAddr方法:返回WEB服务器的IP地址
getLocalName方法:返回WEB服务器的主机名

具体函数使用以及运行后得到的结果示例如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

                //getRequestURL方法:返回客户端发出请求时的完整URL
                         System.out.println(request.getRequestURL());//http://localhost:8080/JavaServlet/RequestDemo3

                //getRequestURI方法返回请求行中的资源名部分                                                    System.out.println(request.getRequestURI()); //JavaServlet2/RequestDemo3

          //getQueryString 方法返回请求行中的参数部分
        //http://localhost:8080/JavaServlet/RequestDemo3?username=zhangsan
        System.out.println(request.getQueryString());  //username=zhangsan

        //getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
        //System.out.println(request.getPathInfo()); //null

         //getRemoteAddr方法返回发出请求的客户机的IP地址  
        System.out.println(request.getRemoteAddr());  //127.0.0.1

         //getRemoteHost方法返回发出请求的客户机的完整主机名    如果对应的ip地址有在dns注册那么返回的是地址www.163.com,如果没有则返回对应的ip的地址
        System.out.println(request.getRemoteHost());

         //getRemotePort方法返回客户机所使用的网络端口号
        System.out.println(request.getRemotePort());//远程端口号,不是服务器的端口号  57480

        System.out.println(request.getServerPort());//获取的服务器的端口号  8080

         //获取客户端请求的方法 GET POST方式
        System.out.println(request.getMethod());//GET

          //获取当前资源 
        System.out.println(request.getServletPath()); // /RequestDemo3

        //获取WEB服务器的主机名
        System.out.println(request.getLocalName());  //MS-20160306KAOF

    }

2、获得客户机请求头信息

getHeader方法(String):获取单个请求头信息
getHeaders方法 (枚举):获取所有的请求头中指定的某个头信息的全部内容
getHeaderNames方法 :获取全部的请求头信息

请求头信息示例:

            Accept  
            text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
            Accept-Encoding 
            gzip, deflate
            Accept-Language 
            zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
            Cache-Control   
            max-age=0
            Connection  
            keep-alive
            Cookie  
            JSESSIONID=8CCB5ACFDC24ABD3374D5E6F1BF396A5
            Host    
            localhost:8080
            User-Agent  
            Mozilla/5.0 (Windows NT 5.1; rv:46.0) Gecko/20100101 Firefox/46.0

具体示例代码:

public class RequestDemo1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

         //获取单个请求头信息
         String headValue=request.getHeader("Accept-Encoding");
         System.out.println(headValue);

        //获取所有的请求头指定的某个头信息的全部内容,Enumeration装的是指定的属性的全部的value值
         Enumeration en=request.getHeaders("Accept-Encoding");
         while(en.hasMoreElements()){
             String value=en.nextElement();
             System.out.println(value);
         }

       //获取全部的头信息   Enumeration装的是所有的key值
       en=request.getHeaderNames();         
       while(en.hasMoreElements()){
           String name=en.nextElement();//所有的key值
           String value =request.getHeader(name);//根据key值获取value值
           System.out.println("name="+name+"-----value="+value);
       }        
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }
}

3、获得客户机请求参数(客户端提交的数据)

getParameter方法:获取一个值
getParameterValues(String name)方法:获取一个数组
getParameterNames方法:枚举
getParameterMap方法:map集合

http://localhost:8080/JavaServlet/RequestDemo2?name=123&name=zhangsan ,?后即为请求参数


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //获取单个的请求参数信息   
        //http://localhost:8080/JavaServlet/RequestDemo2?name=123        
        String name = request.getParameter("name");
        System.out.println(name);

        //获取多个同名的参数 
        //http://localhost:8080/JavaServlet/RequestDemo2?name=123&name=zhangsan 
        String [] names = request.getParameterValues("name");
        for(String sname : names){
            System.out.println(sname);
        }

         //获取所有的请求参数
        //http://localhost:8080/JavaServlet/RequestDemo2?name=123&name=zhangsan     
         Enumeration<String> en =request.getParameterNames();
         while(en.hasMoreElements()){
             String key = en.nextElement();
             String vale=request.getParameter(key);
             System.out.println(key+"----"+vale);  //name----123 因为key值唯一,所以只有一个值
         }

         //获取请求参数 以map的形式保存
        //http://localhost:8080/JavaServlet/RequestDemo2?name=123&name=zhangsan&password=123456

        Map<String,Object> map = request.getParameterMap();     
         //对map迭代 获取所有的key 和value值
        for(Map.Entry<String, Object> me : map.entrySet()){         
            String name = me.getKey();
            String [] value = (String []) me.getValue();
            System.out.println(name+"---"+value[0]);  //name---123  password---123456
        }
}   

(注:浏览器访问网址http://localhost:8080/JavaServlet/RequestDemo2?name=123 ,?代表设置参数)

二、request常见应用

1、各种表单输入项数据的获取

各种类型的表单信息都可以获取,text、password、radio、checkbox、file、select、textarea、 hidden、image、button
如果我们建立了一个注册表单,则需要把先获取用户填写的注册信息,再保存到数据库以备调用

表单示例:


<html>
  <head>
    <title>form.htmltitle>
  head>  
  <body>
    
    <form action="/JavaServlet/RequestDemo4" method="post">
        
        用户名:<input type = "text" name="username"> <br/>
        密码:<input type="password" name="password"><br/>
        性别:<input type = "radio" name="gender" value = "male"><input  type="radio" name="gender" value="femal"><br/>     
        所在地:<select name="city">
            <option value="beijing">北京option>
            <option value="hangzhou">杭州option>
            <option value="shanghai">上海option>
        select><br/>
        爱好:<input type="checkbox" name="likes" value="single"/>唱歌
    <input type="checkbox" name="likes" value="dance"/>跳舞
    <input type="checkbox" name="likes" value="sleep"/>睡觉
    <input type="checkbox" name="likes" value="football"/>足球
    <br/>    
    备注:<textarea rows="5" cols="60" name="description">textarea><br/>
     大头照:<input type="file"  name="image">       
     <input type = "hidden" name = "id" value = "123456">
     <input type = "submit" value = "提交">     
    form>
  body>
html>

利用Request对象获取表单数据:
表单的数据都是请求参数,可以以请求参数的方式获取

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

         //表单的数据都是请求参数,可以以请求参数的方式获取
         String username =request.getParameter("username");
         String password = request.getParameter("password");
         String gender =request.getParameter("gender");
         String city =request.getParameter("city");
         String [] likes =request.getParameterValues("likes");
         String description=request.getParameter("description");
         String id=request.getParameter("id");

         //得到的数据封装到领域对象中传递到业务层  完成相关的操作         
            System.out.println("用户名是"+username+"密码是:"+password+"性别是:"+gender+"所在城市是:"+city+"描述是:"+description+"隐藏的id是:"+id);

            for (String ss : likes) {
                System.out.println("爱好是:"+ss);
            }           
    }

2、请求参数的中文乱码问题 (以表单输入为例)

这里分为post方式和get方式,两种提交方式的解决方法不一样

示例表单:


<html>
  <head>
    <title>form2.htmltitle>
  head>  
  <body>    
     <form action="/JavaServlet/RequestDemo5" method="post">
            用户名:<input type="text" name="username">
            <input type="submit" value="提交">
    form>    
    <form action="/JavaServlet/RequestDemo5" method="get">
            用户名:<input type="text" name="username2">
            <input type="submit" value="提交">
    form>
  body>
html>

1)解决post方式乱码 问题

解决post方式乱码,直接设置编码集即可

request.setCharacterEncoding("UTF-8");

2)解决get方式乱码

用户只能通过手动转换,把默认的编码集”ISO-8859-1”转换为我们所需要的编码集就可以了

String uname=new String(username.getBytes("ISO-8859-1"),"UTF-8");  
public void test1(HttpServletRequest request) throws IOException{   

         // 解决post方式乱码 直接设置编码集即可
        request.setCharacterEncoding("UTF-8");      
        String username = request.getParameter("username");
        System.out.println(username);
    }

     //解决get方式的乱码
    public void test2(HttpServletRequest request) throws IOException{  

        String username = request.getParameter("username2");
         String uname= new String(username.getBytes("ISO-8859-1"),"UTF-8");
         System.out.println(uname);
    }

3)如果是get方式乱码 ,还可以直接改变服务器的配置实现(不推荐使用)

打开 tomcat 安装目录 –> conf –> server.xml :
在下面代码中加入 URIEncoding=”UTF-8” 即可

<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443"
    URIEncoding="UTF-8"  
/>

你可能感兴趣的:(web)