zoukankan      html  css  js  c++  java
  • 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接口
    
  • 相关阅读:
    python:使用 watchdog 监控文件变化
    CSS 宽高度百分比加减像素的办法
    foxmail登陆失败LOGIN Login error user suspended
    IDEA 自动删除类中无用的import包
    CSS命名规范——BEM思想
    jQuery文件上传插件 uploadify 的使用
    textarea 固定大小,滚动条,限制拖动,文字对齐等
    命令行工具 Cmder 的使用与配置
    转:【MySQL】连接错误过多:is blocked because of many connection errors; unblock with 'mysqladmin flush-host
    OpenJFX的相关Maven依赖
  • 原文地址:https://www.cnblogs.com/codingpark/p/4232540.html
Copyright © 2011-2022 走看看