响应对象: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”)
二:案例--上传案例
上传的操作步骤:
- 借助表单form中的input类型为file的作为文件选取的载体!
- 表单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);
}
}