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

tech2024-08-12  41

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其他操作

定时刷新

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之间的数据传输使用的

最新回复(0)