簡單實現從瀏覽器下載檔案
阿新 • • 發佈:2018-12-07
最容易出錯到點
- JDBC連線資料庫卻忘記導包:mysql-connector-java-5.1.7-bin.jar
- 使用Servlet卻忘記導tomcat的包:servlet-api.jar,這個包在tomcat/lib中找到
- 自己手寫Servlet卻忘記到web.xml中寫配置
登陸頁面實現
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head >
<body>
<form action = "Login_Servlet" method = "get">
使用者名稱:<input type = "text" name = username /><br>
密碼:<input type = "text" name = password /><br>
<input type = "submit" value = "登陸">
<input type = "button" value = "註冊" onclick="javascrtpt:window.location.href='register.html'">
</ form>
</body>
</html>
登陸對應的Servlet
package vipdownload;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.servlet. ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Login_Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 制定編碼表
resp.setContentType("text/html;charset=utf-8");
// 獲取頁面登入名與密碼
ArrayList<String> list = new ArrayList<>();
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
String key = (String) parameterNames.nextElement();
list.add(req.getParameter(key));
}
// 校驗登入名與密碼是否存在於資料庫中
Connection conne = JDBC_util.getConnetion();
PreparedStatement pst = null;
String sql = "select * from user where username=? && password=?";
try {
pst = conne.prepareStatement(sql);
pst.setString(1, list.get(0));
pst.setString(2, list.get(1));
ResultSet resultSet = pst.executeQuery();
if (resultSet.next()) {
// 存在,登陸成功,跳轉下載頁面
resp.setStatus(302);
resp.setHeader("Location", "download.html");
} else {
// 不存在,登入失敗
resp.getWriter().write("登入失敗");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBC_util.release(conne, pst);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
註冊頁面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>會員註冊</title>
<script>
//獲取焦點事件
function checkTips(spanId, msg) {
var span = document.getElementById(spanId);
span.innerHTML = msg;
}
//失去焦點事件,校驗使用者名稱
function checkUserName() {
var username = document.getElementById("username").value;
var span = document.getElementById("span_username");
if (username.length > 13 || username.length < 3) {
span.innerHTML = "<font color = 'red' size = '2'>使用者名稱長度不符合</font>";
} else {
span.innerHTML = "<font color = 'red' size = '2'>使用者名稱可用</font>";
return true;
}
}
//失去焦點事件,校驗密碼
function checkPassWord() {
var password = document.getElementById("password").value;
var span = document.getElementById("span_password");
if (password.length < 6) {
span.innerHTML = "<font color='red' size='2'>密碼長度小於6位</font>";
} else {
span.innerHTML = "<font color='red' size='2'>密碼可用</font>";
return true;
}
}
//失去焦點事件,校驗確認密碼
function checkRePassWord() {
var repassword = document.getElementById("repassword").value;
var password = document.getElementById("password").value;
var span = document.getElementById("span_repassword");
if (password == repassword) {
span.innerHTML = "<font color = 'red' size = '2'>密碼一致</font>"
return true;
} else {
span.innerHTML = "<font color = 'red' size = '2'>密碼不一致</font>"
}
}
//表單提交事件
function checkFrom() {
var flag = checkUserName() && checkPassWord() && checkRePassWord();
if (flag) {
return flag;
}
return false;
}
</script>
</head>
<body>
<form action="Register_Servlet" method="get" onsubmit="checkFrom()">
使用者名稱:<input type="text" id="username" name="username"
onfocus="checkTips('span_username','使用者名稱取值為3-12個字元')"
onblur="checkUserName()" onkeyup="checkUserName()"><span id="span_username"></span><br>
密碼:<input type="text" name="password"
id=password onfocus="checkTips('span_password','密碼長度必須大於等於6')"
onblur="checkPassWord()" onkeyup="checkPassWord()"><span id="span_password"></span><br>
確認密碼:<input type="text" name="repassword"
id=repassword onfocus="checkTips('span_repassword','密碼必須一致')"
onkeyup="checkRePassWord()" onblur="checkRePassWord()"><span id="span_repassword"></span><br>
<input type="submit" value="註冊">
</form>
</body>
</html>
註冊對應到Servlet
package vipdownload;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Enumeration;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//註冊校驗
public class Register_Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 判斷使用者名稱是否符合規則
resp.setContentType("text/html;charset=utf-8");
// 獲取資料連線物件
Connection conne = JDBC_util.getConnetion();
//資料庫操作物件
PreparedStatement pst = null;
//資料庫返回資料物件
ResultSet rs = null;
try {
//sql查詢語句
String sql = "select * from user where username=?";
//預處理sql語句
pst = conne.prepareStatement(sql);
//設定第一個?的值
pst.setString(1, req.getParameter("username"));
System.out.println(req.getParameter("username"));
//獲取資料庫返回值
rs = pst.executeQuery();
//判斷是否存在資料
if (rs.next()) {
resp.getWriter().write("使用者名稱已存在!");
} else {
resp.getWriter().write("註冊成功!");
//將註冊資訊儲存到資料庫
String username = req.getParameter("username");
String password = req.getParameter("password");
//SQL語句
String insertSQL = "insert into user values(null,?,?,null)";
PreparedStatement pst2 = conne.prepareStatement(insertSQL);
//給佔位符賦值
pst2.setString(1, username);
pst2.setString(2, password);
//將資料插入資料庫
pst2.executeUpdate();
//重新定向url
resp.setStatus(302);
//指向新到url地址
resp.setHeader("Location", "download.html");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//釋放資源
JDBC_util.release(conne, pst, rs);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
下載頁面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href = "DownLoad_Servlet?name=我很幸福.mkv">我很幸福.mkv</a><br>
<a href = "DownLoad_Servlet?name=歌詞.cfg">歌詞.cfg</a><br>
<a href = "DownLoad_Servlet?name=美女.jpg">美女.jpg</a><br>
</body>
</html>
下載頁面對應的Servlet
package vipdownload;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownLoad_Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setContentType("text/html;charset=utf-8");
// 獲取頁面元素對應到檔名
String filename = req.getParameter("name");
// 獲取檔案在tomcat中到絕對路徑
String path = getServletContext().getRealPath("DownLoad/" + filename);
// 設定編碼格式,get帶過來到是UTF-8格式的,tomcat向客戶端寫出時ISO-8859-1格式的
// filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
//效果同上
filename = URLEncoder.encode(filename, "UTF-8");
/* // 獲取瀏覽器型別
String clientType = req.getHeader("User-Agent");
// 根據不同的瀏覽器設定編碼表
if (clientType.contains("Firefox")) {
// 如果瀏覽器是Firefox火狐
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?UTF-8?B?" + new String(base64Encoder.encode(filename).getBytes("UTF-8")) + "?=";
} else {
// 如果瀏覽器實IE或者chrome
filename = URLEncoder.encode(filename, "UTF-8");
}*/
// 設定響應頭,告知瀏覽器下載檔案
resp.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 下載檔案
InputStream is = new FileInputStream(path);
OutputStream os = resp.getOutputStream();
byte[] arr = new byte[1024 * 8];
int len = 0;
while ((len = is.read(arr)) != -1) {
os.write(arr, 0, len);
}
os.close();
is.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}