JavaWeb HttpServletRequest request对象

225 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

(1)通过request对象获取浏览器端相关的信息

		//1.获取浏览器端发送请求的完整路径;
		StringBuffer sbuf=request.getRequestURL();
		pw.println("url:"+sbuf);
		//System.out.println(sbuf);
		//2.获取资源名部分-请求路径中8080后的地址;
		String uri=request.getRequestURI();
		pw.println("uri:"+uri); 
		//3.获取请求路径中参数;
		String qs=request.getQueryString();
		pw.println("qs:"+qs);
		//4.获取请求路径中的ip地址;
		String ip=request.getRemoteAddr();
		pw.println("ip:"+ip);//ip=127.0.0.1
		//5.获取浏览器发送请求的方式(get请求、post请求)
		//在浏览器端,浏览器地址栏回车、超链接、表单的默认方式都是get请求方式
		//在浏览器端,表单设置method="post"的方式提交是post请求方式
		String method=request.getMethod();
		pw.println("method="+method);//method=GET
		//6.获取web应用名
		String cp=request.getContextPath();
		pw.println("cp="+cp);//cp=/servlet

(2)通过request对象获取请求参数 name=value

		1)getParameter(String name)  
		//根据参数中的name来获取value的值
		2)getParameterValues(String name)
		//该方法返回字符串数组String[]
		//通过name来获得多个value值的情况
		3)getParameterNames()
		//该方法返回Enumeration类型,理解为容器
		//获取所有的请求参数中的name值
		//接收表单提交发送过来的参数
		//获得单个value值
		String strName=request.getParameter("username");
		String strPwd=request.getParameter("pwd");
		pw.println("Name:"+strName+" Pwd:"+strPwd);
		//获得多个对应value值
		String[] strInterest=request.getParameterValues("interest");
		pw.println(Arrays.toString(strInterest));
		//获取请求参数中所有的name值
		Enumeration<String> names=request.getAttributeNames();
		pw.println(names);
		//使用循环将names中的内容取出
		while(names.hasMoreElements()){
			System.out.println(names.nextElement());
		}
	}

(3)通过request对象设置参数中的中文乱码问题

1)乱码产生的原因

浏览器端一般设置的编码使用utf-8编码,提交表单时使用的也是utf-8编码;tomcat服务器默认情况下是iso8859-1的编码,所以对于英文数字不受影响,但是iso8859-1中没有中文,所以会用?代替。

2)处理乱码的办法

(1)get请求的处理方式
	byte[] bs=xxStr.getBytes(“iso8859-1”);
	String str=new String(bs,”utf-8”);
(2)post请求的处理方式
	setCharacterEncoding(“utf-8”)
	//post请求方式中参数的中文编码设置
		//调出doGet方法
	protected void doGet(HttpServletRequest req,HttpServletResponse res)
			throws ServletException,IOException {
		//使用req接收请求参数
		String strName=req.getParameter("username");
		//处理中文乱发问题
		byte[] bs=strName.getBytes("iso8859-1");
		String name=new String(bs,"utf-8");
		System.out.println(name);
	}
	//调出doPost方法
	protected void doPost(HttpServletRequest req,HttpServletResponse res)
			throws ServletException,IOException {
		//设置请求参数中的编码
		req.setCharacterEncoding("utf-8");
		//使用req接收请求参数
		String strName=req.getParameter("username");
		System.out.println("strName");
	}

(4)通过request对象进行请求转发

1)概念:将未完成的工作交给下一个组件(servlet、jsp)继续完成。 转发是用来实现资源的跳转,浏览器地址栏不会发生变化。 Servlet--->Servlet 2)方法:

  		//获得转发器
   		//xx表示转发的下一个组件的地址
  		RequestDispatcher dis=request.getRequestDispatcher(“xx”)
   		//实现请求转发,请求和响应对象要最为参数设置进来
  		dis.forward(request,response);
     

(5)通过request对象请求转发—实现请求包含

1)方法

 		//获得转发器,指定转发的地址
 		RequestDispatcher rd=request.getRequestDispatcher(“xx”);
 		//实现请求包含的转发
 		rd.include(request,response);	

2)说明 请求包含的转发,会将当前响应结果和转达到xx地址以 后的响应结果,共同处理,一起响应给浏览器端。

(6)使用request作为域对象来使用

域对象:一个对象具有可以被看见的范围,可以存储资源从而实现资源的共享。

		//request作为域对象,一般和转发器一起使用。
		//往request域对象中存储数据
		request.setAttribute(String name, Object obj);
		//从request与对象中获取数据
		request.getAttribute(String name)
		//使用res获得输出流,向页面输出内容
		PrintWriter pw=res.getWriter();
		pw.println("demo1_servlet");
		//请求转发:由RequestDemo1转发到RequestDemo2
		//获得转发器
		RequestDispatcher rd=req.getRequestDispatcher("request2");
		//往request域对象中存储数据(Object)
		req.setAttribute("msg", "HELLO!");
		//请求转发
		rd.forward(req, res);
		//请求包含转发
		rd.include(req, res);
		//获得输出流,向页面输出内容
		PrintWriter pw=response.getWriter();
		pw.println("demo22222222");
		//从request域对象中获取数据
		String strMsg=request.getAttribute("msg").toString();
		pw.println(strMsg);