文件的上传和下载

文件上传的介绍

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>UploadServlet</servlet-name><servlet-class>com.atguigu.servlet.UploadServlet</servlet-class></servlet><servlet-mapping><servlet-name>UploadServlet</servlet-name><url-pattern>/uploadServlet</url-pattern></servlet-mapping>
</web-app>
package com.atguigu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class UploadServlet extends HttpServlet {/*** 用来处理文件生成* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("文件上传过来了");}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%-- form:post --%><form action="http://localhost:8080/jstl/uploadServlet" method="post" enctype="multipart/form-data">用户名 :<input type="text" name="username"> <br>头像 :<input type="file" name="photo"> <br><input type="submit" value="上传"></form>
</body>
</html>


上传的http协议介绍



  • 以流的形式上传和接收
  • 所以如果用getPraramter没有用
package com.atguigu.servlet;import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class UploadServlet extends HttpServlet {/*** 用来处理文件生成* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletInputStream inputStream = req.getInputStream();byte[] buffer = new byte[1024000];int read = inputStream.read(buffer);System.out.println(new String(buffer, 0, read));}
}

上传合用到的类和方法介绍



使用fileupload解析上传的数据


选中整行以后 command + option + t 快捷键

然后选择 try catch,然后手动改成Exception

package com.atguigu.servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;public class UploadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1、先判断上传的数据是否为多段数据(只有是多段数据,才是文件上传的)if (ServletFileUpload.isMultipartContent((req))) {// 创建FileItemFactory工厂实现类FileItemFactory fileItemFactory = new DiskFileItemFactory();// 创建用于解析上传数据的工具类 ServletFileUpload类ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);// 解析上传的数据,得到每一个表单项FileItemtry {List<FileItem> list = servletFileUpload.parseRequest(req);// 循环判断,每一个表单项,是普通类型,还是上传的文件for (FileItem fileItem : list) {if (fileItem.isFormField()) {// 普通表单项System.out.println("表单项的name属性值:" + fileItem.getFieldName());// 参数UTF-8,解决乱码问题System.out.println("表单的value属性值:" + fileItem.getString("UTF-8"));} else {// 上传的文件System.out.println("表单项的name属性值:" + fileItem.getFieldName());System.out.println("上传的文件名:" + fileItem.getName());//                        fileItem.write((new File(("e:\\" + fileItem.getName()))));}}} catch (Exception e) {e.printStackTrace();}}}
}

文件下载的实现


package com.atguigu.servlet;import org.apache.commons.io.IOUtils;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;public class Download extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1、获取要下载的文件名String downloadFileName = "1.png";// 2、读取要下载的文件内容(通过ServletContext对象可以读取)ServletContext servletContext = getServletContext();// 获取要下载的文件类型String mimeType = servletContext.getMimeType("/file/" + downloadFileName);System.out.println("下载的文件类型:" + mimeType);// 4、在回传前,通过响应头告诉客户端返回的数据类型resp.setContentType(mimeType);// 5、还要告诉客户端收到的数据是用于下载使用(还是使用响应头)// Content-Disposition响应头,表示收到的数据怎么处理// attacjment表示附件,表示下载使用// filename= 表示指定下载的文件名resp.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);/*** /斜杠被服务器解析表示地址为http://ip:port/工程名/    映射  到代码的web目录*/InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName);// 获取响应的输出流ServletOutputStream outputStream = resp.getOutputStream();// 3、把下载的文件内容回传给客户端// 读取输入流中全部的数据,复制给输出流,输出给客户端IOUtils.copy(resourceAsStream, outputStream);}
}



输入后敲回车,直接就下载文件了

使用URLEncoder解决谷歌和IE浏览器中文下载名乱码问题


可以和原文件名不同,下载下来显示的名称就是filename
如果filename=中国.jpg,文件名会无法识别
因此,要对中文进行URL编码

Base64编解码操作

如果是火狐浏览器不支持上面这种方式

发现这个类和URLEncode类不同,不是静态方法,因此要先new

Base64编解码操作 解决 火狐浏览器的附近中文名问题


将原先那个setHeader换成resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" + new BASE64Encoder().encode("中国.jpg".getBytes("UTF-8")) + "?=");

使用User-Agent请求头判断,动态切换不同的方案解决所有浏览器附件中文乱码问题


书城项目

  • command + shift + R 可以查找替换(可以先选中目录)

动态的base标签值

表单提交失败的错误回显


合并LoginServlet和RegistServlet程序为UserServlet程序



使用反射优化大量else if代码

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String action = req.getParameter("action"); try {// 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); // System.out.println(method);// 调用目标业务 方法method.invoke(this, req, resp); } catch (Exception e) {e.printStackTrace(); }
}

抽取 BaseServlet 程序

public abstract class BaseServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String action = req.getParameter("action"); try {// 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); // System.out.println(method);// 调用目标业务 方法method.invoke(this, req, resp); } catch (Exception e) { e.printStackTrace(); } }
}

数据的封装和抽取 BeanUtils 的使用

  • command + option + t 选择代码的环绕方式

MVC概念


Cookie

什么是Cookie

Cookie的创建

<!-- Cookie.html -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cookie</title><!--    因为是html页面   --><base href="http://localhost:8080/cookie/">
<style type="text/css">ul li {list-style: none;}</style>
</head>
<body><iframe name="target" width="500" height="500" style="float: left;"></iframe><div style="float: left;"><ul><li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li><li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li><li><a href="cookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li><li>Cookie的存活周期</li><li><ul><li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间(会话)</a></li><li><a href="cookieServlet?action=deleteNow" target="target">Cookie立即删除</a></li><li><a href="cookieServlet?action=life3600" target="target">Cookie存活3600秒(1小时)</a></li></ul></li><li><a href="cookieServlet?action=testPath" target="target">Cookie的路径设置</a></li><li><a href="" target="target">Cookie的用户免登录练习</a></li></ul></div>
</body>
</html>
package com.atguigu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;public abstract class BaseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 解决post请求中文乱码问题// 一定要在获取请求参数之前调用才有效req.setCharacterEncoding("UTF-8");// 解决响应中文乱码问题resp.setContentType("text/html; charset=UTF-8");String action = req.getParameter("action");try {// 获取action业务鉴别字符串,获取相应的业务 方法反射对象Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
//            System.out.println(method);// 调用目标业务 方法method.invoke(this, req, resp);} catch (Exception e) {e.printStackTrace();}}}
package com.atguigu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class CookieServlet extends BaseServlet{protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1、创建Cookie对象Cookie cookie = new Cookie("key1", "value1");// 2、通知客户端保存Cookieresp.addCookie(cookie);resp.getWriter().write("Cookie创建成功");}
}


Cookie的获取

package com.atguigu.servlet;import com.example.Cookie.CookieUtils;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class CookieServlet extends BaseServlet{protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1、创建Cookie对象Cookie cookie = new Cookie("key1", "value1");// 2、通知客户端保存Cookieresp.addCookie(cookie);resp.getWriter().write("Cookie创建成功");}protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie[] cookies = req.getCookies();// getName方法// getValue方法for (Cookie cookie : cookies) {resp.getWriter().write("Cookie[" + cookie.getName() + " = " + cookie.getValue() + "] <br>");}Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);if (iWantCookie != null) {resp.getWriter().write("找到了需要的Cookie");}}
}

package com.atguigu.util;import javax.servlet.http.Cookie;public class CookieUtils {/*** 查找指定名称的cookie对象* @param name* @param cookies* @return*/public static Cookie findCookie(String name, Cookie[] cookies) {if (name == null || cookies == null || cookies.length == 0) {return null;}for (Cookie cookie : cookies) {if (name.equals(cookie.getName())) {return cookie;}}return null;}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cookie</title><!--    因为是html页面   --><base href="http://localhost:8080/cookie/">
<style type="text/css">ul li {list-style: none;}</style>
</head>
<body><iframe name="target" width="500" height="500" style="float: left;"></iframe><div style="float: left;"><ul><li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li><li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li><li><a href="cookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li><li>Cookie的存活周期</li><li><ul><li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间(会话)</a></li><li><a href="cookieServlet?action=deleteNow" target="target">Cookie立即删除</a></li><li><a href="cookieServlet?action=life3600" target="target">Cookie存活3600秒(1小时)</a></li></ul></li><li><a href="cookieServlet?action=testPath" target="target">Cookie的路径设置</a></li><li><a href="" target="target">Cookie的用户免登录练习</a></li></ul></div>
</body>
</html><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cookie</title><!--    因为是html页面   --><base href="http://localhost:8080/cookie/">
<style type="text/css">ul li {list-style: none;}</style>
</head>
<body><iframe name="target" width="500" height="500" style="float: left;"></iframe><div style="float: left;"><ul><li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li><li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li><li><a href="cookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li><li>Cookie的存活周期</li><li><ul><li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间(会话)</a></li><li><a href="cookieServlet?action=deleteNow" target="target">Cookie立即删除</a></li><li><a href="cookieServlet?action=life3600" target="target">Cookie存活3600秒(1小时)</a></li></ul></li><li><a href="cookieServlet?action=testPath" target="target">Cookie的路径设置</a></li><li><a href="" target="target">Cookie的用户免登录练习</a></li></ul></div>
</body>
</html>

Cookie值的修改

    protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        方案一 :
//        1、先创建一个要修改的同名的Cookie对象
//        2、在构造器,同时赋于新的cookie值Cookie cookie = new Cookie("key1", "newValue1");
//        3、调用resp.addCookie(cookie); ;通知 客户端 保存修改resp.addCookie(cookie);resp.getWriter().write("key1的cookie已经修改好了");}

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = CookieUtils.findCookie("key1", req.getCookies());if (cookie != null) {cookie.setValue("newValue1");resp.addCookie(cookie);}}

  • 中文也是

谷歌和火狐浏览器如何查看Cookie


Cookie的生命设置

protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("defaultLife", "defaultLife");cookie.setMaxAge(-1);   // 设置存活时间resp.addCookie(cookie);}
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 先找到要删除的cookie对象Cookie cookie = CookieUtils.findCookie(("key1"), req.getCookies());if (cookie != null) {// 调用setMaxAge(0);cookie.setMaxAge(0);    // 表示马上删除,都不需要等待浏览器关闭// 调用addCookieresp.addCookie(cookie);resp.getWriter().write("key1的cookie已经被删除");}}

Cookie 有效路径 Path 的设置

protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("path1", "path1");// getContextPath 得到工程路径cookie.setPath( req.getContextPath() + "/abc" ); // 工程路径/abcresp.addCookie(cookie);resp.getWriter().write("创建了一个带有Path路径的Cookie");}

Cookie 练习—免输入用户名登录

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>login.jsp</title>
</head>
<body><form action="http://localhost:8080/cookie/loginServlet" method="get">用户名:<input type="text" name="username" value="${ cookie.username.value }"> <br>密码:<input type="password" name="password"> <br><input type="submit" value="登陆"></form>
</body>
</html>
package com.atguigu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if ("wzg168".equals(username) && "123456".equals(password)) {Cookie cookie = new Cookie("username", username);cookie.setMaxAge(60 * 60 * 24 * 7); // 当前Cookie一周内有效resp.addCookie(cookie);System.out.println("登陆成功");} else {System.out.println("登陆失败");}}
}

  • 在登陆成功一次,且在cookie消亡时间之前,再次访问login.jsp用户名会自动显示

尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(四)相关推荐

  1. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(一)

    HTML和CSS ctrl + shift + / 在同一行代码中的后半截产生注释 HTML标签的介绍 标签拥有自己的属性,分为 基本属性 和 事件属性 标签的基本属性 :bgcolor=" ...

  2. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(三)

    EL表达式 什么是EL表达式 <%@ page contentType="text/html;charset=UTF-8" language="java" ...

  3. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(二)

    书城项目 JavaEE三层架构介绍 搭建书城项目环境 IDEA工具Debug的使用 JSP 什么是jsp jsp页面的本质 jsp的page指令 虽然 / 在浏览器解析的时候是端口号,但是jsp本质最 ...

  4. 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】

    视频地址:[尚硅谷]大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01[Zookeeper(入门.本地安装.集群操作)] ...

  5. PowerMill模具数控编程视频教程全套产品三轴零基础入门到精通

    最近有很多人在问什么是结构设计?结构要处理的东西算是比较灵活,因为一个产品有了外形设计之后,要做结构设计来处理其运动特性.这样的产品在结构上是否坚固,是否能满足产品的要求,就成了结构设计的重要内容,而 ...

  6. 新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室

     新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室 VTP(VLAN Trunking Protocol):VLAN中继协议,是Cisco专用协议.也被称为虚拟局域网干道 ...

  7. cad vba编程从入门到精通_【CAD教程】CAD2020零基础入门到精通全套视频教程

    AutoCAD是如今一款使用最广泛的工程绘图软件.普及率非常高,相信不管你从事的工作是哪个行业,都有机会接触到它,重要性仅次于Office办公套件了.如果你还不熟悉或还不够熟悉,建议都尽快来学习一下. ...

  8. 计算机pscs6教程,photoshop CS6零基础入门教程

    <photoshop CS6零基础入门教程>针对零基础学员开设,以教案和实际操作演示相结合的方式,详细地介绍adobe photoshop cs6的各项工具和命令.由浅入深.循序渐进地全面 ...

  9. 【3d建模】zbrush教程非常适合零基础入门,一学就会

    ZBrush 是一款新型的 CG 软件,它的优秀的Z球建模方式,不但可以做出优秀的静帧,而且也参与了很多电影特效.游戏的制作过程(大家熟悉的指环王III,半条命II都有Zbrush 的参与).它可以和 ...

最新文章

  1. 大学毕业生如何应对“没有工作经验”的难题
  2. python:argparse命令行解析模块详解
  3. arp的***和防御
  4. springMVC 前后台日期格式传值解决方式之一(共二) @DateTimeFormat的使用和配置...
  5. 基于 DataLakeAnalytics 做跨地域的数据分析
  6. windows 操作系统里 git bash 和 git cmd 的区别
  7. oracle 修改nls_characterset,ORACLE NLS_CHARACTERSET字符集的更改
  8. 【图像处理】Haar-like特征
  9. Python学习日记(3)Python内建函数map()、filter()和匿名函数表达式
  10. 玩转 SpringBoot 2 之整合定时任务篇
  11. 英睿达固态硬盘测试软件,高速读写,电竞必备 英睿达P5固态硬盘评测
  12. 贵阳清镇计算机培训,贵阳清镇电工培训中心
  13. 使用depot_tools下载chromium源码
  14. 新零售智慧供应链架构
  15. Word文档统一图片格式快捷操作
  16. 浏览器不支持 flash 插件
  17. java获取excel嵌入对象_EXCEL,使用嵌入对象(.dot)作为报告模板
  18. Unity http协议连接封装简易版(已测试可用)
  19. php压缩中文文件,phpzip压缩中文文件时候出现压缩无大小或无法压缩
  20. ps play android下载地址,PSPlay

热门文章

  1. ABAP 生成ZIP压缩文件的代码
  2. Oracle数据库查看用户状态
  3. ABAP 选择屏幕上添加按钮,按钮上添加文字和图片
  4. ABAP中的F4帮助怎么用?
  5. 酒店差异战打响,“设计标签”能实现突围吗?
  6. 用“龙头”促发展,以“立体”筑生态,长沙生物医药产业集群跑出“加速度”
  7. 瑞幸咖啡生,互联网咖啡生;数据死,互联网咖啡死
  8. python 按钮事件_从django vi中的按钮获取click事件
  9. 快速谱峭度matlab,一种基于快速谱峭度分析的泵潜在空化故障检测方法与流程
  10. python画椭圆turtle_如何用Python画一只肥肥的柯基狗狗——turtle库绘制椭圆与弧线实践...