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地址的写法

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

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

Web开发之request的更多相关文章

  1. Vim下的Web开发之html,CSS,javascript插件

    Vim下的Web开发之html,CSS,javascript插件   HTML 下载HTML.zip 解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vi ...

  2. Web开发之Tomcat&Servlet

    <!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...

  3. 移动web开发之rem适配布局

    移动web开发之rem适配布局 方案: 页面布局文字能否随着屏幕大小变化而变化 流式布局和flex布局主要针对于宽度布局,那高度如何布局? 怎样让屏幕发生变化的时候元素高度和宽度等比例缩放? 1. r ...

  4. .NET Web开发之.NET MVC框架

    摘要:MVC是一种架构设计模式,该模式主要应用于图形化用户界面(GUI)应用程序.那么什么是MVC?MVC由三部分组成:Model(模型).View(视图)及Controller(控制器). MVC概 ...

  5. Web开发之Cookie and Session

    会话 什么是会话? 简单说:用户开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称之为一个会话. 会话过程要解决什么问题 每个用户在使用浏览器与服务器进行会话的过程 ...

  6. Web开发之response

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. 我们要获取客户机提交过来的数据,只需要找request对象就行 ...

  7. Web开发之tomcat配置及使用(环境变量设置及测试,一个简单的web应用实例)

    Tomcat的配置及测试: 第一步:下载tomcat,然后解压到任意盘符 第二步:配置系统环境变量 tomcat解压到的D盘 (路径为: D:\tomcat), 配置环境变量: 启动tomcat需要两 ...

  8. Java Web开发之Servlet、JSP基础

    有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发 ...

  9. Web开发之RSET API

    REST介绍 如果要说什么是REST的话,那最好先从Web(万维网)说起. 什么是Web呢?读者可以查看维基百科的词条(http://zh.wikipedia.org/zh-cn/Web),具体的我就 ...

随机推荐

  1. [BUUCTF]REVERSE——firmware

    firmware 附件 步骤: 检查文件没有看出什么,ida载入一堆乱码,看了其他师傅的wp才知道要先binwalk对文件进行提取 120200.squashfs这是一个linux的压缩文件 我们需要 ...

  2. CF616B Dinner with Emma 题解

    Content 翻译很明白,或者你也可以看我的简化版题意: 求一个 \(n\times m\) 的矩阵中每行的最小值的最大值. 数据范围:\(1\leqslant n,m\leqslant 100\) ...

  3. CF1099A Snowball 题解

    Content 有一个重量为 \(w\) 的雪球从高度为 \(h\) 的位置开始滚落,每秒它的高度会减少 \(1\),同时在高度为 \(i\) 的位置它的重量会增加 \(i\).在雪球滚动的路线上还有 ...

  4. CF1506A Strange Table 题解

    Content 给定一个 \(n\times m\) 的矩阵.一开始,\((1,1)\) 所在位置上面的数是 \(1\),随后先由上往下将这一列中的所有位置上面填上 \(2,3,\dots,n\),再 ...

  5. java 常用类库:String ; StringBuilder和StringBuffer类

    1. String 1.String对象是不可变的 String类的value属性是用来存放字符串里面的值的.这个属性是被final修饰的.final修饰的变量不能够被第二次赋值,所以字符串是不可变的 ...

  6. 七层LB-NGINX 客户端获取协议Proxy Protocol介绍

    协议诞生背景 在Web分布式系统中,一般会搭建复杂的load blance系统来提供高性能的web服务. 7层的SLB 有基于nginx/淘宝变种tengine的.后端RS会无法获取真实客户端IP. ...

  7. 【JAVA今法修真】 第六章 天道无情,锁定乾坤

    您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ...

  8. HDZ城市行深圳站|AIoT时代,如何抓住智联生活的战略机会点?

    摘要:2021年12月24日,HDZ城市行深圳站:AIoT引爆全场景应用新机会(智联生活专场)圆满落幕. 2021年12月24日,HDZ城市行深圳站:AIoT引爆全场景应用新机会(智联生活专场)圆满落 ...

  9. 【LeetCode】Swap Nodes in Pairs 解题报告

    Swap Nodes in Pairs [LeetCode] https://leetcode.com/problems/swap-nodes-in-pairs/ Total Accepted: 95 ...

  10. 【LeetCode】687. Longest Univalue Path 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetco ...