JavaWeb之request/respone(四)

ServletResponse对象

简介

今天是JavaWeb入门第三天,代码量多了一些。今天学习的是Servlet引擎中两个对象,可能今天的理论知识不能掌握下来。我想说多敲代码,会有收获的。 学习原则不变,牢记知识点以及小案例应用,不断的练习代码。基础打扎实了,才能面对接下来的学习呀。不多说,练习咯~对现在的自己说一句话,加油~
1. ServletResponse简介
1). 辅助 servlet 将响应内容发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为参数传递给 servlet 的 service 方法
2). Http协议响应消息头--->面向对象的开发人员--->用对象封装所有的响应消息头及正文--->ServletResponse(与协议无关)--->HttpServletResponse(与协议相关)
用户第一次请求时,服务器要生成一个response对象,第二次访问时,也会生成一个新的对象
2. 如何将正文发送给客户端
2.1 如何获得字节流
	1) //得到用于发送字节流对象
	OutputStream os = response.getOutputStream();
	//发送字节流os.write("hello".getBytes());
	//输出中文问题,输出中文默认情况下没有乱码,可以改变服务器输出数据的编码格式
	//看到乱码,因为客户端还采用GBK显示,所以要用代码调整,客户端显示数据的编码
	<meta http-equiv="Content-Type" context="text/html;charset=UTF-8">
	response.setHeader("Content-Type", "text/html;charset=UTF-8");
	response.setContentType("text/html;charset=UTF-8");
	//解决服务器控制浏览器显示数据采用什么编码的最好的方法
	os.close();没有必要写,因为Servlet引擎会自动关闭
	
	2) 如何解决中文乱码
	//		第一种解决思路: meta标签
	//		os.write("<meta http-equiv='Content-Type' content='text/html;charset=GBK'>".getBytes());
	//		第二种解决思路: 采用response对象中加入响应消息头
	//		response.setHeader("Content-Type", "text/html;charset=UTF-8");
	//		第三种解决思路: setContentType();
			response.setContentType("text/html;charset=UTF-8");(推荐)
	总结:浏览器采用什么编码写出数据,必须相应的声明标头的编码格式		
2.2 如何以字符流输出
	PrintWriter pw = response.getWriter();
	默认输出数据用ISO-8859-1
	如何改变服务器向客户端输出数据的编码: response.seCharacterEncoding("UTF-8");
	通知客户端也要采用同样的编码显示 response.setContentType("text/html;charset=UTF-8");
	
	总结:对于服务器输出字符流数据是,只要就加上response.setContentType("text/html;charset=UTF-8");
	就不会有乱码问题,因为有两个作用
		1. 告知浏览器显示数据采用什么编码
		2. 服务器输出字符数据采用什么编码
3. URL写法总结
URL写法总结:
	给服务器用的,不需要写应用名	getServletContext().getRealPath("/WEB-INF/classes");
	给浏览器用的要写应用名 <a href="">	Location	<img src="">	<link href="">	<script src="">

 

ServletRequest对象

1. ServletRequest简介
1. 它是服务器提供的一个对象,用于封装客户端请求信息,并提供Servlet
2. 子接口	HttpServletRequest 它与协议相关
3. 为什么用它?
	作为面向对象的开发人员,想到用一个HttpServletRequest的对象来封装客户端
4. 什么情况下产生这个对象(它的生命周期)
	每次请求时,服务器都会产生一个新的request对象
2. 得到头信息常用的方法
getHead(name): 根据指定的名字,获取客户端发过来请求头所对应的值
	Accept-Encoding请求头用于告知服务器,客户端可以接收什么样的数据压缩格式
getHeaders(String name)根据指定的名字,获取客户端发过来请求头所对应的一组值
getHeaderNames()用于获取客户端发过来请求头所有值

String clientIP = request.getRemoteAddr();// 得到客户端ip
String clientHost = request.getRemoteHost();
String uri = request.getRequestURI();// 资源路径
StringBuffer url = request.getRequestURL();// 协议+主机地址+资源地址+端口号
System.out.println(clientIP + ">>" + clientHost + ">>" + uri + ">>");
System.out.println("协议+主机地址+资源地址+端口号: "+url.toString());

//有可能应用名与工程名不同名
System.out.println("动态获取应用名: " +request.getContextPath());	//动态获取应用名
System.out.println("得到客户端本次请求时使用的端口号:" +request.getRemotePort());//端口号每次请求时会不一样
3. 请求参数
<input type="text" name="username" />
String value = request.getParameter("username");//接收指定名称的一个值
//用于接收一个指定名字所对应的一组值
String[] getParameterValues(java.lang.String name)

Enumeration<String> paramNames = getParameterNames();//返回一个表单 中所有的请求参数名
Map map = getParameterMap();//返回 一个Map 集合   key:paramName   value:paramValues
为了简化封装参数的过程?引入一个框架BeanUtils
	1.框架的使用  
		1.1引入jar   (commons-beanutils--xxx.jar,commons-logging-xxx.jar)
		2.使用
			BeanUtils.setProperty(bean,propertyName,propertyValue);

3.请求过程中的乱码处理(post,get)
	1.post方式 
		request.setCharacterEncoding("UTF-8");
	2.get方式 
		String usernameValue = request.getParameter("username");//username 是为了要与文本框的name属性取值一样
		byte []oldStr = usernameValue.getBytes("iso-8859-1");//还原回去
		usernameValue = new String(oldStr,"UTF-8");

 

小知识点扫盲
*Serializable是专门用于实现序列化的
* 	实现了这个接口,意味着这个类是可以被序列化
* 	实现了这个接口,意味着可以在网络上直接传输对象
* 
* 什么是序列化?它支持一次性将一个对象存入到文件中
* 支持对象进行网络传输
* 
* JavaBean
* 	1. 是一个公有类
* 	2. 提供私有字段
* 	3. 对于这些私有字段,提供getter与setter
* 	4. 提供一个公有无参构造
* 	5. 一般实现Serializable接口

转载于:https://www.cnblogs.com/codingpark/p/4232540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值