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. [HarekazeCTF2019]baby_rop

    看到名字就想到了用rop来做这道题 老样子chescksec和file一下 可以看到是64位的程序开启了nx保护,把程序放到idax64里 可以看到有system和/bin/sh,/bin/sh无法跟 ...

  2. Java中List排序的3种方法

    在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作.比如从第三方接口中获取所有用户的列表,但列表默认是以用户编号从小到大进行排序的,而我们的系统需要按照用户的年龄从大到小进 ...

  3. C51单片机0~60计数器

    源码 #include<reg51.h> unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, ...

  4. 年度最受欢迎的开源CHROME插件

    又到了年底,时间过得飞快,每到年底就有各种各样的总结各种各样的奖项出来.前几天谷歌就公布了2021年年度最受欢迎Chrome插件名单,名单共有13个. 让很多网友费解的是,其中有很多并不是今年刚出现的 ...

  5. 云主机tracert外网无返回需在安全组入方向加ICMP Time Exceeded TTLexpired in transit

  6. maven打包 运行出现 错误: 找不到或无法加载主类 jar

    使用maven进行打包成jar包后 使用java -jar运行jar包 出现 错误: 找不到或无法加载主类 jar 主要是由于依赖没下载好,重新下载依赖 以及要在项目的pom.xml里面添加 < ...

  7. CMake判断操作系统和编译器

    判断操作系统 IF (CMAKE_SYSTEM_NAME MATCHES "Linux") ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Wind ...

  8. 【LeetCode】235. Lowest Common Ancestor of a Binary Search Tree 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 [LeetCode] https://leet ...

  9. 【LeetCode】554. Brick Wall 解题报告(Python)

    [LeetCode]554. Brick Wall 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...

  10. 『动善时』JMeter基础 — 60、固定吞吐量测试

    目录 1.定时器介绍 2.固定吞吐量定时器介绍 3.固定吞吐量定时器界面说明 4.固定吞吐量定时器的使用 (1)测试计划内包含的元件 (2)登陆请求内容 (3)固定吞吐量定时器内容 (4)线程组元件内 ...