Servlet的request学习笔记

Posted Soe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet的request学习笔记相关的知识,希望对你有一定的参考价值。

1.Request的常用方法

  1、请求行  

Get  http://localhost:8080/day09/servlet/req1?username=zs  http/1.1

getMethod(); 获得请求方式

getRequestURL();返回客户端发出请求时的完整URL

getRequestURI(); 返回请求行中的资源名部分。

getContextPath(); 当前应用的虚拟目录 /day09_01_request

getQueryString() ; 返回请求行中的参数部分。

  2、请求消息头

   String   getHeader(String name)  根据头名称得到头信息值

   Enumeration   getHeaderNames()  得到所有头信息name

   Enumeration   getHeaders(String name)  根据头名称得到相同名称头信息值

3、请求正文(重要)

  与获取表单数据相关的方法

      <input type="text" name="username" />

 getParameter(name) 根据表单中name属性的名,获取value属性的值方法

 getParameterValuesString name)专业为复选框取取提供的方法

                      getParameterNames() 得到表单提交的所有name的方法

       getParameterMap 到表单提交的所有值的方法   //做框架用,非常实用

       getInputStream  以字节流的方式得到所有表单数据

与操作非表单数据相关的方法(request也是一个域对象)

void setAttribute(String name, Object value);

Object getAttribute(String name);

Void removeAttribute(String name);

 

与请求转发相关的方法

//得到请求转发或请求包含的协助对象

RequestDispatcher getRequestDispatcher(String path)

forward(ServletRequest request, ServletResponse response) //转发的方法

include(ServletRequest request, ServletResponse response) //请求包含

 

与请求编码相关的方法:

//解决post方式编码

request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式 

//解决get方式编码

String name = new String(name.getBytes(iso-8859-1),UTF-8);

2.Request取一些网址和请求方式

1 System.out.println(request.getMethod());            //请求方式
2 System.out.println(request.getRequestURL());        //请求完整网址
3 System.out.println(request.getRequestURI());        //请求的资源网址
4 System.out.println(request.getContextPath());        //请求的资源名
5 System.out.println(request.getQueryString());        //请求的参数列表

3.Request取得传过来的头部信息

1     Enumeration names = request.getHeaderNames();
2     while(names.hasMoreElements()) {
3         //获取所有的头部信息    
4         String name = (String) names.nextElement();
5         System.out.println(name+":"+request.getHeader(name));
6     }    
1     //获取单个头部信息
2     System.out.println(request.getHeader("user-agent"));

4.Request的4种取得表单数据的方法

 1     private void demo1(HttpServletRequest request) {
 2                 //第一种方式,分别单独获取
 3         String userName = request.getParameter("userName");
 4         String password = request.getParameter("password");
 5         String gender = request.getParameter("gender");
 6                 //复选的要用数组接受,用getParameterValues()
 7         String[] hobby = request.getParameterValues("hobby");
 8         String city = request.getParameter("city");
 9         
10         System.out.println(userName);
11         System.out.println(password);
12         System.out.println(gender);
13         for (int i = 0; hobby!=null && i < hobby.length; i++) {
14             System.out.println(hobby[i]);
15         }
16         System.out.println(city);
17     }
 1     private void demo2(HttpServletRequest request) {
 2         //第二种方式,先获取遍历名字,再分别找到
 3         Enumeration data = request.getParameterNames();
 4         while(data.hasMoreElements()){
 5             String str = (String) data.nextElement();
 6             String[] user = request.getParameterValues(str);
 7             System.out.print(str+"\t");
 8             for (int i = 0; user!=null && i < user.length; i++) {
 9                 System.out.print(user[i]);
10             }
11             System.out.println();
12         }
13     }
 1     private void demo3(HttpServletRequest request) {
 2         //第三种方式并存入User对象中
 3         Map<String,String[]> map = request.getParameterMap();
 4         User user = new User();
 5         System.out.println(user);
 6         for (Entry<String, String[]> data : map.entrySet()) {
 7             String key = data.getKey();
 8             String[] value = data.getValue();
 9             try {
10                 //使用了内省
11                 PropertyDescriptor pd = new PropertyDescriptor(key, user.getClass());
12                 //得到相应的set方法
13                 Method setter = pd.getWriteMethod();
14                 if(value.length == 1) {
15                     //使用invoke执行相应的方法并指定参数
16                     setter.invoke(user, value[0]);
17                 } else {
18                     //把数组当成一个完整参数传入
19                     setter.invoke(user, (Object)value);
20                 }
21             } catch (Exception e) {
22                 // TODO Auto-generated catch block
23                 e.printStackTrace();
24             }
25         }
26         System.out.println(user);
27     }
        User user = new User();
        //使用了导入的commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar
        BeanUtils bu = new BeanUtils();
        try {
            //自动的将表单的数据按照map集合demo3的那种形势set入user
            bu.populate(user, request.getParameterMap());
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        }

使用以上方法如果发过来有中文记得让服务器改变编码

!!!!!!!!!!  使用request.setCharacterEncoding("UTF-8");  

5.Request的请求转发

  1.非表单数据如何转发

     在request对象内部维护了一个map集合(类似于HttpServlet中的this.ServletContext)有setAttribute()和getAttribute()和RemoveAttribute()方法  

1        //带非表单数据转发
2         request.setAttribute("name", "张三");
3         request.getRequestDispatcher("/servlet/RequestDemo6").forward(request, response);
4
5     // /servlet/RequestDemo6中取得数据
6     String s = (String) request.getAttribute("name");

 

   2.请求转发和请求包含

     很简单就用代码演示了

      请求包含

     request.getRequestDispactcher(目标地址).include(request,response);    //请求包含等同于把另一个Servet的代码拿了过来

      请求转发

     request.getRequestDispactcher(目标地址).include(request,response);    //请求转发是把request和response传过去

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

   转发 1.request 由服务器执行

    2.客户端只发送一次请求

    3.地址栏不变

    4.转发能够传递数据

    5.转发也是一个域对象

    servletContxt

    重定向 1.response 由客户端执行

    2.客户端发送两次请求

    3.地址栏会发生变化

    4.不能传递数据

    5.可以跳转到其它应用

6.Request总结 

   解决post直接用setCharacterEncoding就行了,但是get方式传递的中文还是乱码,解决方式用new                  String(name.getByte("ISO-8859-1"),"UTF-8");

   

1、请求行  

Get  http://localhost:8080/day09/servlet/req1?username=zs  http/1.1

getMethod(); 获得请求方式

***getRequestURL();返回客户端发出请求时的完整URL

***getRequestURI(); 返回请求行中的资源名部分。

*****getContextPath(); 当前应用的虚拟目录 /day09_01_request

getQueryString() ; 返回请求行中的参数部分。

2、请求消息头

 * String   getHeader(String name)  根据头名称得到头信息值

 Enumeration   getHeaderNames()  得到所有头信息name

 Enumeration   getHeaders(String name)  根据头名称得到相同名称头信息值

3、请求正文(重要)

与获取表单数据相关的方法

<input type="text" name="username" />

*** getParameter(name) 根据表单中name属性的名,获取value属性的值方法

*** getParameterValuesString name)专业为复选框取取提供的方法

                getParameterNames() 得到表单提交的所有name的方法

*** getParameterMap 到表单提交的所有值的方法   //做框架用,非常实用

getInputStream  以字节流的方式得到所有表单数据

与操作非表单数据相关的方法(request也是一个域对象)

*** void setAttribute(String name, Object value);

*** Object getAttribute(String name);

Void removeAttribute(String name);

 

与请求转发相关的方法

//得到请求转发或请求包含的协助对象

RequestDispatcher getRequestDispatcher(String path)

*** forward(ServletRequest request, ServletResponse response) //转发的方法

include(ServletRequest request, ServletResponse response) //请求包含

 

与请求编码相关的方法:

//解决post方式编码

*****request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式

 

//解决get方式编码

String name = new String(name.getBytes(iso-8859-1),UTF-8);

以上是关于Servlet的request学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Servlet的request学习笔记

JSP学习笔记 - 内置对象 Request

JSP 学习笔记

JSP九大内置对象与Servlet学习笔记[转]

JavaWeb学习笔记之Servlet九大内置对象

XMLJspServlet基础学习笔记