RT,大一末的课程设计,给那些刚入门的同学看看,或许能为你们绕开弯路提供一点捷径
以下是我的文档,源码和数据库打包在了CSDN的下载里
下载链接:http://download.csdn.net/detail/hacke2/4744171
1.可行性分析
web开发技术是Internet应用的一个重要方而,而JSP又是web开发的最先进的技术,是当前web开发人员的首选技术。
随着网络技术的日益普及和信息化建设的重视,网络硬盘是一种新型安全的网络存储系统,已越来越受到.人们的重视和喜欢,主要适用个人文件存储,可以用作个人的一个网络U盘,网络硬盘是一块专属的存储空间,用户通过上网登录网站的方式,可以方便上传、卜载文件。只要能上网就可以用网络硬盘登录到服务器上进行个人文件的上传、删除等操作,随时随地存储自己的个人文件。
2.需求分析
2.1 系统模块设计
本系统做为一个较完整的网站,主要系统的主要模块如下:
·会员注册 新会员要登录该网站享有对自己的资源进行下载或者上传资料就必须的有自己的会员号码。会员在注册的时候需要填写会员名、登录密码、确认密码等信息。如果该会员已经存在与该系统的会员信息数据库中,则提示注册失败。
·会员登录 会员根据自己注册的会员号码和密码登录该系统。首次登陆会在TOMCAT目录里建一个以自己用户名命名的目录。
·修改密码 会员为了自己的信息的安全可以对自己的注册时候填写的密码进行修改。
·上传文件 上传自己的文件,大小格式均有限制。
·下载文件 下载你自己的文件
2.2 数据库设计
本系统使用MySQL数据库建立了一个userinfo数据库,表用来存储会员的信息,还有一个admin来存储管理员账号密码。
2.2.1 userinfo表的字段
会员的注册信息存入userinfo表中,userinfo的主键是id,标准的字段说明如下:
·id 会员注册时自动增长的识别码
·userName 会员用户名
·userPassword 会员密码
2.2.2 userinfo的详细设计如图2-1所示
图 2-1
2.2.3 admin表的字段
管理员的注册信息存入admin表中,admin的主键是adminName,默认值为admin,键adminPassword默认值为admin888标准的字段说明如下:
·adminName 管理员账号
·adminPassword 管理员密码
2.2.4 admin的详细设计如图2-2所示
图2-2
3.系统管理
3.1设计说明
本设计使用的JSP引擎是Tomcat6.0,使用IDE为 MyEclipse8.0。
连接数据库使用的建立连接桥来连接数据库,因此在设计系统之前在本地数据源新建mytest的系统数据源,方便实验Java连接数据库。
3.2 页面管理
本系统所有的JSP页面都保存在KO目录中。
用户可以通过在浏览器的地址栏中输入http://127.0.0.1:8080/KO/index.jsp来访问该主页。
3.3.3 JavaBean
本系统使用的Javabean的包名均为com.其中,BaseConn.java为链接数据库的JDBC,CheckAdmin.java为检查管理员,CheckLogin.java为检查普通用户
3.4后台设计
后台主要为注册用户的相关操作,比如增加,删除,修改,搜索等
4.模型图
5.会员注册
要登录该网站就必须要有会员名,因此如果没有成为会员的用户必须注册会员。在填写注册信息的使用必须填写会员名,登录密码。
5.1 模型(Javabean)
描述注册信息的Javabean中要有会员的名称、密码、年龄、性别、邮箱、电话号码以及一个注册提示信息。
在CheckLogin.java对这些信息进行描述。具体代码如下:
package com;
import java.sql.*;
public class CheckLogin {
/**
* 检测用户登录信息
* @param String userName
* 用户登录的用户名
* @param String userPassword
* 用户登录的密码
* @return String
* 返回一个字符串:如果用户名已经在数据库存在并且用户输入的密码也正确
返回字符串 SUCCESS_LOGIN
* 如果用户名已经在数据库存在但是输入的密码不正确
返回字符串 WRONG_PASSWROD
* 如果用户名不存在返回字符串 NONE_USER
* */
public String checklogin(String userName,String userPassword)
throws SQLException,ClassNotFoundException
{
BaseConn conn = null;
try
{
conn = new BaseConn();
//创建一个用预处理的SQL语句
String sql = "select * from userinfo where userName=?";
//创建一个预处理SQL对象
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1,userName);
//从数据库中查询该用户名是否在数据库存在
ResultSet rs = conn.executeQuery();
if(rs.next())
{
if(rs.getString("userPassword").equals(userPassword))
{
return "SUCCESS_LOGIN";
}
else
return "WRONG_PASSWORD";
}
else
return "NONE_USER";
}catch(SQLException ex)
{
ex.printStackTrace();
throw ex;
}catch(ClassNotFoundException ex)
{
ex.printStackTrace();
throw ex;
}
finally
{
conn.closeDB(); //关闭数据库连接,释放JDBC资源
}
}
/**
* 如果是新用户时,将用户登录用户名和密码保存到数据库中
* */
public boolean saveToDataBase(String userName,String userPassword)
throws SQLException,ClassNotFoundException
{
BaseConn conn = null;
try
{
conn = new BaseConn();
String sql = "insert into userinfo(userName,userPassword) values(?,?)";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1,userName);
ps.setString(2,userPassword);
conn.executeUpdate();
return true;
}catch(SQLException ex)
{
ex.printStackTrace();
throw ex;
}catch(ClassNotFoundException ex)
{
ex.printStackTrace();
throw ex;
}finally
{
conn.closeDB(); //关闭数据库连接,释放JDBC资源
}
}
}
5.2 视图(JSP页面)
本模块有两个视图,register.jsp与register_post.jsp.一个提供用户填写注册信息,一个提交用户提供注册信息,把会员填写的基本信息写入userinfo表。 注册页面的效果图如图5-1所示
图 5-1
该页面提交给了register_post.jsp
register_post.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@page import="com.CheckLogin"%>
<jsp:useBean id="check" class="com.CheckLogin"/>
<html>
<head>
<title>注册吧^_^</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<style>
<body>
<% request.setCharacterEncoding("gbk");
//获取用户昵称
String userName = request.getParameter("userName");
//获取用户密码
String userPassword=request.getParameter("userPassword");
//将获取到的用户登录信息与数据库中保存的用户信息进行比较
String loginMsg = check.checklogin(userName,userPassword);
if(loginMsg.equals("SUCCESS_LOGIN"))
{
out.println("该用户已经存在,请重新选择用户名");
}
else if(loginMsg.equals("WRONG_PASSWORD"))
{
out.println("该用户已经存在,请重新选择用户名");
}
else if(loginMsg.equals("NONE_USER"))
{
boolean sf = check.saveToDataBase(userName,userPassword);
if(sf)
{
out.println("注册成功");
%>
<br>
<a href="login.jsp">返回登录</a>
<%
}
}
else
{
out.println("该用户名已经存在,请选择另一个用户名注册");
}
%>
</body>
</html>
6.会员登录
用户在此页面输入自己的用户名、密码登录该网站,由于本设计只设计了会员管理系统,模块之中只有个人中心是有效模块。会员进行个人中心能进行相关操作。
6.1 模型(Javabean)
此意注册为同一Javabean,CheckLogin.java
6.2 视图(JSP视图)
本模块有两个个视图:login.jsp提供给用户填写登录信息,checkLogin.jsp是在验证并提交用户填写的登录信息,在主页面提供给会员该网站的全部功能。
登录页面的效果图如图6-1所示
图 6-1
其中,checkLogin.jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<jsp:useBean id="check" class="com.CheckLogin"/>
<% request.setCharacterEncoding("GBK");
//获取用户昵称
String userName = request.getParameter("userName");
//获取用户密码
String userPassword=request.getParameter("userPassword");
//将获取到的用户登录信息与数据库中保存的用户信息进行比较
String loginMsg = check.checklogin(userName,userPassword);
if(loginMsg.equals("SUCCESS_LOGIN")) {
session.setAttribute("user",userName);//建立session对象以便以后对登陆作验证
response.sendRedirect("welcome.jsp");
}
else if(loginMsg.equals("WRONG_PASSWORD"))
{
out.println("你输入的用户名或密码错误,请检正后重新输入");
}
else if(loginMsg.equals("NONE_USER"))
{
out.println("用户名不存在!!!");
}
%>
<html><<head><link rel="stylesheet" type="text/css" href="styles.css"></head><body><a href=login.jsp>返回</a></body></html>
7.主页面
设为主页面为welcome.jsp
登陆后的显示为图7.1
具体代码如下:
welcome.jsp
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="GB18030" import="java.sql.*,java.util.*,java.io.*"%>
<%@include file="conn.jsp"%>
<%@include file="config.jsp"%>
<%
//当用户登入此页时,到根目录box目录新建一个以此用户名为命名的目录
String Save_Location=getServletContext().getRealPath("/")+"box//";
try{
if (!(new java.io.File(Save_Location).isDirectory())) {//如果文件夹不存在
new java.io.File(Save_Location).mkdir(); //不存在 文件夹,则建立此文件夹
new java.io.File((Save_Location)+id+"//").mkdir(); //创建文件夹,命名为当前用户的名字
}
else {//存在excel文件夹,则直接建立此文件夹
new java.io.File((Save_Location)+id+"//").mkdir(); //创建文件夹,命名为当前用户的名字
}
}catch(Exception e){
e.printStackTrace(); //创建文件夹失败
out.print("error");
return;
}
File userBox=new File((Save_Location)+id+"//");
File userBoxfile[]=userBox.listFiles();
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>欢迎使用网络硬盘</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<br />
<table width="809" height="204" border="1" align="center">
<tr>
<td height="26" align="left">
<font color="red">欢迎
<%=session.getAttribute("user")%>的到来!</font><font color="#0000ff"> </font> <a href="update.jsp?userName=<%=session.getAttribute("user")%>">修改密码</a> <a href="logout.jsp">退出登录</a>
<br>
</td>
</tr>
<tr>
<td height="58" align="left" valign="top"><a href="box_upload.jsp"><img src="images/box-upload.jpg" width="131" height="45"></a>
<% for(int i=0;i<userBoxfile.length;i++){%>
<tr><td height="22">
<p><font color="#FF00FF"><%=userBoxfile[i].getName()%></font></p></td><td height="25">
<span style="font-size: 9pt">
<a href="box_download.jsp?filename=<%=userBoxfile[i].getName()%>" target=_top>
<font color="#0A9EE4">下载</font></a></span></td>
<td height="25"><span style="font-size: 9pt">
<a href="box_del.jsp?action=confirm&filename=<%=userBoxfile[i].getName()%>" target=_top>
<font color="#0A9EE4">删除</font></a></span>
</td>
</tr>
<%} %>
</td>
</tr>
<tr align="center">
<td height="26" align="center"> <font color="#c0c0c0">
版本信息:重庆理工大学软件工程课程设计软件二班王兴龙</font></td>
</tr>
</table>
</body>
</html>
8.上传功能
8.1上传功能运用jspSmartUpload.jar组件,方便,灵活
上传页面用box_upload_do.jsp
具体代码如下:
<%@ page contentType="text/html; charset=gbk" language="java"
import="java.util.*,com.jspsmart.upload.SmartUpload" errorPage=""%>
<%@ include file="conn.jsp"%>
<%@ include file="config.jsp"%>
<%
// 新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 上传初始化
su.initialize(pageContext);
// 设定上传限制
// 1.限制每个上传文件的最大长度。
su.setMaxFileSize(5000000);
// 2.限制总上传数据的长度。
su.setTotalMaxFileSize(150000000);
// 3.设定允许上传的文件(通过扩展名限制)。
su.setAllowedFilesList("rar,zip,txt.mp3,jpg,gif,ppt,doc,xls,bmp,wav,mid,dat,ppt");
// 4.设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,jsp,htm,html扩展名的文件和没有扩展名的文件。
// su.setDeniedFilesList("exe,bat,jsp,htm,html,asp,php,com");
// 上传文件
su.upload();
// 将上传文件全部保存到指定目录
String cqutroot = dirPath.replace('\\', '/');
su.save(cqutroot + "box/" + id);
out.print("<script>");
out.print("alert('文件上传成功!');");
out.print("location.href='welcome.jsp';");
out.print("</script>");
%>
上传页面为upload.jsp效果为图8.1
图8.1
该页面为POST方式,提交到了box_upload_do.jsp,代码如下:
<%@ page contentType="text/html; charset=gbk" language="java"
import="java.util.*,com.jspsmart.upload.SmartUpload" errorPage=""%>
<%@ include file="conn.jsp"%>
<%@ include file="config.jsp"%>
<%
// 新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 上传初始化
su.initialize(pageContext);
// 设定上传限制
// 1.限制每个上传文件的最大长度。
su.setMaxFileSize(5000000);
// 2.限制总上传数据的长度。
su.setTotalMaxFileSize(150000000);
// 3.设定允许上传的文件(通过扩展名限制)。
su.setAllowedFilesList("rar,zip");
// 4.设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,jsp,htm,html扩展名的文件和没有扩展名的文件。
su.setDeniedFilesList("exe,bat,jsp,htm,html,asp,php,com");
// 上传文件
su.upload();
// 将上传文件全部保存到指定目录
String cqutroot = dirPath.replace('\\', '/');
su.save(cqutroot + "box/" + id);
out.print("<script>");
out.print("alert('文件上传成功!');");
out.print("location.href='welcome.jsp';");
out.print("</script>");
%>
9.下载文件
9.1 jspSmartUpload.jar下载对中文支持不是很好,所以我用I/O
box_download.jsp,具体代码如下:
<%@ page language="java" contentType="text/html; charset=gbk" import="com.jspsmart.upload.*,java.sql.*,java.io.*" %>
<%@ include file="config.jsp"%>
<%@ include file="conn.jsp"%>
<%
java.io.BufferedInputStream bis=null;
java.io.BufferedOutputStream bos=null;
try{
String filename=request.getParameter("filename");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));
bis =new java.io.BufferedInputStream(new java.io.FileInputStream(config.getServletContext().getRealPath("box/"+id+"/" + filename)));
bos=new java.io.BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff,0,bytesRead);
}
}
catch(Exception e){
e.printStackTrace();
}
finally {
if (bis != null)bis.close();
if (bos != null)bos.close();
}
%>
10.删除文件
用户上传错误时需删除文件。
box_del.jsp,具体代码如下
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="GB18030" import="java.sql.*,java.util.*,java.io.*"%>
<%@ include file="config.jsp"%>
<%@ include file="conn.jsp"%>
<%
String cqutroot=dirPath.replace('\\','/');//将dirPath的"\\"全替换为"/"
try {
//处理成中文字符
String filename=codeToString(request.getParameter("filename"));
String action=codeToString(request.getParameter("action"));
if(filename==null)
{
out.print("<script>");
out.print("alert('filename错误!');");
out.print("location.href='welcome.jsp';");
out.print("</script>");
}
if(action==null)
{
out.print("<script>");
out.print("alert('action错误!');");
out.print("location.href='box.jsp';");
out.print("</script>");
}
action=request.getParameter("action");
if(action.equals("del"))
{
File delfile=new File(cqutroot+"box/"+id+"/"+filename);
delfile.delete();
out.print("<script>");
out.print("alert('删除成功!');");
out.print("location.href='welcome.jsp';");
out.print("</script>");
}
if(action.equals("confirm"))
{
%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>确认删除文件?</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<table width="646" height="345" border="1" align="center">
<tr>
<td><p align="center"><font color="#ff0000"><strong>确认删除<%=filename%>?</strong></font></p></td>
</tr>
<tr>
<td><div align="center">
<input type="button" value="提交" name="B1" onClick="javascript:location.href='box_del.jsp?action=del&filename=<%=filename%>';">
<input type="button" value="返回" name="B2" onClick="javascript:location.href='welcome.jsp';">
</div></td>
</tr>
</table>
</body>
</html>
<%
}
else
{
out.print("<script>");
out.print("location.href='welcome.jsp';");
out.print("</script>");
}
}
catch(Exception e)
{
out.print("<script>");
out.print("location.href='welcome.jsp';");
out.print("</script>");
}
%>
11.后台系统
后台我做了这几个页面:管理员登陆:admin_login.jsp;检查管理员是否正确:admin_check.jsp;后台首页:admin.jsp;用户删除:user_del.jsp;用户密码修改:user_edit.jsp;修改保存:user_save.jsp.搜索功能:search.jsp
12.验证是否已经真正登陆
为了防止不通过验证就登陆到操作界面,做出验证页面,主要是检查session是否存在。
其中,conn.jsp是普通用户,admin_conn.jsp是管理员的。具体代码如下:
Conn.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String id = (String)session.getAttribute("user");
if (null==id || id.equals("")) {
out.print("<script language='javascript'>alert('请先登录系统!');window.location = 'login.jsp';</script>");
}
%>
admin_conn.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String admin_id = (String)session.getAttribute("admin");
if (null==admin_id || admin_id.equals("")) {
out.print("<script language='javascript'>alert('请先登录系统!');window.location = 'admin_login.jsp';</script>");
}
%>
13.辅助页面
获取程序文件夹的绝对路径功能和中文字符串的转换是好多页面都共有的,存在一个页面调用起来比较方便,代码如下
Config.jsp
<%@ page language="java" contentType="text/html; charset=gbk"%>
<%
//获取程序文件夹的绝对路径
String dirPath=application.getRealPath(request.getRequestURI());
dirPath=dirPath.substring(0,dirPath.lastIndexOf('\\')+1);
dirPath=dirPath.substring(0,dirPath.lastIndexOf('\\'));
dirPath=dirPath.substring(0,dirPath.lastIndexOf('\\')+1);
%>
<%!
//定义处理中文字符串的函数
public String codeToString(String str01) throws Exception
{//处理中文字符串的函数
String s=str01;
if(true)
{
try
{
byte tempB[]=s.getBytes("ISO-8859-1");
s=new String(tempB);
}
catch(Exception e)
{
s=str01;
}
}
return s;
}
%>
14.退出系统
会员在网站中可以选择退出系统,logon.jsp负责销毁用户的session对象,导致登录失效,用户能够随时退出系统。
logon.jsp的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
session.invalidate();
response.sendRedirect("login.jsp");
%>
15.设计总结
通过本次设计,基本掌握了WEB设计的页面设计,首次接触学习并使用JSP,JAVABEAN以及文件的上传下载,数据的连接等知识,对以后的深入学习打下了基础。就这个设计而言,由于时间以及个人能力的限制,在网站编写的过程中有很多的不足。许多老师要求的功能都没有达到,比如文件的搜索与共享等,只是能初步实现功能。在这方面应该加强学习,争取取得好的成绩。最后谢谢老师给我们这次的课程设计锻炼的机会。
参考文献:
[1]王柯柯,Web网页设计技术,机械工业出版社,2011;
[2]马建红,李占波,JSP应用与开发技术,2011;
[3]常建功,Java Web典型模块与项目实战大全,2010;
[4]史晓红,章立, Dreamweaver CS4网页设计与实训教程,2010