JavaWeb——servlet的应用

1.生成验证码

package com.xawl.util;

import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet(name = "ValidCode",urlPatterns = "/validcode")
public class ValidCode extends HttpServlet {
    private static int imgWidth = 95;
    private static int imgHeight = 35;
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 实现思路
         * 1.设置响应MIME类型
         * 2.生成图片
         * 3.随机码(保存随机器),写到图片上
         * 4.响应客户端
         */
        //1.设置响应MIME类型
        response.setContentType("images/jpeg");
        //2.生成图片
        BufferedImage image = new BufferedImage(imgWidth,imgHeight,BufferedImage.TYPE_INT_RGB);
        //创建一个画笔
        Graphics g = image.getGraphics();
        //设置笔的颜色
        g.setColor(new Color(230,230,230));
        g.fillRect(0,0,imgWidth-2,imgHeight-2);
        g.setColor(new Color(150,150,150));
        g.drawRect(0,0,imgWidth,imgHeight);
        //设置验证码的干扰线颜色
        g.setColor(Color.blue);
        for (int i=0;i<10;i++){
            //起点
            int x1 = new Random().nextInt(imgWidth);
            int y1 = new Random().nextInt(imgHeight);
            //终点
            int x2 = new Random().nextInt(imgWidth);
            int y2 = new Random().nextInt(imgHeight);
            g.drawLine(x1,y1,x2,y2);
        }
        //3.随机码(保存随机器),写到图片上
        g.setColor(Color.red);
        Font font = new Font("songti",1,21);
        g.setFont(font);

        //生成验证码
        String validcode = getValidCode();
        g.drawString(validcode,8,25);
        //4.响应客户端
        ImageIO.write(image,"jpeg",response.getOutputStream());
        //释放画笔
        g.dispose();
    }

    /**
     * 生成随机验验码
     * @return
     */
    private String getValidCode(){
       String str = "";
       for (int i=0;i<2;i++){
           //生成数字
           char num = (char)(new Random().nextInt(10)+48);
           //生成字母
           char cp = (char)(new Random().nextInt(26)+65);
           str = str +" " + num + " "+ cp;
       }
       return str;
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录系统</title>
    <script>
        function reValidCode(){
            document.getElementById("imgCode").src= "validcode?id="+new Date().getTime();
        }
    </script>
</head>
<body>
<form action="dologin" method="post">
    <br/>
    <br/>
    <br/>

   <table align="center" width="600" border="0">
       <tr>
           <td colspan="2">
               <H1 align="center">登录系统</H1>
           </td>
           <td></td>
       </tr>
       <tr>
           <td width="100" align="right">用户名:</td>
           <td width="300">
               <input type="text" name="username" placeholder="请输入用户名">
           </td>
           <td width="200"></td>
       </tr>
       <tr>
           <td  align="right">密码:</td>
           <td><input type="password" name="userpwd" placeholder="请输入密码"></td>
           <td></td>
       </tr>
       <tr>
           <td  align="right">验证码:</td>
           <td> <input type="text" name="usercode" placeholder="请输入验证码">
           <img src="validcode" id="imgCode" style="cursor: pointer" onclick="reValidCode()">
           </td>
           <td></td>
       </tr>
       <tr>
           <td></td>
           <td><input type="submit" value="登录"></td>
           <td></td>
       </tr>
   </table>
</form>
</body>
</html>

2.实现登录功能

2.1 创建登录页面(View视图)

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录系统</title>
    <script>
        function reValidCode(){
            document.getElementById("imgCode").src= "validcode?id="+new Date().getTime();
        }
    </script>
    <style>
        body{
            background-image: url("images/bg2.jpg");
            background-size: cover;
        }
        input{
            width: 230px;
            height: 34px;
        }
        #imgCode{
            vertical-align: bottom;
        }
        button{
            width: 300px;
            height: 34px;
            background-color: #4e6ef2;
            border: none;
            color: #FFF;
            font-size: 18px;
        }
        .logindiv{
            width: 350px;
            height: 300px;
            background-color: #FFFFFF;
            border: 1px solid #CCC;
            margin: 50px auto;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 3px 3px 3px #CCC;
            margin-top: 300px;
        }
        .errFont{
            color: red;
            font-size: 14px;
        }
    </style>
</head>
<body>
<form action="dologin" method="post">
<div class="logindiv">
   <table align="center" width="350" border="0" cellspacing="0" cellpadding="0">
       <tr>
           <td colspan="2">
               <H1 align="center">登录系统</H1>
           </td>
       </tr>
       <tr>
           <td width="80" align="right" height="35">用户名:</td>
           <td >
               <!-- 数据回显-->
               <input type="text" name="username" placeholder="请输入用户名" autocomplete="off"

                      value="<%out.print(request.getParameter("username")==null?"":request.getParameter("username"));%>">
           </td>
       </tr>
       <tr>
           <td height="19"></td>
           <td class="errFont">
               <%
                   if(request.getAttribute("userErr")!=null){
                       out.print(request.getAttribute("userErr"));
                   }
               %>
           </td>
       </tr>
       <tr>
           <td  align="right"  height="35">密码:</td>
           <td><input type="password" name="userpwd" placeholder="请输入密码"></td>
       </tr>
       <tr>
           <td height="19"></td>
           <td class="errFont">
               <%
                   if(request.getAttribute("pwdErr")!=null){
                       out.print(request.getAttribute("pwdErr"));
                   }
               %>
           </td>
       </tr>
       <tr>
           <td  align="right"  height="35">验证码:</td>
           <td> <input type="text" name="usercode" placeholder="请输入验证码"  autocomplete="off" style="width: 130px"
                       value="<%out.print(request.getParameter("usercode")==null?"":request.getParameter("usercode"));%>" >
           <img src="validcode" id="imgCode" style="cursor: pointer" onclick="reValidCode()">
           </td>
       </tr>
       <tr>
           <td height="19"></td>
           <td class="errFont">
               <%
                   if(request.getAttribute("codeErr")!=null){
                       out.print(request.getAttribute("codeErr"));
                   }
               %>

           </td>
       </tr>
       <tr>
           <td height="10"></td>
           <td class="errFont">
               <%
                   if(request.getAttribute("loginErr")!=null){
                       out.print(request.getAttribute("loginErr"));
                   }
               %>
           </td>
       </tr>
       <tr>
           <td colspan="2" align="center"  height="60"><button type="submit">&nbsp;&nbsp;&nbsp;&nbsp;</button> </td>
       </tr>
   </table>
</div>
</form>
</body>
</html>
2.2 建库建表、插入数据

userinfo.sql

-- 创建mydb数据库 
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4;
USE mydb;

-- 创建userinfo表
DROP TABLE IF EXISTS `userinfo`;
CREATE TABLE `userinfo`(
	`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
	`username` VARCHAR(50) NOT NULL COMMENT '用户名',
	`userpwd` VARCHAR(50) NOT NULL COMMENT '密码',
	`userstate` int  COMMENT '用户状态:0锁定 1正常活动'
);
-- 插入数据 
INSERT INTO `userinfo` VALUES (1,'admin','123123',1);
INSERT INTO `userinfo` VALUES (2,'sjx','123456',1);
INSERT INTO `userinfo` VALUES (3,'ltw','456123',1);
INSERT INTO `userinfo` VALUES (4,'csr','345367',1);
2.3 创建实体类User(Model模型)
package com.xawl.pojo;

/**
 * UserInfo表实体类
 */
public class Userinfo {
    private Long id;
    private String username;
    private String userpwd;
    private int userstate;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
    }

    public int getUserstate() {
        return userstate;
    }

    public void setUserstate(int userstate) {
        this.userstate = userstate;
    }
}
2.4 创建操作数据库的IUserDao类(Model模型)
package com.xawl.idao;

import com.xawl.pojo.Userinfo;
import java.sql.SQLException;

public interface IUserDao {
    public Userinfo findByUsername(String username) throws SQLException;
}
2.5 创建操作数据库的UserDao类(Model模型)
package com.xawl.dao;

import com.xawl.idao.IUserDao;
import com.xawl.pojo.Userinfo;
import com.xawl.util.JDBCUtils;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao implements IUserDao {
    //操作数据库的工具类
    private JDBCUtils jdbcUtils = new JDBCUtils();
    @Override
    public Userinfo findByUsername(String username) throws SQLException {
        //定义sql语句
        String sql = "select * from userinfo where username = ?";
        //执行sql语句
        ResultSet rs = jdbcUtils.executeQuery(sql, username);
        //处理结果
        Userinfo user = null;
        if(rs.next()){
            user = new Userinfo();
            user.setId(rs.getLong("id"));
            user.setUsername(rs.getString("username"));
            user.setUserpwd(rs.getString("userpwd"));
            user.setUserstate(rs.getInt("userstate"));
        }
        //关闭数据库
        jdbcUtils.close();
        return user;
    }
}
2.6 创建数据业务类IUserService(Model模型)
package com.xawl.iservice;

import com.xawl.pojo.Userinfo;
import java.sql.SQLException;

public interface IUserService {
    public Userinfo findByUsername(String username) throws SQLException;
}
2.7 创建数据业务类UserService(Model模型)
package com.xawl.service;

import com.xawl.dao.UserDao;
import com.xawl.idao.IUserDao;
import com.xawl.iservice.IUserService;
import com.xawl.pojo.Userinfo;

import java.sql.SQLException;

public class UserService implements IUserService {
    private IUserDao dao = new UserDao();
    @Override
    public Userinfo findByUsername(String username) throws SQLException {
        return dao.findByUsername(username);
    }
}
2.8 创建处理表单数据的servlet(Controller控制器)
package com.xawl.controller;

import com.xawl.iservice.IUserService;
import com.xawl.pojo.Userinfo;
import com.xawl.service.UserService;
import com.xawl.util.MDigest5;

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.sql.SQLException;

@WebServlet(name = "LoginController",urlPatterns = "/dologin")
public class LoginController extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 实现思路
         * 1.设置编码,设置响应类型编码,解决乱码问题
         * 2.获得数据(用户名、密码、验证码)
         * 3.验证数据的合法性,不合格返回登录页面
         * 4.到数据库查找用户名
         * 5.处理返回结果,登录成功的话,转向成页面,不成功返回登录页面提示用户
         */
        //1.设置编码,设置响应类型编码,解决乱码问题
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //2.获得数据(用户名、密码、验证码)
        String username = request.getParameter("username");
        String userpwd = request.getParameter("userpwd");
        String usercode = request.getParameter("usercode");
        //3.验证数据的合法性,不合格返回登录页面
        //定义出错的标志位
        boolean isErr = false;
        if(username==null || "".equals(username.trim())){
            request.setAttribute("userErr","*用户不能为空");
            isErr = true;
        }
        if(userpwd==null || "".equals(userpwd.trim())){
            request.setAttribute("pwdErr","*密码不能为空");
            isErr = true;
        }
        if(usercode==null || "".equals(usercode.trim())){
            request.setAttribute("codeErr","*验证码不能为空");
            isErr = true;
        }
        else{
            Object usercode1 = request.getSession().getAttribute("usercode");
            //判断验证码是否失效
            if(usercode1==null){
                request.setAttribute("codeErr","*验证码失效,请重新生成验证码");
                isErr = true;
            }else {
                //判断验证码是否正确
                String mycode = usercode1.toString().replace(" ","");
                if(!usercode.equalsIgnoreCase(mycode)){
                    request.setAttribute("codeErr","*验证码不正确");
                    isErr = true;
                }
            }
        }
        //如果不合格,返回登录页面
        if(isErr){
          request.getRequestDispatcher("login.jsp").forward(request,response);
            return;
        }
        //4.到数据库查找用户名
        IUserService userService = new UserService();
        try {
            Userinfo User = userService.findByUsername(username);
            //判断是否存在此用户
            if(User==null){ //此用户不存在
                request.setAttribute("userErr","*用户名不正确");
                isErr = true;
            }
            else{//通过用户名查找到了此用户
                //判断用户是否被锁定
                if(User.getUserstate()!=1){//锁定
                    request.setAttribute("userErr","*此用户名已被锁定");
                    isErr = true;
                }
                else {
                    //密码加密MD5(非对称,不可逆)
                    String usermd5 = MDigest5.getMD5(userpwd + MDigest5.KEY);
                    if (User.getUserpwd().equals(usermd5)) {//密码正确
                        //登录成功,地址重定向
                        response.sendRedirect("main.jsp");
                        return;
                    } else {
                        request.setAttribute("pwdErr", "*密码不正确");
                        isErr = true;
                    }
                }
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            request.setAttribute("loginErr","*连接服务器出错");
            isErr = true;
        }
        //登录不成功
        if(isErr){
            request.getRequestDispatcher("login.jsp").forward(request,response);
            return;
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
2.9 工具类

JDBCUtils

package com.xawl.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class JDBCUtils<E> {
    private Connection conn = null;
    private PreparedStatement psta = null;
    private static Properties properties = null;
    /**
     * 加载数据库驱动
     */
    static {
        try {
            properties = getDataBaseDriver();
            Class.forName(properties.getProperty("classDriver"));
        } catch (ClassNotFoundException e) {
            System.out.println("加载数据库驱动失败。");
        }
    }

    /**
     * 连接数据库,返回Connection对象
     *
     * @throws SQLException
     */
    public Connection getConnection() throws SQLException {
        if (conn == null || conn.isClosed()) {
            conn = DriverManager.getConnection(properties.getProperty("url"),
                    properties.getProperty("username"), properties.getProperty("password"));
        }
        return conn;
    }

    /**
     * 增 删 改
     *
     * @throws SQLException
     */
    public int executeUpdate(String sql, Object... objs) throws SQLException {
        conn = getConnection();
        psta = conn.prepareStatement(sql);
        setParameter(objs);
        return psta.executeUpdate();
    }

    /**
     * 查询,返回ResultSet结果集
     *
     * @throws SQLException
     */
    public ResultSet executeQuery(String sql, Object... objs) throws SQLException {
        conn = getConnection();
        psta = conn.prepareStatement(sql);
        setParameter(objs);
        return psta.executeQuery();
    }

    /**
     * 查询,返回实体结果集
     *
     * @throws SQLException
     */
    public E getEntity(String sql, IRowMapper<E> mapper, Object... objs) throws SQLException {

        conn = getConnection();
        psta = conn.prepareStatement(sql);
        setParameter(objs);
        ResultSet rs = psta.executeQuery();
        if(rs.next())
            return mapper.rowMapper(rs);
        else
            return null;
    }

    /**
     * 查询,返回List集合
     *
     * @throws SQLException
     */
    public List<E> executeQuery(String sql, IRowMapper<E> mapper, Object... objs) throws SQLException {
        conn = getConnection();
        psta = conn.prepareStatement(sql);
        setParameter(objs);
        ResultSet rs = psta.executeQuery();
        List<E> list = new ArrayList<E>();
        while (rs.next()) {
            E e = mapper.rowMapper(rs);
            list.add(e);
        }
        return list;
    }

    /**
     * 关闭数据库
     */
    public void close() {
        try {
            if (psta != null)
                psta.close();
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 给参数?设置值
     */
    private void setParameter(Object... objs) throws SQLException {
        if (objs != null)
            for (int i = 0; i < objs.length; i++) {
                psta.setObject(i + 1, objs[i]);
            }
    }

    /**
     * 从配置文件读取内容 数据库驱动,url,username,password
     */
    private static Properties getDataBaseDriver() {
        // 建立输入流
        InputStream is = JDBCUtils.class.getResourceAsStream("/dbconfig.properties");
        // 创建Properties对象
        Properties dbproperties = new Properties();
        try {
            // 把文件的内容读到集合中
            dbproperties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return dbproperties;
    }
}

interface IRowMapper<E> {
    public E rowMapper(ResultSet rs) throws SQLException;
}

MD5Utils

package com.xawl.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MDigest5 {
    //加密盐
    public static final String KEY="west8309";
    /**
     * 返回MD5加密串(默认32位)
     * @param plainText 需要加密的字符串
     * @return 返回MD5加密串
     */
    private static String md5(String plainText) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(plainText.getBytes());
            byte b[] = md.digest();
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            return buf.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 返回MD5加密串(默认32位)
     * @param plainText 需要加密的字符串
     * @return 返回MD5加密串
     */
    public static String getMD5(String plainText) {
        return md5(plainText);

    }
    /**
     * 返回MD5加密串
     * @param plainText 需要加密的字符串
     * @param subCount 返回加密串的位数(建议在16-32之间)
     * @return
     */
    public static String getMD5(String plainText,int subCount) {
        String str = md5(plainText);
        if(subCount>=16 && subCount <32) {
            return str.substring(0, subCount);
        }
        else {
            return str;
        }
    }

    public static void main(String[] args) {
        //MD5加密
        System.out.println(md5("abc123"+MDigest5.KEY));
    }
}
2.10 权限管理(登录后页面权限管理)

1.保存登录状态

 // 保存登录状态
    request.getSession().setAttribute("loginState","保存状态值");
    //例如:保存用户的实体对象
    request.getSession().setAttribute("loginState",User);

2.登录成功后访问的页面(只有登录成功后才以访问页面),需要做登录状态的认证。

<%
//登录成功后访问的页面(只有登录成功后才以访问页面),需要做登录状态的认证。
    if(session.getAttribute("loginState")==null){
        response.sendRedirect("login.jsp");
    }
%>

3.文件上传

3.1 请求方式get、post
1. 相同点:get、post都能向服务器提交数据
2. 区别:
   get:1)是通过请求头提交数据,数据外露,安全性差。
   ​          2)发送数据大小有限制,大概在2048B(2KB)
   ​          3)发送数据速度快
   ​          4)发送数据类型只能字符串
   ​           5)发送数据可以缓存本地

   post:  1)是通过请求体提交数据,数据不外露,相对安全一些。
   ​           2)发送数据大小理论上没有限制,但不建设上传非常大的数据。
   ​           3)发送数据速度相对慢(当数据量比较大的时候)
   ​           4)发送数据的类型不限制,比如:图片、文件、压缩包、音乐、视频等。
   ​           5) 发送数据不能缓存本地
3.2 单个文件上传

1.创建上传文件的页面(view)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>上传文件</title>
    <style>
        p{
            color: #ff0000;
            font-size: 15px;
        }
    </style>
</head>
<body>
<!--
 enctype="multipart/form-data":二进制数据类型
-->
<form action="doupload2" method="post" enctype="multipart/form-data">
    上传文件:<input type="file" name="upfile"><button type="submit">上传</button>
    <br/>
    <p>
    <%
       if(request.getAttribute("loadErr")!=null)
           out.print(request.getAttribute("loadErr").toString());
       if(request.getAttribute("loadSucess")!=null)
           out.print(request.getAttribute("loadSucess"));
    %>
    </p>
</form>
</body>
</html>

2.创建接受上传文件,并实现上传文件的Servlet(Controller)

package com.xawl.controller;

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

@WebServlet(name = "UploadController",urlPatterns = "/doupload")
//注解:支持接收二进制数据
@MultipartConfig
public class UploadController extends HttpServlet {
    String[] filterFileExt = {"png","jpg","jpeg","gif","bmp"};
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 实现思路
         * 1.设置编码
         * 2.获得上传的文件
         * 3.判断文件大小,超过2MB不允许上传,返回页面提示用户
         * 4.获得上传文件的名称,并另起别名
         * 5.设置保存文件的路径,实现文件的保存
         */
        //1.设置编码
        request.setCharacterEncoding("UTF-8");
        //2.获得上传的文件
        Part upfile = request.getPart("upfile");
        System.out.println("upfile:"+upfile);
        //3.判断文件大小,超过2MB不允许上传,返回页面提示用户
        //一个字节1B:Byte  1KB(1024B)  1MB(1024KB) 1GB(1024MB) 1TB(1024GB)
        if(upfile!=null) {
            long filesize = upfile.getSize() / 1024 / 1024;
            if(filesize>2){//上传文件大于2MB
                //保存出错信息
                request.setAttribute("loadErr","*上传文件天小不允许超过2MB。");
                //页面跳转,请求转发
                request.getRequestDispatcher("upload.jsp").forward(request,response);
                return;
            }
        }else{
            //保存出错信息
            request.setAttribute("loadErr","*请选择上传文件。");
            //页面跳转,请求转发
            request.getRequestDispatcher("upload.jsp").forward(request,response);
            return;
        }
        //4.获得上传文件的名称,并另起别名
        String header = upfile.getHeader("content-disposition");
       // System.out.println("header:"+header);
        String filename = header.substring(header.lastIndexOf("=")+1).replace("\"", "");
        //System.out.println("filename:"+filename);
        if("".equals(filename)){
            //保存出错信息
            request.setAttribute("loadErr","*请选择上传文件。");
            //页面跳转,请求转发
            request.getRequestDispatcher("upload.jsp").forward(request,response);
            return;
        }
        //为另起别名,先获得文件扩展名
        String fileExtension = filename.substring(filename.lastIndexOf("."));
        //===============过滤只能上传图片======================



        //另起别名
        String asFileName = UUID.randomUUID()+fileExtension;
        //5.设置保存文件的路径,实现文件的保存
        //String savePath = "D:\\upload\\";
        String savePath = request.getRealPath("/")+"upload\\";
        //System.out.println(savePath);
        //判断目录是否存在,如果不存在就创建
        File f = new File(savePath);
        if(!f.exists()){
            f.mkdirs();
        }
        //保存
        upfile.write(savePath+asFileName);
        System.out.println("已成功上传文件:"+asFileName);
        //保存出错信息
        request.setAttribute("loadSucess","*已成功上传"+filename+",文件另存为:"+asFileName);
        //页面跳转,请求转发
        request.getRequestDispatcher("upload.jsp").forward(request,response);
    }
}

调用上传文件工具类

package com.xawl.controller;

import com.xawl.util.UpFileUtils;

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

@WebServlet(name = "UploadController",urlPatterns = "/doupload2")
//注解:支持接收二进制数据
@MultipartConfig
public class Upload2Controller extends HttpServlet {
    String[] filterFileExt = {"png","jpg","jpeg","gif","bmp","webp"};
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 实现思路
         * 1.设置编码
         * 2.获得上传的文件
         * 3.判断文件大小,超过2MB不允许上传,返回页面提示用户
         * 4.获得上传文件的名称,并另起别名
         * 5.设置保存文件的路径,实现文件的保存
         */
        //1.设置编码
        request.setCharacterEncoding("UTF-8");
        //2.获得上传的文件
        Part part = request.getPart("upfile");
        //5.设置保存文件的路径,实现文件的保存
        String savePath = request.getRealPath("/")+"upload3"+File.separator;
        //调用上传的工具类
        String asFileName = UpFileUtils.upFile(part,savePath,1024*1024*2);
        if("".equals(asFileName)){
            request.setAttribute("loadErr","*请选择上传文件");
        }
        else if(asFileName.contains("FileSizeErr")){
            request.setAttribute("loadErr","*文件上传失败,上传文件大小不允许超过2MB");
        }
        else{
            //保存信息
            request.setAttribute("loadSucess","*已成功上传,文件另存为:"+asFileName);
        }
        //页面跳转,请求转发
        request.getRequestDispatcher("upload.jsp").forward(request,response);
    }
}

上传文件的工具类

package com.xawl.util;

import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.Random;

public class UpFileUtils {
    /**
     * 上传文件
     * @param part 上传文件数据
     * @param realPath 保存上传文件的绝对路径
     * @return 上传的文件别名
     */
    public static String upFile(Part part, String realPath) throws IOException {
        String asFileName = "";
        String header = part.getHeader("content-disposition");
        System.out.println("header:"+header);
        //修正地方 ,文件为空的验证
        if(header==null || "".equals(header.trim())){
            return asFileName;
        }
        //获得文件名称
        String filename = header.substring(header.lastIndexOf("=")+1).replace("\"", "");
        if(!"".equals(filename.trim())) {
            //为另起别名,先获得文件扩展名
            String fileExtension = filename.substring(filename.lastIndexOf("."));
            //另起别名
            asFileName = System.currentTimeMillis() +""+ new Random().nextInt()+fileExtension;
            //5.设置保存文件的路径,实现文件的保存
            //判断目录是否存在,如果不存在就创建
            File f = new File(realPath);
            if(!f.exists()){
                f.mkdirs();
            }
            //保存
            part.write(realPath+asFileName);
        }
        return asFileName;
    }
    /**
     * 上传文件
     * @param part 上传文件数据
     * @param realPath 保存上传文件的绝对路径
     * @param restFileSize 限制文件的大小,单位:Byte
     * @return 上传的文件别名
     */
    public static String upFile(Part part, String realPath,long restFileSize) throws IOException {
        String asFileName = "";
        //3.判断文件大小,超过restFileSize不允许上传
        //一个字节1B:Byte  1KB(1024B)  1MB(1024KB) 1GB(1024MB) 1TB(1024GB)
        if(part!=null) {
            long filesize = part.getSize();
            if(filesize>restFileSize){//上传文件大于2MB
                return "FileSizeErr";
            }
        }
        String header = part.getHeader("content-disposition");
        //修正地方 ,文件为空的验证
        if(header==null || "".equals(header.trim())){
            return asFileName;
        }
        //获得文件名称
        String filename = header.substring(header.lastIndexOf("=")+1).replace("\"", "");
        if(!"".equals(filename.trim())) {
            //为另起别名,先获得文件扩展名
            String fileExtension = filename.substring(filename.lastIndexOf("."));
            //另起别名
            asFileName = System.currentTimeMillis() +""+ new Random().nextInt()+fileExtension;
            //5.设置保存文件的路径,实现文件的保存
            //判断目录是否存在,如果不存在就创建
            File f = new File(realPath);
            if(!f.exists()){
                f.mkdirs();
            }
            //保存
            part.write(realPath+asFileName);
        }
        return asFileName;
    }
}
3.3 多个文件上传

1.创建上传文件的页面(view)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>多文件上传</title>
    <style>
        div{
            height: 300px;
            margin: 100px 20px;
        }
        span{
            color: red;
            font-size: 15px;
        }
    </style>
</head>
<body>
<div>
    <h1>多文件上传</h1>
<form action="douploads2" enctype="multipart/form-data" method="post">
    文件1<input type="file" name="upfile1">
    <span>
    <%
        if(request.getAttribute("loadErr1")!=null)
            out.print(request.getAttribute("loadErr1").toString());
        if(request.getAttribute("loadSucess1")!=null)
            out.print(request.getAttribute("loadSucess1"));
    %>
        </span>
    <br/>
    文件2<input type="file" name="upfile2">
    <span>
    <%
        if(request.getAttribute("loadErr2")!=null)
            out.print(request.getAttribute("loadErr2").toString());
        if(request.getAttribute("loadSucess2")!=null)
            out.print(request.getAttribute("loadSucess2"));
    %>
        </span>
    <br/>
    文件3<input type="file" name="upfile3">
    <span>
    <%
        if(request.getAttribute("loadErr3")!=null)
            out.print(request.getAttribute("loadErr3").toString());
        if(request.getAttribute("loadSucess3")!=null)
            out.print(request.getAttribute("loadSucess3"));
    %>
        </span>
    <br/>
    文件4<input type="file" name="upfile4">
    <span>
    <%
        if(request.getAttribute("loadErr4")!=null)
            out.print(request.getAttribute("loadErr4").toString());
        if(request.getAttribute("loadSucess4")!=null)
            out.print(request.getAttribute("loadSucess4"));
    %>
        </span>
    <br/>
    文件5<input type="file" name="upfile5">
    <span>
    <%
        if(request.getAttribute("loadErr5")!=null)
            out.print(request.getAttribute("loadErr5").toString());
        if(request.getAttribute("loadSucess5")!=null)
            out.print(request.getAttribute("loadSucess5"));
    %>
        </span>
    <br/>
    <button type="submit">上传多个文件</button>
</form>
</div>
</body>
</html>

2.创建接受上传文件,并实现上传文件的Servlet(Controller)
调用上传文字工具类上传多个文件

package com.xawl.controller;

import com.xawl.util.UpFileUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.Collection;

@WebServlet(name = "UploadsController",urlPatterns = "/douploads2")
@MultipartConfig
public class Uploads2Controller extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 实现思路
         * 1.设置编码
         * 2.获得数据
         * 3.处理多个文件上传
         * 4.保存文件
         */
        // 1.设置编码
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //2.获得数据
        Collection<Part> parts = request.getParts();
        if(parts!=null && parts.size()>0){
            //遍历处理每一个文件
            int index = 0;
            //上传文件的目录
            String realPath = request.getRealPath("/")+"uploads2"+File.separator;
            for (Part part:parts) {
                index++;
                String asFileName = UpFileUtils.upFile(part,realPath);
                if("".equals(asFileName))
                    request.setAttribute("loadErr"+index,"*请选择上传文件");
                else
                   request.setAttribute("loadSucess"+index,"*上传成功,文件另存为:"+asFileName);
            }
            //页面跳转,请求转发
            request.getRequestDispatcher("uploads.jsp").forward(request,response);
        }
    }
}

4.创建工具类注意事项

  1. 创建类

  2. 定义方法

    2.1定义名称(见其名知其义)

    2.2定义参数(方法需要参数才能完成这个功能)

    2.3返回值(方法完成这个功能需要数据)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值