请求转发和动态包含/生成响应信息/响应头/重定向/输出流

请求转发和动态包含

  • 请求转发 request.getRequestDispatcher(“新页面地址”).forward(request,response);
  • 动态包含 request.getRequestDispatcher(“新页面地址”).include(request,response);
    转发或者包含的地址要求:
  • 地址应该位于当前应用范围内,不能是其它应用中地址

request.getRequestDispatcher(“https://www.baidu.com”).forward(request,response); 执行会有报错 HTTP Status 404 - /pp/https:/www.baidu.com ,这是在请求转发时会在地址上自动附加当前应用的路径 http://localhost:9090/pp/

  • 允许在请求转发的地址中包含额外附加的请求参数

request.getRequestDispatcher(“add2.do?id=100”).forward(request,response);请求当前页面的参数仍旧存在。如果参数名称一致,则时附加,也就是名称相同的多个参数如果昂前页面的请求方法为post,请求转发请求方法仍旧为post

  • 除了parameter还可以使用attribute传递数据

原因是共享request

其它方法

获取客户端的地址

  • request.getRemoteAddr():String
//获取远程客户端的IP地址
System.out.println(request.getRemoteAddr());
stem.out.println(request.getRemoteHost());
//获取远程客户端的连接端口号
System.out.println(request.getRemotePort());
//获取服务器的IP地址
System.out.println(request.getLocalAddr());
//获取本地机的主机名称
System.out.println(request.getLocalName());
//获取本地机的连接端口号
System.out.println(request.getLocalPort());
//获取服务器的信息
System.out.println(request.getServerName());
System.out.println(request.getServerPort());

问题:IP地址定位
IPv4的地址采用的是4位点分十进制的计法,例如192.168.123.4。如果需要进行范围判断,建议将4位点分十进制的计法的字符串当作一个256进制的整数,可以转换为long类型数据进行存储

String ss="192.168.123.4";
long res=0;
String[] arr=ss.split("[.]");
for(int i=0;i<arr.length;i++){
int kk=Integer.parseInt(arr[i]);
res=res*256+kk;
}
System.out.println(res);

获取请求地址相关信息

//String统一资源标识符 /pp/add.do
System.out.println(request.getRequestURI());
//StringBuffer统一资源定位器 http://localhost:9090/pp/add.do
System.out.println(request.getRequestURL());
//获取上下文路径 /pp
System.out.println(request.getContextPath());
//获取请求参数 对应get请求时?号后面的内容,例如id=999。如果没有请求参数或者post参数则为
null
System.out.println(request.getQueryString());

流式处理

  • request.getReader():BufferredReader
  • request.getInputStream():ServletInputStream
    使用输入流的方式处理请求信息仅仅用于文件上传。具体的上传处理中一般建议优先考虑使用上传组件。
    例如 jspsmartupload和apache的commons-fileupload
    上传处理的要点
  • <form method="post" enctype="multipart/form-data">
  • <input type="file" name="pic"/>
  • 根据不同的上传组件接收提交数据
    • 一般默认上传文件的最大大小为2MB,如果文件超大一般建议使用ftp类型的工具,而不建议使用页面上传

//获取http请求方法,例如GET/POST/DELETE等
String method=request.getMethod();

生成响应信息

针对客户端请求的响应对象为response,类型HttpServletResponse。
response.reset() 重置response对象
resetBuffer() 重置缓冲区,将缓冲区中的内容送往客户端,同时清空缓冲区
setContentType(“MIME格式”) 设置响应内容类型,告知浏览器如何处理响应信息

response.setContentType("image/jpeg"); 如果是html页面则为
text/html;charset=UTF-8

响应头

可以通过response.setHeader设置响应头,传递到浏览器,以控制浏览器的缓存

// 关闭浏览器缓存
response.setHeader("pragma","no-cache"); //可以用于http1.0/1.1
response.setHeader("cache-control","no-cache");//用于http1.1
//设置缓存过期时间
response.setDateHeader("expires",0L);//过期时间使用毫秒时,例如new
Date().getTime()+1000*60 从现在开始60秒后过期
setIntHeader用于配置响应头值为int类型
addHeader/addIntHeader/addDateHeader
getHeader/getHeaderNames/getHeaders

补充:客户端避免缓存问题

<body οnlοad="ff()">
<img id="img1" οnclick="dd()"/> 看不清楚,点击图片
<script>
function ff(){
var img1=document.getElementById("img1");
img1.src="images/pic.do?q="+Math.random();
}
function dd(){
ff();
}
</script>

重定向

response.sendRedirect("新地址");
重定向的地址要求:

  • 重定向的目标地址可以不是当前应用范围内的地址

response.sendRedirect("https://www.baidu.com"); 正确

  • 允许在重定向的地址中包含额外请求参数

response.sendRedirect(“add2.do?id=999”); 正确的地址。但是由于重定向是重新发起请求,所以不会共享request,以前的提交数据全部丢失由于不共享request,所以不能依赖于request传递数据

  • 重定向的请求和当前请求的方法无关,新地址请求是Get

输出流

向response的输出流中写出数据,就是向客户端浏览器发送的数据
response.getOutptutStream():ServletOutputStream 一般用于下载处理或者图片、声音、视频之类的二进制数据处理
response.getWriter():PrintWriter 一般用于生成html文档
文件下载处理的要点
Content-Disposition,对应值为attachment;filename=默认文件名称

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值