第三方控件
1. 掌握文件上传
HTTP协议是基于TCP协议的一种超文本传输协议,用于通信。
客户端请求,服务端响应。
rfc 1867里提出了HTTP协议允许进行文件上传。
<input type="file"/>
commons-fileupload它就遵循了rfc 1867规范,进行了一系列文件上传封装。
-
下载最新版的fileupload和io组件http://commons.apache.org/proper/commons-fileupload/
-
**客户端:**rfc1867规范中提到了想要做文件上传 必须保证请求方式为
POST
,内容类型(Content-Type)必须为multipart/form-data
- 编写一个表单将其请求方式设置为POST
- 将表单的属性
enctype="multipart/form-data"
(设置上它之后,数据的请求信息变化了,变为了文件项形式上传) - 设置一个文件域用于选择文件
-
服务端:
// 1.工厂 // 接口:File文件Item项Factory工厂 用来进行文件项内容接收的 // 实现类:DiskFileItemFactory // 常用的API: DiskFileItemFactory fif = new DiskFileItemFactory(); // 设置上传过程中的文件缓冲区大小 // fif.setSizeThreshold(sizeThreshold); // 设置上传过程中的临时文件存储位置 // fif.setRepository(repository) // 2.产品 // 接口FileItem 用来存储请求过来的文件项内容 文件项可能为文件表单 也可能为普通表单 // 判断是否是普通表单 // isFormFiled() // 获取文件名 // getName() // 获取name属性值 // getFiledName() // 获取value属性值 // getString() getString(String encoding) // 获取文件大小 // getSize() // 文件存储 (上传到服务器的哪个位置) // write(File destFile) // 3.操作工 // ServletFileUpload // 设置上传文件的总大小 // setSizeMax(long 字节) 如果文件上传超过大小限制 会抛出一个FileUploadBase.SizeLimitExceededException异常 // 解析请求 将请求内容转换为对应的文件项集合 // List<FileItem> parseRequest(HttpServletRequest request) // 判断是否是enctype=multipart/form-data格式的上传 // boolean isMultipartContent(HttpServletRequest request) // 设置头编码(如果你的文件名乱码了 可以设置它) 记住这些编码设置应该放在最前面 否则都已经获取完了 设置也就没意义 // setHeaderEncoding(String encoding)
<%@page import="java.util.Arrays"%>
<%@page import="org.apache.commons.io.FilenameUtils"%>
<%@page import="java.util.UUID"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.FileUploadBase"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="org.apache.commons.fileupload.FileItemFactory"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//1.搭建工厂 准备操作工
FileItemFactory fif=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(fif);
//2.检验原材料
if(!upload.isMultipartContent(request)){
out.print("文件上传非法");
return;
}
try{
//3.设置总上传大小
upload.setSizeMax(700 * 1024);
//4.解析请求中文件项内容
List<FileItem> fileItemList=upload.parseRequest(request);
//5.遍历文件项集合
for(FileItem fileItem:fileItemList){
//6.对文件项进行区别处理
//获取name属性值
String name= fileItem.getFieldName();
if(fileItem.isFormField()){
//普通表单内容
//获取value属性值
String value=fileItem.getString("UTF-8");
System.out.print("普通表单内容"+name+"-"+value);
}else{
//文件表单内容
//获取文件名
String fileName=fileItem.getName();
//!!!!解决文件重名问题:在存储前先一个随机名称(uuid或时间毫秒值)
//获取后缀名 commons.io包里面的
String extension=FilenameUtils.getExtension(fileName);
//方法一
//c76817fa-d6cc-44ed-8f64-7a3c6e15a4c9 比如他就是uuid
//String newFileName=UUID.randomUUID().toString().replace("-", "")+"_header."+extension;
//方法二
String newFileName=System.currentTimeMillis()+"_header."+extension;
//!!!解决文件格式不支持问题: 想法是提前准备一个文件扩展名集合 判断是否包含此扩展名
List<String> extensionList=Arrays.asList("png","jpeg","gif");
if(!extensionList.contains(extension)){
out.print("文件格式不支持,请上传png,jpeg,gif的格式文件");
return;
}
File file=new File("f:\\upload\\"+newFileName);
//存储文件
fileItem.write(file);
}
}
/*
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException
$表示内部类*/
}catch(FileUploadBase.SizeLimitExceededException e){
e.printStackTrace();
out.print("文件大小超过总限制100KB");
}catch(Exception e){
e.printStackTrace();
out.print("服务器繁忙");
}
%>
2. 掌握富文本编辑器的使用
3. 掌握页面拆分
在我们编写JSP文件时,我们发现在多个JSP文件中可能会出现大量重复的代码。JSP由HTML+Java组成的,所以有可能有大量的重复HTML或者大量的重复Java代码。那么我们就需要对重复性的代码进行复用。
3.1 静态包含
<%@include %>
指令
3.2 动态包含
<jsp:include/>