Web学习历程记录(九)——请求响应

Web学习历程记录(九)

案例一:完成文件下载

HttpServletReaponse概述
在Servlet API中,定义了一个HttpServletReaponse接口,它继承自SeveletResponse接口,专门用来封装HTTP响应消息
Http响应消息分为响应行,响应消息头,消息体三部分
对应的在该接口中定义了向客户端发送响应状态码、响应头、响应体的方法

操作响应三部分

操作响应行
一般是第一行

常用的状态码:
200:成功
302:重定向
304:访问缓存
404:客户端错误
500:服务器错误

操作响应头
一个key可以对应多个value,也可以对应一个value

掌握的方法:setHeader(String key,String value)

常用的响应头:
Refresh:定时跳动
Location:重定向
Content-Disposition:设置文件下载时候的头
Content-Type:设置响应内容的MIME类型

响应体

文件下载方式

第一种:超链接方式
直接将服务器上的文件的路径写到href属性中,如果浏览器不支持该格式文件,那么就会提示进行下载,如果浏览器支持这个格式的文件,那么直接打开,不再下载了

第二种:手动编码方式
手动编码实现下载,无论浏览器是否识别该格式,都会下载

手动编码格式要求
设置两个头和一个流
两个头:
Content-Dispostion:浏览器识别该格式文件,提示浏览器下载
Content-Type:文件类型(MIME类型)
一个流:
获得要下载的文件的输入流

import sun.misc.BASE64Encoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@WebServlet("/downloadServletDemo01")
public class DownloadServletDemo01 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        String fileName = request.getParameter("fileName");
        System.out.println("fileName = " + fileName);


        String realPath = getServletContext().getRealPath("/download/" + fileName);
        InputStream is = new FileInputStream(realPath);

        response.setHeader("Content-Disposition","attachment;filename=" + fileName);

        String mimeType = getServletContext().getMimeType(fileName);
        response.setHeader("Content-Type",mimeType);


        ServletOutputStream os = response.getOutputStream();
        byte[] bs = new byte[1024];
        int len;
        while ((len = is.read(bs))!= -1){
    
    
            os.write(bs,0,len);
        }
        os.close();
        is.close();

    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>文件下载</h1>
<h3>超链接方式</h3>
<!--超链接方式下载文件,直接将文件的路径写入到href中即可。但是如果浏览器支持文件格式(jpg,png)会直接打开,不会再进行下载-->
<a href="download/WEB01.zip">web01.zip</a><br/>
<a href="download/a.jpg">a.jpg</a>
<h3>编码方式</h3>
<a href="downloadServletDemo01?fileName=a.jpg">a.jpg</a><br/>
<a href="downloadServletDemo01?fileName=WEB01.zip">web01.zip</a><br/>
<a href="downloadServletDemo01?fileName=美女.jpg">美女.jpg</a>
</body>
</html>

Response其他操作

定时刷新

扫描二维码关注公众号,回复: 14869578 查看本文章
response.setHeader("refresh","秒数";url = 跳转的路径)//几秒之后跳转到指定的路径上
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    response.setContentType("text/html ;charset = utf-8");
    response.getWriter().write("5秒后跳转");
    response.setHeader("refresh", "5; url = http://www.baidu.com");
}

重定向
重定向是两次请求
重定向地址栏路径改变
重定向路径写绝对路径

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.getWriter().print("1");
        System.out.println("111");
        response.sendRedirect("http://localhost:8080/servletDemo02");
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.getWriter().print("222");
        System.out.println("2");
    }

向页面输出内容

response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type","text/html;charset=utf-8");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("你好".getBytes("utf-8"));

案例二:网站的登陆案例

request操作请求三部分

获取客户机信息(操作请求行)
请求方式 请求路径(url) 协议版本
POST /day17Request/WEB01/register.htm?username=zs&password=123456 HTTP/1.1

getMethod():获取请求方式
getRemoteAddr():获取客户机的IP地址
getContextPath():获得当前应用工程名
getRequestURI():获得请求地址,不带主机名
getRequestURL():获得请求地址,带主机名
getServerPort():获得服务端的端口
getQueryString();获得请求参数(get请求的,URL的?后面的 eg:username=zs&password=123456)

获得请求头信息(操作请求头)
getHeader(String name)
user-Agent:浏览器信息
Referer:来自哪个网站(防盗链)

接受相关参数(操作请求体)

String getParameter(String name)
获得指定参数对应的值,没有返回null,如果有多个则获得第一个
String[] getParameterValues(String name)
获得指定参数名对应的所有的值。此方法专业为复选框提供的
Map getParameterMap()
获得所有的请求参数

使用BeanUtils封装

设置一个登陆页面准备提交表单数据(username,password)
导入BeanUtils相关jar包
创建Servlet获取请求参数
调用BeanUtils.populate方法封装数据

总结

转发

request.getRequestDispatcher(url).forward(request,response);

转发和重定向区别:
转发是一次请求,重定向是二次请求
转发地址栏路径不变。重定向地址栏路径改变了
转发的路径只能写当前项目的内部路径,重定向可以内部可以外部
request域对象存取的值在转发中是有效的,在重定向无效

作为域对象存取值

ServletContext:范围 整个应用
request: 范围 一次请求有效
域对象是一个容器,这种容器主要用于Servlet与Servlet/JSP之间的数据传输使用的

猜你喜欢

转载自blog.csdn.net/qq_49658603/article/details/108392597