JavaWeb [2] Filter+Listener+文件上传下载+国际化

1.JavaBean

什么是JavaBean:符合某些设计规范的类
为什么使用?避免代码重复的问题 起到功能重复使用的问题

JavaBean的规范
1.类必须是使用 public 修饰
2.必须有公共的无参数构造器
3.包含属性的操作方法

简单的JavaBean domain dao service
复杂的JavaBean Panel Window

JavaBean包含的成员
1.方法
2.时间
3.属性


Javabean

JavaBean的内省机制(自省机制)
目的:通过内省机制,获取和操作JavaBean中的成员信息(方法,事件,属性)

package cn.icanci.test1;

import java.util.Objects;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.test1
 * @Date: Created in 2020/2/7 16:58
 * @ClassAction:
 */
public class User {
    private String name;
    private int age;
    private String password;
    private String email;
    private String phone;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o){
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        User user = (User) o;
        return age == user.age &&
                Objects.equals(name, user.name) &&
                Objects.equals(password, user.password) &&
                Objects.equals(email, user.email) &&
                Objects.equals(phone, user.phone);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, password, email, phone);
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}
package cn.icanci.test1;
import  java.beans.PropertyDescriptor;

import java.beans.*;
import java.lang.reflect.Method;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.test1
 * @Date: Created in 2020/2/7 16:58
 * @ClassAction:
 */
public class JavaBeanTest {
    public static void main(String[] args) {
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor prop : propertyDescriptors){
                //属性名称
                System.out.println(prop.getName());
                //属性类型
                Class<?> propertyType = prop.getPropertyType();
                //获取getter 和 setter 方法
                Method readMethod = prop.getReadMethod();
                Method writeMethod = prop.getWriteMethod();
                System.out.println(propertyType);
                System.out.println(readMethod);
                System.out.println(writeMethod);
                System.out.println();
            }
        } catch (IntrospectionException e) {
            e.printStackTrace();
        }
    }
}

打印

age
int
public int cn.icanci.test1.User.getAge()
public void cn.icanci.test1.User.setAge(int)

email
class java.lang.String
public java.lang.String cn.icanci.test1.User.getEmail()
public void cn.icanci.test1.User.setEmail(java.lang.String)

name
class java.lang.String
public java.lang.String cn.icanci.test1.User.getName()
public void cn.icanci.test1.User.setName(java.lang.String)

password
class java.lang.String
public java.lang.String cn.icanci.test1.User.getPassword()
public void cn.icanci.test1.User.setPassword(java.lang.String)

phone
class java.lang.String
public java.lang.String cn.icanci.test1.User.getPhone()
public void cn.icanci.test1.User.setPhone(java.lang.String)

EL的基本使用
目的:从作用域中获取指定属性的共享数据
语法:${属性名}

EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量

因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找 假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传 ""

属性范围 EL中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope

JSP 表达式语言定义可在表达式中使用的以下文字


JSP的语言定义

JSP 表达式语言提供以下操作符


image.png

JSP 表达式语言定义了一组隐式对象

pageContext

JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。

还提供几个隐式对象,允许对以下对象进行简易访问


还提供几个隐式对象,允许对以下对象进行简易访问

JSTL表达式
使用JSTL的准备
加入pom.xml依赖

<!-- jstl 包 -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>
<!-- taglibs包 -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
JSTL标签库的使用方法
具体的标签
2.Filter

过滤器
web过滤器可以对所有的请求和响应做拦截过滤
1.以常规的方式调用资源(Servket/JSP)
2.利用修改过的请求信息调用资源
3.调用资源之后,但是响应在客户端之前,对响应做出修改
4.阻止当前资源调用,代之转到其他资源
过滤器在开发中的运用
1.对登陆的请求进行编码
2.登陆验证过滤器
3,敏感字(非法文字)过滤
4.做MVC框架的前端控制器(处理所有共同请求操作,然后再分发)


Servlet和Filter开发

Filter的映射细节


Filter的映射细节

如果有多个过滤器需要执行,filter-mapping中的顺序就是过滤的顺序
字符编码过滤器

敏感字过滤

package cn.icanci.web.filter;

import org.apache.commons.io.filefilter.FileFilterUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.web.filter
 * @Date: Created in 2020/2/8 15:52
 * @ClassAction:
 */
public class MyWrapper extends HttpServletRequestWrapper {
    public MyWrapper(HttpServletRequest request) {
        super(request);
    }

    /**
     * 覆盖
     * @param name
     * @return
     */
    @Override
    public String getParameter(String name) {
        if ("title".contains(name)||"context".equals(name)){
            //里面处理过滤的逻辑
            //然后再设计一个过滤器类 通过过滤器继续
            //装饰设计模式 然后把req修饰一下,然后再从传递给Servlet
            //
        }
        return super.getParameter(name);
    }
}

敏感字过滤的图解


敏感字过滤的图解

获取初始化参数有问题的可以看这篇 @getInitParameter() 解释

3.Listener

Web的另一 大组件:Listener (监听器).
Web中的监听器,主要用于监听作用域对象的创建,监听作用域对象属性的添加/删除/替换:

1):监听作用域对象的创建和销毁.
ServletRequestListener:监听请求对象的创建和销毁.
HttpSessionListener:监听会话对象(session)的创建和销毁.ServletContextListener :监听应用的创建和销毁.

2):监听作用域对象的属性的添加/删除/替换.
ServletRequestAttributeListener:监听request作用域中属性的添加/删除/替换.Ht tpSessionAttributeListener :监听session作用域中属性的添加/删除/替换.
ServletContextAttributeListener :监听application作用域中属性的添加/删除/替换.

属性监听器

package cn.icanci.web.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.web.listener
 * @Date: Created in 2020/2/8 20:29
 * @ClassAction:
 */
public class DemoListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("属性添加的监听");
        System.out.println(event.getName() + " " + event.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("属性删除的监听");
        System.out.println(event.getName() + " " + event.getValue());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        System.out.println("属性修改的监听");
        System.out.println(event.getName() + " " + event.getValue()+" "+event.getServletContext().getAttribute(event.getName()));
    }
}

web.xml配置文件 一般的 web.xml配置三大组件的顺序 监听器 -> 过滤器 -> Servlet

    <!-- 监听器-->
    <listener>
        <listener-class>cn.icanci.web.listener.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>cn.icanci.web.listener.DemoListener</listener-class>
    </listener>
4.文件上传

文件上传的准备工作
1.文件上传的控件的所在表单的method必须为POST 因为文件上传GET方式只能上传2kb.POST没有限制
2.上传控件需要使用type的file类型

enctype="multipart/form-data"

3.获取文件上传的名字 任何浏览器都ok

FilenameUtils.getName(fileItem.getName());

文件上传pom.xml依赖

<!--文件上传依赖 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

文件上传

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
    username:<input type="text" name="username"/><br>
    password:<input type="password" name="password"/><br/>
    image: <input type="file" name="headImg"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>
package cn.icanci.web;

import java.io.File;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.web
 * @Date: Created in 2020/2/7 21:40
 * @ClassAction:
 */
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解析请求
        boolean multipartContent = ServletFileUpload.isMultipartContent(req);
        if (!multipartContent) {
            return;
        }

        try {
            //1.创建File表单的封装
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //创建文件上传处理器
            ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
            //3.解析请求
            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            System.out.println(fileItems.size());
            //4.迭代每个item
            for (FileItem fileItem : fileItems) {
                String name = fileItem.getFieldName();
                if (fileItem.isFormField()) {
                    // 普通表单控件
                    //获取表单属性参数值
                    String value = fileItem.getString("UTF-8");
                    System.out.println(name + " " + value);
                } else {
                    //文件控件
                    String fileNameUUID = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(fileItem.getName());
                    String realPath = req.getServletContext().getRealPath("/headImages");
                    System.out.println("文件路径为:" + realPath +"\\"+ fileNameUUID);
                    System.out.println(realPath + "\\" + fileNameUUID);
                    fileItem.write(new File(realPath, fileNameUUID));
                    System.out.println(req.getServletContext().getContextPath());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        resp.sendRedirect("success.jsp");
        return;
    }
}
上传文件路径

但是如此设置每次启动服务器文件都没了,所以需要选择以下配置


热部署配置

热部署配置

配置之后上传的文件会在target对应目录下


target对应目录下

文件上传的控制
1.文件名字处理
1.IE6问题.通过 fileItem.getName(); 获取的上传文件的名称或带有路径
使用 FilenameUtils.getExtension(fileItem.getName())获取文件名称 名称使用UUID生成随机唯一名字:

String fileNameUUID = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(fileItem.getName());

上传文件的目录,一般保存在应用里面
2.缓存大小和临时目录
超过多少大小就不存放在内存了(缓存大小) 默认是10kb
不放在内存,会放在临时目录:默认是Tomcat/temp中

//设置缓存大小 默认大小是 10240字节 也就是10kb
factory.setSizeThreshold(20 * 1024);
//设置临时目录
factory.setRepository();

文件上传类型的约束

package cn.icanci.web;

import java.io.File;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.web
 * @Date: Created in 2020/2/7 21:40
 * @ClassAction:
 */
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    /**
     * 允许接收的图片类型
     */
    private static final String ALLOWED_IMAG_TYPE = "png;gif;jpg;jpeg";
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解析请求
        String path = null;
        boolean multipartContent = ServletFileUpload.isMultipartContent(req);
        if (!multipartContent) {
            return;
        }

        try {
            //1.创建File表单的封装
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //创建文件上传处理器
            //设置缓存大小 默认大小是 10240字节 也就是10kb
            factory.setSizeThreshold(20 * 1024);
            ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
            //3.解析请求
            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            System.out.println(fileItems.size());
            //4.迭代每个item
            for (FileItem fileItem : fileItems) {
                String name = fileItem.getFieldName();
                if (fileItem.isFormField()) {
                    // 普通表单控件
                    //获取表单属性参数值
                    String value = fileItem.getString("UTF-8");
                    System.out.println(name + " " + value);
                } else {

                    //拿到上传文件的MIME类型
                    String mimeType = super.getServletContext().getMimeType(fileItem.getName());
                    System.out.println(mimeType);
                    //上传文件的拓展名字
                    String extension = FilenameUtils.getExtension(fileItem.getName());
                    String[] allowed = ALLOWED_IMAG_TYPE.split(";");
                    if (!Arrays.asList(allowed).contains(extension)){
                        //图片格式不在允许和格式之内
                        req.setAttribute("errorMeg","请上传图片文件");
                        req.getRequestDispatcher("/index.jsp").forward(req,resp);
                        //结束方法
                        return ;
                    }
                    //文件控件
                    String fileNameUUID = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(fileItem.getName());
                    String realPath = req.getServletContext().getRealPath("/headImages");
                    System.out.println("文件路径为:" + realPath + "\\" + fileNameUUID);
                    System.out.println(realPath + "\\" + fileNameUUID);
                    fileItem.write(new File(realPath, fileNameUUID));
                    System.out.println(req.getServletContext().getContextPath());
                    path = "/headImages/" + fileNameUUID;
                    System.out.println(path);
                    fileItem.getName();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        req.getSession().setAttribute("path", path);
        req.getRequestDispatcher("success.jsp").forward(req, resp);
        return;
    }
}

抽取FileUtils工具类
抽取异常

package cn.icanci.Exception;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.Exception
 * @Date: Created in 2020/2/8 10:51
 * @ClassAction: 业务逻辑异常
 */
public class LogicException extends RuntimeException {
    /**
     * 构造器
      * @param message 异常信息
     * @param cause 异常的根本原因
     */
    public LogicException(String message, Throwable cause) {
        super(message, cause);
    }

    public LogicException(String message) {
        super(message);
    }
}

文件上传工具类

package cn.icanci.utils;

import cn.icanci.Exception.LogicException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.utils
 * @Date: Created in 2020/2/8 10:48
 * @ClassAction: 文件上传的约束
 */
public class FileUtil {

    /**
     * 允许接收的图片类型
     */
    private static final String ALLOWED_IMAG_TYPE = "png;gif;jpg;jpeg";

    public static void upload(HttpServletRequest req) throws ServletException, IOException {
        //解析请求
        String path = null;
        boolean multipartContent = ServletFileUpload.isMultipartContent(req);
        if (!multipartContent) {
            return;
        }

        try {
            //1.创建File表单的封装
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //创建文件上传处理器
            //设置缓存大小 默认大小是 10240字节 也就是10kb
            factory.setSizeThreshold(20 * 1024);
            ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
            //3.解析请求
            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            System.out.println(fileItems.size());
            //4.迭代每个item
            for (FileItem fileItem : fileItems) {
                String name = fileItem.getFieldName();
                if (fileItem.isFormField()) {
                    // 普通表单控件
                    //获取表单属性参数值
                    String value = fileItem.getString("UTF-8");
                    System.out.println(name + " " + value);
                } else {

                    //拿到上传文件的MIME类型
                    String mimeType = req.getServletContext().getMimeType(fileItem.getName());
                    System.out.println(mimeType);
                    //上传文件的拓展名字
                    String extension = FilenameUtils.getExtension(fileItem.getName());
                    String[] allowed = ALLOWED_IMAG_TYPE.split(";");
                    if (!Arrays.asList(allowed).contains(extension)) {
                        //图片格式不在允许和格式之内
                        throw new LogicException("请上传图片文件");
                    }
                    //文件控件
                    String fileNameUUID = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(fileItem.getName());
                    String realPath = req.getServletContext().getRealPath("/headImages");
                    System.out.println("文件路径为:" + realPath + "\\" + fileNameUUID);
                    System.out.println(realPath + "\\" + fileNameUUID);
                    fileItem.write(new File(realPath, fileNameUUID));
                    System.out.println(req.getServletContext().getContextPath());
                    path = "/headImages/" + fileNameUUID;
                    System.out.println(path);
                    fileItem.getName();
                }
            }
        } catch (LogicException e) {
            //继续抛出异常 给调用者
            throw e;
        }catch (Exception ex){
            ex.printStackTrace();
        }

    }
}
package cn.icanci.web;

import java.io.File;

import cn.icanci.Exception.LogicException;
import cn.icanci.utils.FileUtil;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.web
 * @Date: Created in 2020/2/7 21:40
 * @ClassAction:
 */
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws LogicException, ServletException, IOException {
        try {
            FileUtil.upload(req);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (LogicException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
            //输出给界面
            String message = e.getMessage();
        }
    }
}

4.设置文件上传的大小
1.单个文件
//设置文件上传大小的限制 1024<<11 2M
servletFileUpload.setSizeMax(1024 << 11);
2.总数据大小
servletFileUpload.setSizeMax(1024 << 10 * 3);
5.使用Map封装数据然后给JavaBean对象

package cn.icanci.utils;

import cn.icanci.Exception.LogicException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.utils
 * @Date: Created in 2020/2/8 10:48
 * @ClassAction: 文件上传的约束
 */
public class FileUtil {

    /**
     * 允许接收的图片类型
     */
    private static final String ALLOWED_IMAG_TYPE = "png;gif;jpg;jpeg";

    public static void upload(HttpServletRequest req, Map map) throws ServletException, IOException {
        //解析请求
        String path = null;
        boolean multipartContent = ServletFileUpload.isMultipartContent(req);
        if (!multipartContent) {
            return;
        }

        try {
            //1.创建File表单的封装
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //创建文件上传处理器
            //设置缓存大小 默认大小是 10240字节 也就是10kb
            factory.setSizeThreshold(20 * 1024);
            ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
            //设置文件上传大小的限制 1024<<11 2M
            servletFileUpload.setSizeMax(1024 << 11);
            //3.解析请求
            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            System.out.println(fileItems.size());
            //4.迭代每个item
            for (FileItem fileItem : fileItems) {
                String name = fileItem.getFieldName();
                if (fileItem.isFormField()) {
                    // 普通表单控件
                    //获取表单属性参数值
                    String value = fileItem.getString("UTF-8");
                    System.out.println(name + " " + value);
                    map.put(name,value);
                } else {

                    //拿到上传文件的MIME类型
                    String mimeType = req.getServletContext().getMimeType(fileItem.getName());
                    System.out.println(mimeType);
                    //上传文件的拓展名字
                    String extension = FilenameUtils.getExtension(fileItem.getName());
                    String[] allowed = ALLOWED_IMAG_TYPE.split(";");
                    if (!Arrays.asList(allowed).contains(extension)) {
                        //图片格式不在允许和格式之内
                        throw new LogicException("请上传图片文件");
                    }
                    //文件控件
                    String fileNameUUID = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(fileItem.getName());
                    String realPath = req.getServletContext().getRealPath("/headImages");
                    System.out.println("文件路径为:" + realPath + "\\" + fileNameUUID);
                    System.out.println(realPath + "\\" + fileNameUUID);
                    fileItem.write(new File(realPath, fileNameUUID));
                    System.out.println(req.getServletContext().getContextPath());
                    path = "/headImages/" + fileNameUUID;
                    System.out.println(path);
                    fileItem.getName();
                    map.put(name,"/headImages/" + fileNameUUID);
                }
            }
        } catch (LogicException e) {
            //继续抛出异常 给调用者
            throw e;
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}
package cn.icanci.web;

import java.io.File;

import cn.icanci.Exception.LogicException;
import cn.icanci.domain.Upload;
import cn.icanci.utils.FileUtil;
import com.sun.org.apache.xml.internal.resolver.readers.ExtendedXMLCatalogReader;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.web
 * @Date: Created in 2020/2/7 21:40
 * @ClassAction:
 */
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws LogicException, ServletException, IOException {
        try {
            Upload upload = new Upload();
            //封装普通表单的数据
            Map<String, String> map = new HashMap<>();
            FileUtil.upload(req, map);
            System.out.println(map);
            upload.setUsername(map.get("username"));
            upload.setPassword(map.get("password"));
            upload.setHeadImg(map.get("headImg"));
            System.out.println(upload);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (LogicException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
            //输出给界面
            String message = e.getMessage();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
5.文件下载
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
        下载资源列表 <br>
        <a href="${pageContext.request.contextPath}/download?fileName=four.zip">four</a> <br>
        <a href="${pageContext.request.contextPath}/download?fileName=第四季javaweb笔记.zip">第四季javaweb笔记</a><br>
        <a href="${pageContext.request.contextPath}/download?fileName=shiro资料笔记与核心单词.rar">shiro资料笔记与核心单词</a>

</body>
</html>
package cn.icanci.web;

import org.apache.taglibs.standard.tag.common.core.UrlSupport;

import java.net.URLEncoder;
import java.nio.file.Paths;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.file.Files;

/**
 * @Author: icanci
 * @ProjectName: javaweb
 * @PackageName: cn.icanci.web
 * @Date: Created in 2020/2/8 11:27
 * @ClassAction:
 */
@WebServlet("/download")
public class FiledownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.权限检查
        //2.获取被下载的资源文件名称
        String fileName = req.getParameter("fileName");
        System.out.println(fileName);

        //如果乱码,则需要更改
        //String s = new String(fileName.getBytes("ISO-8859-1"), "UTF-8");
        //3.从服务器找到被下载的资源的绝对路径
        String realPath = req.getServletContext().getRealPath("/WEB-INF/download/" + fileName);
        //=============
        System.out.println(req.getHeader("User-Agent"));
        //设置编码
        if (req.getHeader("User-Agent").contains("MSIE") ||req.getHeader("User-Agent").contains("AppleWebKit")) {
            //IE
            fileName = URLEncoder.encode(fileName, "UTF-8");
        } else {
            //非 ie
            fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
        }

        //1.应该设置下载文件的建议名称
        resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        //2.不要直接打开文件 ,建立路径  applicatoin/octet-stream
        resp.setContentType("application/zip");

        //=============
        //4.把磁盘的文件 --> 程序中 --> 浏览器 拷贝操作
        Files.copy(Paths.get(realPath), resp.getOutputStream());

    }
}
6.国际化

可以参考此博客 @深入学习Java国际化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容