java:struts框架(网路静态U盘项目)
1.网络静态U盘项目:

struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.multipart.maxSize" value="209715200"></constant>
<package name="udisk" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results> <!-- 配置struts2的异常映射 -->
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings> <action name="user-*" class="cn.zzsxt.udisk.action.UserinfoAction" method="{1}">
<result type="redirect">/login.jsp</result>
<result name="login" type="redirect">/login.jsp</result>
<result name="list" type="redirectAction">file-list</result>
</action>
<action name="file-*" class="cn.zzsxt.udisk.action.FileinfoAction" method="{1}">
<result name="list">/list.jsp</result>
<result name="success" type="redirectAction">file-list</result>
<!-- 下载 -->
<result type="stream" name="download">
<!-- inputName="输入流的名称",回掉action中getInputStream()方法获取输入流 -->
<param name="inputName">inputStream</param>
<!--contentType="文件类型" application/octet-stream代表对下载类型不限制 -->
<param name="contentType">application/octet-stream</param>
<!-- attachment:以附件方式保存 filename="保存的文件名称" ${fileName}获取action中fileName属性的值 -->
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>
</package>
</struts>
FileinfoAction:
package cn.zzsxt.udisk.action; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; import cn.zzsxt.udisk.model.Fileinfo;
import cn.zzsxt.udisk.model.Userinfo;
import cn.zzsxt.udisk.service.IFileinfoService;
import cn.zzsxt.udisk.service.impl.FileinfoServiceImpl; public class FileinfoAction extends ActionSupport implements SessionAware,ServletRequestAware{
private IFileinfoService fileinfoService =new FileinfoServiceImpl();
private Map<String,Object> session;
private HttpServletRequest request;
private File[] upload;//接收上传的文件信息
private String[] uploadFileName;//接收上传文件的名称
private int fileId;
private String fileCode;//提取码
private String fileName;//文件名称
//结合stream结果视图完成下载功能
private InputStream inputStream; public File[] getUpload() {
return upload;
}
public void setUpload(File[] upload) {
this.upload = upload;
}
public String[] getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
} public int getFileId() {
return fileId;
}
public void setFileId(int fileId) {
this.fileId = fileId;
} public String getFileCode() {
return fileCode;
}
public void setFileCode(String fileCode) {
this.fileCode = fileCode;
} public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
} public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
/**
* 查询用户的文件列表
* @return
* @throws Exception
*/
public String list() throws Exception {
//从session中获取用户信息
Userinfo user = (Userinfo)session.get("loginUser");
if(user!=null){
int userId = user.getUserId();
List<Fileinfo> list = fileinfoService.findFileinfoByUserId(userId);
request.setAttribute("list", list);
}
return "list";
}
/**
* 文件的上传
* @return
*/
public String upload() throws Exception{
//获取登陆用户信息
Userinfo user = (Userinfo)session.get("loginUser");
String path = request.getServletContext().getRealPath("/");
Fileinfo[] files = new Fileinfo[upload.length];
for(int i=0;i<files.length;i++){
Fileinfo file = new Fileinfo();
file.setFileName(uploadFileName[i]);//设置文件名称
file.setFileSize(upload[i].length());//设置文件大小
file.setFilePath(path+"upload\\"+user.getUserName()+"\\"+uploadFileName[i]);
file.setUserId(user.getUserId()); //file.setUserinfo(user);
files[i]=file;
}
int count = fileinfoService.uploadFile(files, user, path, upload);
if(count>0){
return this.SUCCESS;
}
return this.ERROR;
} /**
* 删除文件
* @return
* @throws Exception
*/
public String delete() throws Exception{
int count = fileinfoService.removeFile(fileId);
if(count>0){
return this.SUCCESS;
}
return this.ERROR;
} /**
* 下载
* @return
* @throws Exception
*/
public String download() throws Exception{
//根据提取码获取文件信息
Fileinfo downloadFileinfo = fileinfoService.findFileinfoByFileCode(fileCode);
//获取文件保存的真实路径
String filePath = downloadFileinfo.getFilePath();
inputStream = new FileInputStream(filePath);
//解决下载时中文名称乱问问题
fileName = new String(downloadFileinfo.getFileName().getBytes("UTF-8"),"iso-8859-1");
return "download";
} @Override
public void setSession(Map<String, Object> arg0) {
this.session=arg0;
} @Override
public void setServletRequest(HttpServletRequest arg0) {
this.request=arg0;
}
}
UserinfoAction:
package cn.zzsxt.udisk.action; import java.util.Map; import javax.servlet.ServletContext; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; import cn.zzsxt.udisk.model.Userinfo;
import cn.zzsxt.udisk.service.IUserinfoService;
import cn.zzsxt.udisk.service.impl.UserinfoServiceImpl; public class UserinfoAction extends ActionSupport implements SessionAware{
private Userinfo user;
private IUserinfoService uesrinfoService = new UserinfoServiceImpl();
private Map<String,Object> session;
public Userinfo getUser() {
return user;
} public void setUser(Userinfo user) {
this.user = user;
}
/**
* 注册
* @return
* @throws Exception
*/
public String doRegister() throws Exception {
//获取服务器的upload目录
ServletContext servletContext = ServletActionContext.getServletContext();
String path = servletContext.getRealPath("/upload");
int count = uesrinfoService.doRegister(user,path);
if(count>0){
return this.SUCCESS;
}
return this.ERROR;
} public String doLogin() throws Exception {
Userinfo loginUser = uesrinfoService.doLogin(user);
if(loginUser!=null){
//将用户信息保持到session中
session.put("loginUser", loginUser);
return "list";
}
return this.LOGIN;
} @Override
public void setSession(Map<String, Object> arg0) {
this.session=arg0;
}
}
FileinfoServiceImpl:
package cn.zzsxt.udisk.service.impl; import java.io.File;
import java.util.List; import org.apache.commons.io.FileUtils; import cn.zzsxt.udisk.commons.MD5Utils;
import cn.zzsxt.udisk.dao.IFileinfoDao;
import cn.zzsxt.udisk.dao.impl.FileinfoDaoImpl;
import cn.zzsxt.udisk.model.Fileinfo;
import cn.zzsxt.udisk.model.Userinfo;
import cn.zzsxt.udisk.service.IFileinfoService; public class FileinfoServiceImpl implements IFileinfoService {
private IFileinfoDao fileinfoDao = new FileinfoDaoImpl();
@Override
public List<Fileinfo> findFileinfoByUserId(int userId) {
return fileinfoDao.findFileinfoByUserId(userId);
}
/**
* 上传文件
* 1.将文件上传到服务器端
* 2.将文件信息添加到数据库中
*/
@Override
public int uploadFile(Fileinfo[] file, Userinfo user,String path,File[] upload) throws Exception{
//将文件信息上次到服务器端
long totalSize=0,freeSize=32*1024*1024,usedSize=0; //此处freeSize初始化设置值,因为第一次进来listFiles()方法一直返回为空,fressSize一直为0,
//普通用户空间总大小为32M,VIP用户空间总大小128M 最下面判断剩余空间和文件大小,就一直抛异常。 并且要给listFiles()方法后面的循环遍历加一个
if(user.getUserType()==1){//普通用户 判断是否为空,如果为空执行的话会错误。 服务器每关闭一次,所有数据清空一次,所以没有那个路径,
totalSize = 32*1024*1024;//总字节数 导致第一次进来listFiles()返回为空
}else if(user.getUserType()==2){//VIP用户
totalSize = 128*1024*1024;
}
String userDirStr = path+"upload\\"+user.getUserName();
File userDir = new File(userDirStr);//用户上传文件的文件夹
File[] fs = userDir.listFiles();//获取该目录下的所有文件
//统计该用户已用空间大小
if(fs!=null){
for (File f : fs) {
usedSize+=f.length();
}
freeSize = totalSize-usedSize;//计算剩余空间大小
}
//统计上传文件的总大小
long uploadTotalSize=0;
for(File uploadFile:upload){
long length = uploadFile.length();//上传单文件的大小
if(user.getUserType()==1&&length>1*1024*1024){//普通用户
throw new Exception("普通用户单文大小不能超过1M!");
}
if(user.getUserType()==2&&length>2*1024*1024){
throw new Exception("VIP用户单文大小不能超过2M!");
}
uploadTotalSize+=length;
}
//上传文件大于剩余空间,抛出异常
if(uploadTotalSize>freeSize){
throw new Exception("剩余空间不足!");
}
int count=0;
//上传文件
for(int i=0;i<upload.length;i++){
File uploadFile = upload[i];
Fileinfo f = file[i];
//将文件上传到服务器端
FileUtils.copyFile(uploadFile, new File(userDir,f.getFileName()));
//将文件信息添加到数据库中
//对真实路径进行加密
String fileCode = MD5Utils.createMD5(f.getFilePath());
f.setFileCode(fileCode);
count = fileinfoDao.addFileinfo(file[i]);
}
return count;
}
/**
* 移除文件:
* 1.从服务器端用户上传目录下移除文件
* 2.从数据库中删除文件信息
*/
@Override
public int removeFile(int fileId) {
//根据文件编号查询文件详情信息
Fileinfo fileinfo = fileinfoDao.findFileinfoById(fileId);
String filePath = fileinfo.getFilePath();//获取文件保存的真实路径
File file = new File(filePath);
if(file.exists()){
file.delete();//删除文件
}
//从数据库中删除文件信息
return fileinfoDao.deleteFileinfo(fileId);
}
@Override
public Fileinfo findFileinfoByFileCode(String fileCode) {
return fileinfoDao.findFileinfoByFileCode(fileCode);
} }

UserinfoServiceImpl:
package cn.zzsxt.udisk.service.impl; import java.io.File; import cn.zzsxt.udisk.commons.MD5Utils;
import cn.zzsxt.udisk.dao.IUserinfoDao;
import cn.zzsxt.udisk.dao.impl.UserinfoDaoImpl;
import cn.zzsxt.udisk.model.Userinfo;
import cn.zzsxt.udisk.service.IUserinfoService; public class UserinfoServiceImpl implements IUserinfoService {
private IUserinfoDao userinfoDao = new UserinfoDaoImpl();
/**
* 注册需要对密码进行MD5密码
*/
@Override
public int doRegister(Userinfo user,String path) {
String oldPass = user.getUserPass();
//对用户输入的密码进行加密
String newPass = MD5Utils.createMD5(oldPass);
user.setUserPass(newPass);
//在服务器端创建一个与用户名相同的文件夹,用于保存该用户上次的文件
File uploadDir = new File(path+"/"+user.getUserName());
if(!uploadDir.exists())
uploadDir.mkdirs();
return userinfoDao.addUser(user);
} /**
* 登陆
*/
@Override
public Userinfo doLogin(Userinfo user) {
//对用户输入的密码进行加密
String oldPass = user.getUserPass();
//对用户输入的密码进行加密
String newPass = MD5Utils.createMD5(oldPass);
user.setUserPass(newPass);
return userinfoDao.doLogin(user);
} }
java:struts框架(网路静态U盘项目)的更多相关文章
- Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis
https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...
- Java日志框架那些事儿
文章首发于[博客园-陈树义],点击跳转到原文Java日志框架那些事儿. 在项目开发过程中,我们可以通过 debug 查找问题.而在线上环境我们查找问题只能通过打印日志的方式查找问题.因此对于一个项目而 ...
- javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之一 基础Struts框架搭建篇
即将开始着手写这个项目,所以希望通过这篇博客来记录自己学习的过程 今天开学第一天,就上了软件工程实践课,自己也开始着手做这个大作业了.首先我的项目名称叫做智能班车管理系统. 项目的概况: 该软件产品是 ...
- java三大框架——Struts + Hibernate + Spring
Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作) Hibernate主要是数据持久化到数据库 再用jsp的servlet做网页开发的时候有个 w ...
- Java后端框架之Spring Boot详解,文末有Java分布式实战项目视频可取
在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大. 用过 Spring 框架的都知道 Spring 能流行是因为它的两 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:3、客户端:其它编程语言项目集成:Java集成应用中心。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- Struts框架——(三)动态ActionForm
一.DynaActionForm的引入意义 使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便. 但是,ActionForm也存在一些明 ...
- 读《架构探险——从零开始写Java Web框架》
内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...
- [转]JAVA三大框架SSH和MVC
Java—SSH(MVC) JAVA三大框架的各自作用 hibernate是底层基于jdbc的orm(对象关系映射)持久化框架,即:表与类的映射,字段与属性的映射,记录与对象的映射 数据库模型 也就 ...
随机推荐
- TIOBE 2017 8月编程语言排行榜 后院“硝烟四起”
处于排名榜最前面的几个编程语言的分数长期以来一直都在下降:Java和C在TIOBE榜单中的分数一直比较低.而且几乎所有其他排名前十的语言每年都在下降. 那么哪个什么语言抓住了这个机遇呢?这发生在排行榜 ...
- 29.连续子数组的最大和(python)
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- 一种sql优化方案
--select @type3Count=count(1) from TWEB_ALogisticsYD bb -- LEFT JOIN dbo.TWEB_BCompanyJJ as B3 WITH( ...
- JS 跳转后保持当前参数
跳转 var data = str+"&jc=0"+ "&data=" + $("form").serialize().re ...
- [采坑] VS2015 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
问题: Visual Studio 2015出现warning C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失. 解决方案: 1. ...
- CSS currentColor 变量
㈠currentColor定义及理解 来自MDN的解释:currentColor代表了当前元素被应用上的color颜色值. 使用它可以将当前这个颜色值应用到其他属性上,或者嵌套元素的其他属性上. 你这 ...
- jquery getScript动态加载JS方法改进详解
有许多朋友需要使用getScript方法动态加载JS,本文将详细介绍此功能的实现方法 $.getScript(url,callback) 这个方法是jquery自身提供的一个用于动态加载js的方法.当 ...
- Java多线程和并发(十一),CAS(Compare and Swap)
目录 1.CAS简介 2.CAS多数情况下对开发者来说是透明的 3.CAS缺点 十一.CAS(Compare and Swap) Synchronized直观意义上是一种悲观锁 cas则是乐观锁的一种 ...
- SQL查询时踩得一些坑
1.左右连接: left join:LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替. inner join: 内连接是最 ...
- Jdk1.7 与 jdk1.8的区别
在jdk7的新特性方面主要有下面几方面的增强: 1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头. 所有整数int.short.long.byte都可以用二进制表示: byte aBy ...