Web开发之request

request常用方法

//常用方法
//得到的是:协议+服务器地址+端口号+工程名称+资源地址+参数
String url = request.getRequestURL();
//得到的是:工程名称+资源地址
String uri = request.getRequestURI();
//得到的是:工程名称
String contextpath = request.getContextPath();
//得到的是:服务器的IP地址
String encoding = request.getCharacterEncoding();
//得到的是:服务器的端口号
int localport = request.getLocalPort();
//得到的是:客户端的ip
String remoteIp = request.getRemoteAddr();
//得到的是:客户端的端口号(随机的)
String remotePort = request.getRemotePort();
//请求参数
String query = request.getQueryString();
//请求方式
String method = request.getMethod();

获得请求头信息

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

//获取同名的请求头的多个值
Enumeration<String> enu = request.getHeaders("Accept-Encoding");
while(enu.hasMoreElements()){
    System.out.println(enu.nextElement());
}

//拿到所有的请求头和值
Enumeration<String> enu = request.getHeaderName();
while(enu.hasMoreElements()){
    String key = enu.nextElement();
    System.out.println(key + ":" + request.getHeader(key));
}

获取HTML中的控件信息

  • HTML页面:

    <form action="ServletRequest/servlet/TestRequest" method="post">
        姓名:<input type = "text" name = "username"><br>
        密码:<input type = "text" name = "password"><br>
        确认密码:<input type = "text" name = "password"><br>
        <input type = "submit" value = "提交">
    </form>
    
  • servlet:

    //1.获取单个控件的值
    public void test1(HttpServletRequest request){
        //当表单里没有填写内容时,获取到的是空字符串
        //当所填名字没有对应控件时,获取到的是null
        String name = request.getParameter("username");//参数是控件的名字
        System.out.println("姓名:" + name);
    }
    
    //2.获取同名控件的值
    public void test2(HttpServletRequest request){
        String[] pass = request.getParameterValues("password");
        for(String string:pass){
            System.out.println(string);
        }
    }   
    
    //3.获取所有控件的名字和值
    public void test3(HttpServletRequest request){
        Enumeration<String> enu = request.getParameterNames();
        While(enu.hasMoreElements()){
            String name = enu.nextElement();
            //由于名字可能会重复
            String[] values = request.getParameterValues(name);
            for(String value:values){
                System.out.println(name + ":" + request);
            }
        }
    }   
    
    //4.将表单中的所有值封装到javabean中:
    //  采用PropertyDescriptor
    
    • javaBean

      //实现序列化接口:表示其可以被序列化,让对象经过网络传输不会出错
      public class User implements Serializable{
          private String username;
          private String[] password;
      
          set,get...
          ...
          toString...
      }
      
    • servlet:

      public void test4(HttpServletRequest request){
          //将页面传递的内容封装到user对象中
          User user = new User();
          //获取所有控件的名字
          Enumeration<String> enu = request.getParameterNames();
          While(enu.hasMoreElements()){
              String name = enu.nextElement();
              //由于名字可能会重复
              String[] values = request.getParameterValues(name);
      
              //拿到属性name的属性描述器
              PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
              //将值注入到属性中
              //拿到写描述器
              Method method = pd.getWriterMethod();
              //为了兼容jdk1.4,sun开发的invoke方法在执行的时候将参数拆开进行传递,所以导致异常
              if(values.length == 1)
                  method.invoke(user,values);
              else{
                  //解决办法一:(底层的values已经不是一个数组了)
                  method.invoke(user, (Object}values);
                  //解决办法二:
                  method.invoke(user, new Object[]{values});
              }
          }
          System.out.println("封装后:" + user);
      }   
      
    //5.将表单中的所有值封装到javabean中:(其它代码同4,只改while中代码)
    //  采用第三方的jar进行封装:BeanUtils类(Spring框架里提供)
    While(enu.hasMoreElements()){
        String name = enu.nextElement();
        //由于名字可能会重复
        String[] values = request.getParameterValues(name);
    
        //采用BeauUtils类封装
        BeanUtils.setProperty(user,name,values);
    }
    
    //6.将表单中的所有值封装到javabean中:
    //  采用第三方的jar进行封装:BeanUtils类(Spring框架里提供)
    public void test6(HttpServletRequest request){
        //将页面传递的内容封装到user对象中
        User user = new User();
        //拿到控件的名字和值的键值对
        Map<String,String[]> map = request.getParameterMap();
        for(Map.Entry<String, String[]> entry:map.entrySet()){
            //拿到控件的名字
            String name = entry.getKey();
            //拿到控件的值
            String values = entry.getValue();
    
            //采用BeauUtils类封装
            BeanUtils.setProperty(user,name,values);
        }
    }
    
    //7.将表单中的所有值封装到javabean中:
    //  (推荐使用)
    public void test7(HttpServletRequest request){
        //将页面传递的内容封装到user对象中
        User user = new User();
    
        BeanUtils.populate(user, request.getParameterMap());
    
        System.out.println("封装后" + user);
    }
    

request中文乱码问题

//1.当提交方式为post时:
//  request.setCharacterEnconding("UTF-8");
request.setCharacterEnconding("UTF-8");
String name = request.getParameter("username");

get方式为什么会乱码:填写好传递数据之前,浏览器先用URLEncoder进行编码
在传输过程中,又用了ISO8859-1进行了一次编码

//2.当提交方式为get时:
//  重建字符串(适用于内容较少时)
request.setCharacterEnconding("UTF-8");
String name = request.getParameter("username");
name = new String(name.getBytes("ISO-8859-1"),"utf-8");
//当写中文较多的时候,采用更改服务器编码方法
//在server.xml中<Connector />中加一个
//URIENcoding = "UTF-8"
//当直接从地址栏中输入中文乱码时
String name = request.getParameter("username");
name = new String(name.getBytes("ISO-8859-1"));

request也是一个域对象(四大域对象之一)

域对象:底层一定有一个Map来存放键值对

  • ServletRequest1中

    request.setAttribute("name", "高圆圆");
    //请求转发器
    RequestDispatcher rd = request.getRequestDispatcher("/servlet/ServletRequest2");
    //转发到ServletRequest2中
    rd.forward(request, response);  //请求转发
    
    rd.include(request, response);  //把ServletRequest2包含进来
    
    //拿取ServletRequest2中存取的数据
    int age = (Integer)request.getAttribute("age");
    
  • ServletRequest2中

    String name = request.getAttribute("name");
    request.setAttribute("age",100);
    

request对象的请求转发和ServletContext对象的请求转发的区别

request对象的请求路劲支持相对路径
ServletContext对象的请求转发不支持相对路径
因为ServletContext是一个全局对象,它代表的是一个工程

封装表单中的数据(各种控件)

  • HTML页面

    <form action="/day09_01_httpServletRequest/servlet/ServletRequest6" method="post">
          姓名: <input type = "text" name = "username" ><br>
          密码:<input type = "text" name = "password" ><br>
          确认密码:<input type = "text" name = "password" ><br>
          性别: <input type = "radio" name = "gander" value = "男" >男<input type = "radio" name = "gander"     value = "女">女<br>
          爱好:<input type = "checkbox" name = "loves" value = "打篮球">打篮球
                <input type = "checkbox" name = "loves" value = "踢足球">踢足球
                <input type = "checkbox" name = "loves" value = "聊天">聊天<br>
         国籍: <select name = "country">
              <option value = "中国">中国</option>
              <option value = "美国">美国</option>
              <option value = "日本">日本</option>
         </select><br>
         备注: <textarea rows="5" cols="20" name = "description">大神留下脚印吧!!!</textarea><br>
        <!--  <input type = "submit" value = "提交" >  -->
        <input type = "button" value = "提交" onclick = "fun_submit()">
      </form>
    
    <script type="text/javascript">
        function fun_submit(){
            //数据检测
    
            //提交数据
            var form = document.forms[0];
            form.method = "post";
            form.submit();  
        }
    </script>
    
  • javaBean

    public class User implements Serializable{
        private String username;
        private String[] password;
        private String gander;
        private String[] loves;
        private String country;
        private String description;
    
        set,get...
        tostring...
    }
    
  • servlet中

    User user = new User();
    //将表单数据封装到user对象中
    BeanUtils.populate(user, request.getParameterMap());
    System.out.println("封装后:" + user);
    

请求重定向和请求转发的区别

//请求重定向到新的资源
//这个执行之后,request就不在这个servlet中了,死亡了,被重新定向到Servlet2了 。
//但是请求转发后request还存在
response.sendRedirect(request.getContextPath() + "/servlet/Servlet2");  

URL地址的写法

  • 客户端跳转:由客户端浏览器发出来的跳转(加工程名称)

  • 服务端跳转:由服务端发出的跳转(不加工程名称)

你可能感兴趣的:(request,web开发,url,HTML表单)