Servlet进阶:响应对象和请求对象

响应对象:HttpServletResponse

   响应行

   响应头

   响应体

一:响应对象的作用

         针对请求完成数据的响应向页面输出信息,包括文本,图片,视频,音频等。

二:响应头信息

          content-type: 本次响应的数据类型是哪种类型

                                 大类型/小类型:(例) text/html        video/mp4           image/jpg

          (但是要注意,如果是文本类型,则必须制定编码格式,但是二进制字节数据不需要制定) 

         content-length:本次响应的内容的字节长度

         date:本次响应完成的时间

         content-disposition:告知浏览器以下载的形式保存响应的数据,下载就需要指定这个响应头消息。

         refresh:定时刷新,可以实现页面跳转的延迟执行。 

三:如何设置响应头消息

setHeader("响应头的关键字","值")

addHeader("响应头的关键字","值")

区别:setHeader方法一个关键字只能对应一个值,如果设置了多个值则覆盖

           addHeader方法一个关键字可以对应多个值

注意:在以后的开发过程中,我们只可能一个响应头关键字对应一个值,所以这两个方法也就没有区别了。

四:案例

1.响应头案例:响应图片

思路:
        1.先在WebContent目录下,创建一个资源文件夹source,里面存放一张照片
        2.Servlet内部通过content-type响应头,指定当前响应的数据类型为图片类型
        3.边读边写

html部分:

<h3>响应头案例:图片响应</h3>
<a href="showImage">图片</a>

web.xml部分:

<servlet>
   <servlet-name>ShowImageServlet</servlet-name>
  <servlet-class>com.offcn.servlet.ShowImageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>ShowImageServlet</servlet-name>
  <url-pattern>/showImage</url-pattern>
  </servlet-mapping>
   <servlet>

servlet部分:

public class ShowImageServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*思路:
		1.先在WebContent目录下,创建一个资源文件夹source,里面存放一张照片
		2.Servlet内部通过content-type响应头,指定当前响应的数据类型为图片类型
		3.边读边写*/
		
		//指定响应数据类型为图片
		response.setHeader("content-Type", "image/jpg");
		//创建一个输入流去读取图片
		InputStream iStream = this.getServletContext().getResourceAsStream("source/蓝湛.jpg");
		//创建一个输出流去响应图片
		ServletOutputStream oStream = response.getOutputStream();
		//边读边写
		byte bytes[] = new byte[1024];
		int len;
		while((len=iStream.read(bytes))!=-1) {
			oStream.write(bytes, 0, len);
		}
		//关闭资源
		oStream.close();
		iStream.close();		
	}
}

2.响应头案例:下载

思路:
      1.在页面中提供文件下载的连接,请求Servlet并传递文件名
      2.新建Servlet,完成注册及路径绑定
      3.在Servlet内部获取到下载的文件名
      4.指定Content-Disposition的响应头消息
      5.边读边写
      6.针对中文文件名做编码处理

html部分:

<h3>请求Servlet完成文件下载</h3>
<!--    ?在一个url中的作用是分隔url主体以及参数的
                   ?前面是url主体,?后面是参数
                    参数与参数之间使用&分隔
                    每一组参数内,参数名=参数值
     
     download是Servlet的访问路径
            ?是分隔符
     filename是文件名的数据关键字
 -->

<a href="download?filename=蓝湛.jpg">蓝湛.jpg</a>
<a href="download?filename=c3p0.properties">c3p0.properties</a>
<a href="download?filename=jdk api 1.8.CHM">jdk api 1.8.CHM</a>

web.xml部分:

 <!-- Servlet类的注册 -->
  <servlet>
   <servlet-name>DownloadServlet</servlet-name>
  <servlet-class>com.offcn.servlet.DownloadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>DownloadServlet</servlet-name>
  <url-pattern>/download</url-pattern>
  </servlet-mapping>

servlet部分:

public class DownloadServlet extends HttpServlet{
   
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//a标签的请求方式默认为get,所以此时下载的文件名不需要处理中文乱码
		String filename = request.getParameter("filename");
		System.out.println(filename);
		
		/*
		 *如果在浏览器中想要以下载的方式保存后台Servlet响应的数据
		 *那么必须借助一个响应头消息Content-Disposition
		 *告知浏览器,要将响应的数据,保存到下载后的附件中
		 *attachment代表附件,就相当于将内容响应到附件中,就是下载
		 *filename关键字代表附件的文件名,此关键字不能变!
		 *额外注意中文文件下载时,在浏览器附件中为了显示中文,要进行编码转换 
		 */
		response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes("utf-8"),"iso8859-1"));
		
		//边读边写
		
		//创建一个输入流去读取
		InputStream iStream = this.getServletContext().getResourceAsStream("source/"+filename);
		//创建一个输出流去响应
		ServletOutputStream oStream = response.getOutputStream();
		
		byte bytes[] = new byte[1024];
		int len;
		while((len=iStream.read(bytes))!=-1) {
			oStream.write(bytes,0,len);
		}
		
		//关闭资源
		oStream.close();
		iStream.close();
	}

}

3.响应体案例:响应一个表格在显示页面

a.只要涉及到数据的响应,第一步都是指定内容类型

 b.获取response对象自带的输出流,完成表格的响应

  因为表格是文本,所以使用PrintWriter完成响应

public class ResponseBodyServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		 	1、只要涉及到数据的响应,第一步都是指定内容类型
		 	2、获取response对象自带的输出流,完成表格的响应
		 		因为表格是文本,所以使用PrintWriter完成响应
		 */
		response.setHeader("Content-Type", "text/html;charset=utf-8");
		PrintWriter writer = response.getWriter();
		writer.write("<table bordercolor=\"blue\" align=\"center\" height=\"400\" width=\"600\" border=\"\" cellspacing=\"0\" cellpadding=\"10\">\r\n" + 
				"			<caption>学生信息表</caption>\r\n" + 
				"			<tr>\r\n" + 
				"				<th>姓名</th>\r\n" + 
				"				<th>性别</th>\r\n" + 
				"				<th>爱好</th>\r\n" + 
				"				<th>学历</th>\r\n" + 
				"			</tr>\r\n" + 
				"			<tr align=\"center\">\r\n" + 
				"				<td bgcolor=\"pink\">史特</td>\r\n" + 
				"				<td>男</td>\r\n" + 
				"				<td>跑步羽毛球</td>\r\n" + 
				"				<td rowspan=\"2\">本科</td>\r\n" + 
				"			</tr>\r\n" + 
				"			<tr>\r\n" + 
				"				<td align=\"right\">刘莹</td>\r\n" + 
				"				<td>女</td>\r\n" + 
				"				<td>唱跳rap篮球</td>\r\n" + 
				"			</tr>\r\n" + 
				"			<tr>\r\n" + 
				"				<td colspan=\"2\">\r\n" + 
				"					<font size=\"6\" color=\"greenyellow\">陈虎妖</font>\r\n" + 
				"				</td>\r\n" + 
				"				<td>泰国走一圈</td>\r\n" + 
				"				<td>专科</td>\r\n" + 
				"			</tr>\r\n" + 
				"		</table>");
	}
}

 

请求对象:HttpServletRequest

   请求行

   请求头

   请求体

一:中文乱码的处理

get请求:

tomcat8.0及8.0之后自动处理了中文乱码

tomcat8.0之前,也需要手动处理编码格式

new String(username.getBytes(iso8859-1), utf-8);

post请求:

无论哪一个tomcat版本都没有自动处理中文乱码,所以我们需要在获取数据之前

request.setCharacterEncoding(utf-8)

二:案例--上传案例

上传的操作步骤:

  1. 借助表单form中的input类型为file的作为文件选取的载体!
  2. 表单form的提交方式必须为post,而且必须为表单设置一个enctype属性的值为multipart/form-data!!!

     3.为了能够在处理上传的Servlet中可以拿到二进制的数据,又可以拿到文本数据,必须在Servlet类上添加一个              @MultipartConfig的注解!!!

4.上传的目的:

a、拿到上传的文件名称

b、将上传的文件内容写入到一个指定的文件夹中生成文件

html部分:

<form action="upload" method="post" enctype="multipart/form-data">
请选择上传的文件:<input type="file" name="file"/><br/>
<input type="submit" value="上传"/>
</form>

web.xml部分:

 <servlet-name>UploadServlet</servlet-name>
  <servlet-class>com.offcn.servlet.UploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>UploadServlet</servlet-name>
  <url-pattern>/upload</url-pattern>
  </servlet-mapping>

servlet部分:

@MultipartConfig
public class UploadServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		System.out.println(request.getParameter("username"));
		/*
	 	request.getPart("文件域的关键字") ==> Part
	 	Part对象中保存的就是上传的文件内容!
	    */	
		Part part = request.getPart("file");
		//1.从Part中获取到上传的文件名
		String filename = part.getSubmittedFileName();
		//2.将Part对象中保存的上传文件内容,生成一个新的文件
		String dirPath="E:/source";
		File file = new File(dirPath);
		if(!file.exists()) {
			file.mkdirs();
		}
		part.write(dirPath+"/"+filename);
	}

}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值