HttpServletResponse和HttpServletRequest

HttpSevletResponse

service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口。


因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体

response:

响应行:

//1.响应行 - 状态码200 404 304 302 500
response.setStatus(304);

302 -> 重定向: 当前Servlet做完了,继续下一次任务,使用重定向

//response.setStatus(302);
		// location:url地址
		//response.setHeader("location", "/web02/Servlet1Demo");
		// 重定向最终代码,路径:绝对路径,从应用名开始
		response.sendRedirect("/web02/Servlet1Demo");
		response.getWriter().write("hello Bonnie...");

响应头:

response.addHeader(String name,String value);
response.setHeader(String name,String value);
//add与set的区别:add是新增一个值,不论之前有没有
				set是设置,如果之前有数据了,就覆盖原来的数据

响应体:

response.sendRediect("/web02/ServletDemo");// /应用名/资源名

网页打印:

response.getWriter().write("hello Bonnie...");

注意:1.字节流和字符流不能同时使用
2.通过response打开的流,不能手动关闭,tomcat会负责关闭
3.在创建字符流之前 设置response缓冲区编码//不普遍,否则中文会乱码

// OutputStream os = response.getOutputStream();
		// 设置response缓冲区编码 ISO8859-1
		// response.setCharacterEncoding("utf-8");
		// 设置响应类型 - 方式、编码
		response.setContentType("text/html;charset=utf-8");
		PrintWriter writer = response.getWriter();		
		// 写出到客户端 -> 页面
		writer.println("哈哈");
		writer.println("<br/>");
		writer.println("hello");

HttpServletRequest

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,所以我们学习HttpServletRequest。


因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行、请求头和请求体。

request:

HttpServletRequest -> ServletRequest
请求行:uri method
请求头:客户端信息 Map referer、user-agent
请求体:post参数
-----------------------post参数:form method = post
-----------------------get参数:其他情况下都是get,直接访问、超链接、重定向、form method=“get”
get/post 提交方式区别:
1.参数位置:
—get参数在url上
—post参数在请求体中
2.参数大小:
—get参数有大小限制
—post参数没有大小限制
3.参数格式:
—get参数格式只能是字符串
—post支持多种类型 - 文件
4.编码:
------------get 和tomcat编码一致 utf8
------------post ISO8859-1 - 不能改

请求行:

// 1.获得request行信息 method uri?get参数
// 	 GET/POST
String method = request.getMethod();
//2.URI/URL post/get获得内容一样
String requestURI = request.getRequestURI();
String requestURL = request.getRequestURL().toString();
//3.get提交方式的参数?后面部分 - 了解
// 	 post方式得到的是null
String queryString = request.getQueryString();

请求头:

// 1.获得request头信息 cookie referer
		String agent = request.getHeader("user-agent");
		// request.getLocalAddr();
		// 获得客户端地址
		String addr = request.getRemoteAddr();
		// referer:资源来源 - 通过哪里访问的
		String referer = request.getHeader("referer");

请求体:

		// 接收请求参数
		// 1.一个name对应一个value
		// radio 不选,获得null
		String gendar = request.getParameter("gendar");
		System.out.println("gendar: "  + gendar);
		
		// text/password/textarea/date  不填,获得 ""
		String name = request.getParameter("name");
		// ---- 解决乱码  get编码设置为ISO8859-1
		name = new String(name.getBytes("ISO8859-1"),"UTF-8");
		System.out.println("新name: " + name);
		// 2.一个name对应多个value [ check select ]
		String[] hobbies = request.getParameterValues("hobby");
		System.out.println("hobby: " + Arrays.toString(hobbies));

注意:get请求方式的请求参数,上述的方法一样可以获得。
解决post提交方式的乱码:

request.setCharacterEncoding("UTF-8");

解决get提交的方式的乱码:

parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
request域对象

request作为域对象使用:get/set/removeAttribute
域对象:ServletContext :服务器开始到结束
------------request:一次请求

应用:转发->同一次请求的跳转 forward
得到请求转发器,通过request转发,路径没有应用名,中间转发数次也只算同一次请求

getRequestDispatcher("/Servlet..").forward(request,response);

转发:通过request转发,我们可以认为转发的过程是同一个请求和响应,共用同一个request的map域,但是,本质而言是不同的对象
结论:直接接收请求的资源才可以使用getParameterXX方法;
--------转发的请求要获得参数,只能通过getAttribute方法
如果从前端得到id=1的值
在servlet1中可以得到getParameter(“id”)但是servlet2中不可以通过该方法获得此id

//Servlet1
ArrayList<String> list = new ArrayList<String>();
		list.add("hello");
		list.add("hi");
		//将数据存到request域中
		request.setAttribute("name","zld");
		request.setAttribute("list", list);
		//通过request转发
		request.getRequestDispatcher("/servlet2Demo").forward(request, response);
//Servlet2
//得到Demo1中存到request域中的内容
		response.getWriter().write(request.getAttribute("name").toString());
		response.getWriter().write(request.getAttribute("list").toString());

在这里插入图片描述

路径

客户端路径:

ip:port/appName/资源名
/appName/资源名 - 在同一个服务器中

服务器路径:

转发,应用内部转发 - 只能在同一个应用转发
在服务器端内部访问
默认当前同一个应用
/资源名 - 同一个应用中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值