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属性的值方法
getParameterValues(String 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属性的值方法
*** getParameterValues(String 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学习笔记的主要内容,如果未能解决你的问题,请参考以下文章