尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(四)
文件的上传和下载
文件上传的介绍
<?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零基础入门完整版(四)相关推荐
- 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(一)
HTML和CSS ctrl + shift + / 在同一行代码中的后半截产生注释 HTML标签的介绍 标签拥有自己的属性,分为 基本属性 和 事件属性 标签的基本属性 :bgcolor=" ...
- 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(三)
EL表达式 什么是EL表达式 <%@ page contentType="text/html;charset=UTF-8" language="java" ...
- 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(二)
书城项目 JavaEE三层架构介绍 搭建书城项目环境 IDEA工具Debug的使用 JSP 什么是jsp jsp页面的本质 jsp的page指令 虽然 / 在浏览器解析的时候是端口号,但是jsp本质最 ...
- 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】
视频地址:[尚硅谷]大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01[Zookeeper(入门.本地安装.集群操作)] ...
- PowerMill模具数控编程视频教程全套产品三轴零基础入门到精通
最近有很多人在问什么是结构设计?结构要处理的东西算是比较灵活,因为一个产品有了外形设计之后,要做结构设计来处理其运动特性.这样的产品在结构上是否坚固,是否能满足产品的要求,就成了结构设计的重要内容,而 ...
- 新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室
新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室 VTP(VLAN Trunking Protocol):VLAN中继协议,是Cisco专用协议.也被称为虚拟局域网干道 ...
- cad vba编程从入门到精通_【CAD教程】CAD2020零基础入门到精通全套视频教程
AutoCAD是如今一款使用最广泛的工程绘图软件.普及率非常高,相信不管你从事的工作是哪个行业,都有机会接触到它,重要性仅次于Office办公套件了.如果你还不熟悉或还不够熟悉,建议都尽快来学习一下. ...
- 计算机pscs6教程,photoshop CS6零基础入门教程
<photoshop CS6零基础入门教程>针对零基础学员开设,以教案和实际操作演示相结合的方式,详细地介绍adobe photoshop cs6的各项工具和命令.由浅入深.循序渐进地全面 ...
- 【3d建模】zbrush教程非常适合零基础入门,一学就会
ZBrush 是一款新型的 CG 软件,它的优秀的Z球建模方式,不但可以做出优秀的静帧,而且也参与了很多电影特效.游戏的制作过程(大家熟悉的指环王III,半条命II都有Zbrush 的参与).它可以和 ...
最新文章
- 大学毕业生如何应对“没有工作经验”的难题
- python:argparse命令行解析模块详解
- arp的***和防御
- springMVC 前后台日期格式传值解决方式之一(共二) @DateTimeFormat的使用和配置...
- 基于 DataLakeAnalytics 做跨地域的数据分析
- windows 操作系统里 git bash 和 git cmd 的区别
- oracle 修改nls_characterset,ORACLE NLS_CHARACTERSET字符集的更改
- 【图像处理】Haar-like特征
- Python学习日记(3)Python内建函数map()、filter()和匿名函数表达式
- 玩转 SpringBoot 2 之整合定时任务篇
- 英睿达固态硬盘测试软件,高速读写,电竞必备 英睿达P5固态硬盘评测
- 贵阳清镇计算机培训,贵阳清镇电工培训中心
- 使用depot_tools下载chromium源码
- 新零售智慧供应链架构
- Word文档统一图片格式快捷操作
- 浏览器不支持 flash 插件
- java获取excel嵌入对象_EXCEL,使用嵌入对象(.dot)作为报告模板
- Unity http协议连接封装简易版(已测试可用)
- php压缩中文文件,phpzip压缩中文文件时候出现压缩无大小或无法压缩
- ps play android下载地址,PSPlay
热门文章
- ABAP 生成ZIP压缩文件的代码
- Oracle数据库查看用户状态
- ABAP 选择屏幕上添加按钮,按钮上添加文字和图片
- ABAP中的F4帮助怎么用?
- 酒店差异战打响,“设计标签”能实现突围吗?
- 用“龙头”促发展,以“立体”筑生态,长沙生物医药产业集群跑出“加速度”
- 瑞幸咖啡生,互联网咖啡生;数据死,互联网咖啡死
- python 按钮事件_从django vi中的按钮获取click事件
- 快速谱峭度matlab,一种基于快速谱峭度分析的泵潜在空化故障检测方法与流程
- python画椭圆turtle_如何用Python画一只肥肥的柯基狗狗——turtle库绘制椭圆与弧线实践...