上传的封装
一.上传的封装
public class SmartUpload {
private HttpServlet servlet;//
private ServletFileUpload sfu;//用于上传的全局变量
private File uploadDir;//用来创建上传文件的文件夹
private HashMap<String,String> parameters;//用来存储普通表单数据
private HashMap<String,File> files;//用来存储上传文件的文件名和文件
public SmartUpload(HttpServlet httpServlet){
this.servlet = httpServlet ; //构造方法,用来操作使用此轮子的servlet对象
inintDir();//初始化上传文件夹
sfu = new ServletFileUpload();//
sfu.setFileItemFactory(new DiskFileItemFactory());//初始化servletFileUpload
parameters = new HashMap<>();//初始化对象
files = new HashMap<>(); //初始化对象}
private void initDir(){
String uploadPath = servlet.getServletContext().getRealPath("")+File.separator+"upload";//拼接上传文件路径
uploadDir = new File(uploadPath); //通过拼接路径创建File对象
if(!uploadDir.exists()){ //判断文件夹是都存在
uploadDir.mkdirs();} //不存在则创建文件夹
public void parse(HttpServletRequest request){ //解析request
List<FileItem> fileItems = sfu.parseRequest(request);//解析request放入List中
if(fileItems != null){ //判断不为空
for(FileItem fileItem : fileItems){//遍历List
if(fileItem.isFormField()){ //判断是否为表单数据
String key = fileItem.getFieldName();//获取key
String value = fileItem.getString("utf-8");//获取value
parameter.put(key,value);//存入hashMap中
}else { //不是表单数据
String fileName = fileItem.getName();//获取文件名
if(StringUtils.isEmpty(fileName)){ //引用是apache下的包
continue;}
String realName = TestUUID.handFileName(fileName);//利用UUID生成新的文件名
File file = new File(uploadDir,realName);//通过文件夹和文件名创建文件
fileItem.write(file);//写文件
files.put(fileName,file);//将文件名和file对象存入hashMap
public String getParameter(String key){
return parameter.get(key);}
public Map<String,String> getParameterMap(){
return parameters;}
public Map<String,File> getUploadFiles(){
return files;}
二.用注解@MultipartConfig实现上传文件
Part file = request.getPart("file");//根据表单中的name属性拿到要上传的文件
file.getName();//拿到的是在表单中name的属性值
file.getContentType();//获取文件类型
fiel.getSize();//获取文件大小
file.getHeader("content-disposition");//获取文件详情
File dir = new File(getServletContext().getRealPath("")+File.separator+"upload");
if(!Dir.exists()){
Dir.mkdirs();} //创建文件夹
String fileName = getServletContext().getRealPath("")+File.separator+"upload"+File.separator+file.getName;//文件名及路径
file.write(fileName);//传文件
三.request域
向request域中放值,值以key-value的形式存放,key只能是String,value可以是任何对象
存值:request.setAttribute("msg",msg);//键值对形式存放
取值:request.getAttribute("msg");//通过key取value
四.ServletContext域
tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。
1、web项目中共享数据,getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)
五.JavaWeb中四大域对象的作用范围
PageContext域:作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。
ServletRequest域:作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。
HttpSession域:作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate() ,可以立即销毁session。
ServletContext域:作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。
PageContext(jsp页面),ServletRequest(一次请求),HttpSession(一次会话),ServletContext(整个web应用)。