一.用mysql建立数据库及其表
create database file set gbk;
create table user(id int not null primary key auto_increment,username varchar(20),password varchar(20));
create table file(fileid int not null primary key auto_increment,filesavename varchar(100),filename varchar(100),filetype varchar(100),filesize varchar(50),fileinfo text,fileuptime varchar(30),fileip varchar(30),filetimes varchar(30),filetag varchar(30));
二.源码实例
1.表现层页面
(1)login.jsp(登录页面)
<input type="hidden" id="path"value="<%=path%>"/>
<div id="logincontent" style="display: none" mce_style="display: none">
<form id="loginForm" action='<%=path%>/login.do' method="post">
<table>
<tr>
<td>
<label>
用户名:
</label>
</td>
<td align='left'>
<input type='text' name='username'/>
</td>
<td>
<p id="errorname"></p>
</td>
</tr>
<tr>
<td>
<label>
密 码:
</label>
</td>
<td align='left'>
<input type='password' name='password' />
</td>
<td />
</tr>
<tr>
<td>
<label>
验证码:
</label>
</td>
<td align='left'>
<input type='text' name='randcode' />
</td>
<td>
<img id="imgCode" style="border: 1px solid #C6D8E5;" mce_style="border: 1px solid #C6D8E5;"
src="<%=path%>/servlet/textBufferedImage?timestampt="
+<%=new java.util.Date().getTime()%> />
</td>
</tr>
<tr>
<td />
<td align='left'>
<input class="button1" type='submit' value='登陆' />
<input class="button1" type='reset' value='重置' />
</td>
<td />
</tr>
</table>
</form>
</div>
</body>
</html>
(2)index.jsp(首页)
<c:if test="${not empty pageList}">
<tbody>
<c:forEach var="file" varStatus="fvs" items="${pageList.dataArray}">
<tr>
<td class="indent">
${fvs.index+1+(pageList.page-1)*pageList.pageSize}
</td>
<td class="indent">
${file.fileName}
</td>
<td class="indent">
<c:choose>
<c:when test="${fn:length(file.fileInfo)>10}">
<a href="javascript:showInfo('${file.fileInfo}')" mce_href="javascript:showInfo('${file.fileInfo}')"style="color:#049ed0;text-decoration:underline;cursor:pointer;">${fn:substring(file.fileInfo, 0, 10)}...</a>
</c:when>
<c:otherwise>
${file.fileInfo}
</c:otherwise>
</c:choose>
</td>
<td >
${file.fileSize}
</td>
<td style="text-align:center" mce_style="text-align:center">
${file.fileTimes}
</td>
<td>
${file.fileIp}
</td>
<td >
${file.fileUptime}
</td>
<td class="indent">
<a
href="javascript:download('${file.fileSavename}')">下载</a>
<a href="javascript:del('${file.fileSavename}')" mce_href="javascript:del('${file.fileSavename}')">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</c:if>
</table>
<c:if test="${not empty pageList}">
${footer}
</c:if>
</form>
</body>
</html>
(3)uploadfile.jsp(文件上传页面)
<%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%>
<%@ page isELIgnored="false"%>
<html>
<head>
<title>上传文件</title>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/style.css">
<script type="text/javascript">
function checkForm(form){
if(form.file1.value.match(/^/s*/)&&form.file2.value.match(/^/s*/)){
document.getElementById("messageid").innerHTML="<img src='<%=request.getContextPath()%>/image/error.gif'/><font color='red'>上传路径不能为空!</font>";
return false;
}else if(!form.file1.value.match(/^/s*/)){
if(form.tag1.value.match(/^/s*/)){
document.getElementById("tag1id").innerHTML="<img src='<%=request.getContextPath()%>/image/error.gif'/><font color='red'>关键字不能为空!</font>";
}
}
return true;
}
</script>
</head>
<body bgcolor="#E1E1E1">
<script type="text/javascript">
history.go(1);
</script>
<center>
<form action="<c:url value='/fileUpDownLoad.do?method=uploadFile'/>" enctype="multipart/form-data" method="post" >
<table width="100%" border="1" class="TableStyle">
<tr class="column_title">
<td >
<font color="#215DC6">●每个文件长度最大允许为20兆!</font><br>
<div id="messageid">
<c:if test="${!empty message}">
<font color='red'>${message}</font>
</c:if>
</div>
<b class="column_title">文件路径1:</b><br>
<input type="file" name="file1" size="60" ><br>
<b class="column_title">文件描述1:</b><br>
<textarea rows="5" cols="69" name="fileinfo1"></textarea><br>
<hr color="#049ED0">
<b class="column_title">文件路径2:</b><br>
<input type="file" name="file2" size="60" ><br>
<b class="column_title">文件描述2:</b><br>
<textarea rows="5" cols="69" name="fileinfo2"></textarea><br>
<input type="submit" value="上传文件"/>
<input type="button" value="返回列表" onclick="window.opener.location.href='<c:url value="/fileUpDownLoad.do?method=getFileList"/>';window.close();"/>
<input type="button" onclick="window.close();"value="关闭">
<br><br>
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
(4)fileinfo.jsp(文件信息预览页面)
(5)zxc.js
2.公用类和javabean
(1)DBAccess.java(数据库连接)
(2)FileInfo.java(文件信息bean)
/** default constructor */
public FileInfo() {
}
/** minimal constructor */
public FileInfo(String fileId) {
this.fileId = fileId;
}
/** full constructor */
public FileInfo(String fileId, String fileSavename,
String fileName, String fileType, String fileSize,
String fileInfo, String fileUptime, String fileIp,long fileTimes,String fileTag) {
this.fileId = fileId;
this.fileSavename = fileSavename;
this.fileName = fileName;
this.fileType = fileType;
this.fileSize = fileSize;
this.fileInfo = fileInfo;
this.fileUptime = fileUptime;
this.fileIp = fileIp;
this.fileTimes=fileTimes;
this.fileTag=fileTag;
}
// Property accessors
public String getFileId() {
return this.fileId;
}
public void setFileId(String fileId) {
this.fileId = fileId;
}
public String getFileSavename() {
return this.fileSavename;
}
public void setFileSavename(String fileSavename) {
this.fileSavename = fileSavename;
}
public String getFileName() {
return this.fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileType() {
return this.fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public String getFileSize() {
return this.fileSize;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
public String getFileInfo() {
return this.fileInfo;
}
public void setFileInfo(String fileInfo) {
this.fileInfo = fileInfo;
}
public String getFileUptime() {
return this.fileUptime;
}
public void setFileUptime(String fileUptime) {
this.fileUptime = fileUptime;
}
public String getFileIp() {
return this.fileIp;
}
public void setFileIp(String fileIp) {
this.fileIp = fileIp;
}
public void setFileTimes(long fileTimes) {
this.fileTimes = fileTimes;
}
public long getFileTimes() {
return fileTimes;
}
public void setFileTag(String fileTag) {
this.fileTag = fileTag;
}
public String getFileTag() {
return fileTag;
}
}
(3)PageListData.java(分页参数分装bean)
for (int i = 1; i <= nTotalPages; i++) {
if (i == nCurrentPage){
pageStr.append("<span style="padding:1px 8px 1px 8px;color:#fff;text-decoration:none!important;background:url(./images/pgback.png) no-repeat center center;" mce_style="padding:1px 8px 1px 8px;color:#fff;text-decoration:none!important;background:url(images/pgback.png) no-repeat center center;">" + i + "</span> ");
} else {
if(nCurrentPage == 1 && (i == 2 || i==3)) {
pageStr.append("<a id='Pagelist' onclick='document.getElementById(/"pages/").value="+ i +";document.getElementById(/"pages/").form.submit();' style="cursor: pointer;" mce_style="cursor: pointer;">" + i + "</a> ");
} else if (i != 1 && nCurrentPage >= 5 && i < nCurrentPage) {
if(first == 0) {
pageStr.append("<span class='pgempty'>...</span>");
first = 1;
}
if(nCurrentPage == nTotalPages && i == nTotalPages - 1) {
pageStr.append("<a id='Pagelist' onclick='document.getElementById(/"pages/").value="+ i +";document.getElementById(/"pages/").form.submit();' style="cursor: pointer;" mce_style="cursor: pointer;">" + i + "</a> ");
}
} else if( i <= nTotalPages && nCurrentPage <= nTotalPages - 4 && i > (nCurrentPage + 1)) {
if(last == 0) {
pageStr.append("<span class='pgempty'>...</span>");
last = 1;
}
if(i==nTotalPages){
pageStr.append("<a id='Pagelist' onclick='document.getElementById(/"pages/").value="+ i +";document.getElementById(/"pages/").form.submit();' style="cursor: pointer;" mce_style="cursor: pointer;">" + i + "</a> ");
}
} else {
pageStr.append("<a id='Pagelist' onclick='document.getElementById(/"pages/").value="+ i +";document.getElementById(/"pages/").form.submit();' style="cursor: pointer;" mce_style="cursor: pointer;">" + i + "</a> ");
}
}
}
if (nCurrentPage < nTotalPages)
{
pageStr.append("<a class='nextpage'style='cursor: pointer;' onclick='document.getElementById(/"pages/").value=" + nNextPage + ";document.getElementById(/"pages/").form.submit();'><strong>" + next +"</strong></a></center>");
}
pageStr.append("</p>");
pageStr.append("<input type='hidden' value='" + nCurrentPage
+ "' name='pages' id='pages' />");
pageStr.append("<input type='hidden' value='" + pageSize
+ "' name='pageSize' id='pageSize' />");
return pageStr.toString();
}
public String getFooter1(HttpServletRequest request) {
StringBuffer pageStr = new StringBuffer("");
pageStr.append("<center><p class='pages'>");
int totalPages = getPageCount(); //总页数
int currentPage = getPage(); //当前页
int totalcount=getCount();//总记录数
int prevPage = getPage() - 1; //上一页
int nextPage = getPage() + 1; //下一页
pageStr.append("<span style="color:#049ed0;" mce_style="color:#049ed0;">共有"+totalcount+"条记录</span> ");
pageStr.append("<span style="color:#049ed0;" mce_style="color:#049ed0;">第"+currentPage+"页/共"+totalPages+"页</span> ");
if(currentPage>1)
pageStr.append("<span><a style="cursor: pointer;text-decoration:underline;color:#049ed0;" mce_style="cursor: pointer;text-decoration:underline;color:#049ed0;"onclick='document.getElementById(/"pages/").value=1;document.getElementById(/"pages/").form.submit();'>首页</a></span> ");
if(currentPage==1)
pageStr.append("<span style="color:#049ed0;" mce_style="color:#049ed0;">首页</span> ");
if(currentPage>1)
pageStr.append("<span><a style="cursor: pointer;text-decoration:underline;color:#049ed0;" mce_style="cursor: pointer;text-decoration:underline;color:#049ed0;" onclick='document.getElementById(/"pages/").value="+prevPage+";document.getElementById(/"pages/").form.submit();'>上一页</a></span> ");
if(currentPage<=1)
pageStr.append("<span style="color:#049ed0;" mce_style="color:#049ed0;">上一页</span> ");
if(currentPage<totalPages)
pageStr.append("<span><a style="cursor: pointer;text-decoration:underline;color:#049ed0;" mce_style="cursor: pointer;text-decoration:underline;color:#049ed0;" onclick='document.getElementById(/"pages/").value="+nextPage+";document.getElementById(/"pages/").form.submit();'>下一页</a></span> ");
if(currentPage>=totalPages)
pageStr.append("<span style="color:#049ed0;" mce_style="color:#049ed0;">下一页</span> ");
if(currentPage<totalPages)
pageStr.append("<span><a style="cursor: pointer;text-decoration:underline;color:#049ed0;" mce_style="cursor: pointer;text-decoration:underline;color:#049ed0;" onclick='document.getElementById(/"pages/").value="+totalPages+";document.getElementById(/"pages/").form.submit();'>末页</a></span> ");
if(currentPage==totalPages)
pageStr.append("<span style="color:#049ed0;" mce_style="color:#049ed0;">末页</span> ");
pageStr
.append("<span style="color:#049ed0;" mce_style="color:#049ed0;">跳转至第:<input type='text' value='"
+ currentPage
+ "'id='jumpPageBox' size='4' onblur='checkCurrentPage(document.getElementById(/"jumpPageBox/").value,"+totalPages+")'/>页<input style="color:#049ed0;" mce_style="color:#049ed0;" type='button' value='跳转' onclick='document.getElementById(/"pages/").value=document.getElementById(/"jumpPageBox/").value;document.getElementById(/"pages/").form.submit();'/></span>");
pageStr.append("</p></center>");
pageStr.append("<input type='hidden' value='" + currentPage
+ "' name='pages' id='pages' />");
pageStr.append("<input type='hidden' value='" + pageSize
+ "' name='pageSize' id='pageSize' />");
return pageStr.toString();
}
}
(4)StringHandler.java(字符串处理)
(5)User.java
(6)TextBufferedImage.java(验证码servlet)
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
Random random = new Random();
g2d.setColor(getRandColor(160,200));
g2d.setFont(getFont());
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g2d.drawLine(x,y,x+xl,y+yl);
}
// 取随机产生的认证码(4位数字)
String sRand="";
for (int i=0;i<4;i++){
String rand = randomPassword.substring(i, i+1);
sRand+=rand;
// 将认证码显示到图象中
g2d.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g2d.drawString(rand,14*i+12,17);
}
g2d.dispose();
return bufferedImage;
}
private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色
Random random = new Random();
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
private Font getFont() {
Random random = new Random();
Font font[] = new Font[5];
font[0] = new Font("Ravie", Font.PLAIN, 20);
font[1] = new Font("Antique Olive Compact", Font.PLAIN, 20);
font[2] = new Font("Forte", Font.PLAIN, 20);
font[3] = new Font("Wide Latin", Font.PLAIN, 20);
font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 20);
return font[random.nextInt(5)];
}
/**
* 产生随机码(字母+数字)
*
* @param length
* 随机码长度
* @return 随机码
*/
private String getRandom(int length) {
String randomCode = "";
for (int i = 0; i < length; i++) {
randomCode += getRandChar();
}
return randomCode;
}
public String getRandChar() {
int rand = (int) Math.round(Math.random() * 2);
long itmp = 0;
char ctmp = '/u0000';
// 根据rand的值来决定来生成一个大写字母、小写字母和数字
switch (rand) {
// 生成大写字母
case 1:
itmp = Math.round(Math.random() * 25 + 65);
ctmp = (char) itmp;
return String.valueOf(ctmp);
// 生成小写字母
case 2:
itmp = Math.round(Math.random() * 25 + 97);
ctmp = (char) itmp;
return String.valueOf(ctmp);
// 生成数字
default:
itmp = Math.round(Math.random() * 9);
return String.valueOf(itmp);
}
}
}
3.数据层
(1)UserDAO.java
(2)FileDAO.java
}
return result;
}
}
4.业务逻辑层
(1)LoginAction.java
}
}
(2)FileUpDownLoadAction.java
5.过滤器
(1)EncodingFilter.java(处理字符编码)
(2)UserLoginFilter.java(session过滤器)
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
String requesturi = httpServletRequest.getRequestURI();
HttpSession session = httpServletRequest.getSession();
Object currentUser = session.getAttribute("user");
if (currentUser == null
&& !requesturi.endsWith("/login.do")
&& !requesturi.endsWith("/logout.do")
&& !requesturi.endsWith("/login.jsp")
&& !requesturi.endsWith(httpServletRequest.getContextPath()
+ "/")
) {
httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login.jsp");
re