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">登 录</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.创建工具类注意事项
-
创建类
-
定义方法
2.1定义名称(见其名知其义)
2.2定义参数(方法需要参数才能完成这个功能)
2.3返回值(方法完成这个功能需要数据)