HDFS数据云盘搭建

1.配置host

注:所有操作均在1号机中进行
为了防止之后因端口被占用导致启动Tomcat失败,把这两句话:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

添加回/etc/hosts配置文件开头即可。

su
输入密码
vi /etc/hosts

变为:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 bigdata-senior01.chybinmy.com
192.168.100.12 bigdata-senior02.chybinmy.com
192.168.100.13 bigdata-senior03.chybinmy.com

2.设置共享文件夹

使用VMware Tools实现虚拟机和宿主机之间的文件传输有时候会死机,建议使用共享文件夹。
在VMware菜单栏-虚拟机-设置-选项-共享文件夹-总是启用
在这里插入图片描述
-添加-下一步
在这里插入图片描述
选择路径-下一步
在这里插入图片描述
-完成
在虚拟机中的路径为:Computer-Filesystem-mnt-hgfs-share

3.安装mysql

将mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz复制到共享文件夹share中
移动到tmp目录下,在共享文件夹中解压可能会报错

cd /mnt/hgfs/share/
mv mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz /tmp/

进行解压

cd /tmp/
tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

移动位置并重命名为mysql

mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql

创建mysql用户组和用户并修改权限

groupadd mysql
useradd -r -g mysql mysql

创建数据目录并赋予权限

mkdir -p  /data/mysql
chown mysql:mysql -R /data/mysql

配置my.cnf

vi /etc/my.cnf

改为:

[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true

初始化数据库
进入mysql的bin目录

cd /usr/local/mysql/bin/

初始化

./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize

查看密码

cat /data/mysql/mysql.err

记住这个随机生成的密码

启动mysql,并更改root 密码
先将mysql.server放置到/etc/init.d/mysql中

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

启动mysql

service mysql start
ps -ef|grep mysql

登录mysql

./mysql -u root -p

输入刚才随机生成的密码,进入到mysql数据库

进行密码的重置,设置为123456

SET PASSWORD = PASSWORD('123456');
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
FLUSH PRIVILEGES; 

使root能再任何host访问

use mysql
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES;

新建student表,之后用到

CREATE TABLE student (
 id INTEGER (10) PRIMARY KEY NOT NULL AUTO_INCREMENT,
 name VARCHAR (20) NOT NULL,
 password VARCHAR (20) NOT NULL
);

可以看表结构

desc student;

查看表中所有数据

select * from student;

注:每次运行项目时都要启动mysql

cd /usr/local/mysql/bin/
service mysql start
./mysql -u root -p
输入密码123456
use mysql;
desc student;

可以进行表的删除

DELETE FROM student;

退出mysql命令行

exit;

4.在eclipse中安装并新建Dynamic Web Project

cd /usr/eclipse/
./eclipse 

-OK
菜单栏-Help-Install New Software
在搜索框输入Mars,双击选择对应网址
在这里插入图片描述

Next-Next
在这里插入图片描述
-Finish
安装完后重启eclipse
打开Eclipse,选择File-New-Project-选择Dynamic Web Project
Project name为clouddisk
-Next-Next
勾选生成web.xml
在这里插入图片描述
-Finish

5.Tomcat安装

我的Tomcat为8.5,eclipse中无法识别,先进行修改
将apache-tomcat-8.5.66在本机上进行解压缩
在其lib目录下找到Catalina.jar包
右键-打开方式-选择压缩文件打开
在其中找到org\apache\catalina\util\ServerInfo.properties文件
可右键用记事本打开
将此处改为8.0.0,并保存
在这里插入图片描述
再将修改后的整个apache-tomcat-8.5.66文件夹复制到共享文件夹share中

在eclipse中的菜单栏-Windows – Preference – Server – Runtime Environment – Add
在这里插入图片描述
-Next
在这里插入图片描述
-Finish-OK
在下方窗口中New-Server
在这里插入图片描述
在这里插入图片描述
双击服务器,进行更改,并保存
在这里插入图片描述
右键服务器-Start
在浏览器中输入:http://localhost:8080/
显示如下,则成功
在这里插入图片描述

6.进行jar包的拷贝

新开一个命令行窗口

su
输入密码

1.导入Hadoop相关的jar包
拷贝“hadoop-hdfs-2.8.5.jar”包

cp /opt/modules/app/hadoop-2.8.5/share/hadoop/hdfs/hadoop-hdfs-2.8.5.jar /root/workspace/clouddisk/WebContent/WEB-INF/lib/

拷贝$HADOOP_HOME/share/hadoop/hdfs/lib/下的所有jar包

cp /opt/modules/app/hadoop-2.8.5/share/hadoop/hdfs/lib/* /root/workspace/clouddisk/WebContent/WEB-INF/lib/

拷贝“hadoop-common-2.8.5.jar”包

cp /opt/modules/app/hadoop-2.8.5/share/hadoop/common/hadoop-common-2.8.5.jar /root/workspace/clouddisk/WebContent/WEB-INF/lib/

拷贝$HADOOP_HOME/share/hadoop/common/lib下的所有jar包

cp /opt/modules/app/hadoop-2.8.5/share/hadoop/common/lib/* /root/workspace/clouddisk/WebContent/WEB-INF/lib/

有一些jar包是重复的,出现提示回车覆盖即可
2.文件传输相关的jar包
将commons-fileupload-1.4-bin.tar.gz和commons-io-2.8.0-bin.tar.gz复制到共享文件夹share中

cd /mnt/hgfs/share/
tar -xzf commons-fileupload-1.4-bin.tar.gz
cd commons-fileupload-1.4-bin
cp commons-fileupload-1.4.jar /root/workspace/clouddisk/WebContent/WEB-INF/lib/
tar -xzf commons-io-2.8.0-bin.tar.gz
cd /mnt/hgfs/share/commons-io-2.8.0
cp commons-io-2.8.0.jar /root/workspace/clouddisk/WebContent/WEB-INF/lib/

3.mysql相关jar包
将mysql-connector-java-8.0.25.jar复制到共享文件夹share中

cd /mnt/hgfs/share/
cp mysql-connector-java-8.0.25.jar /root/workspace/clouddisk/WebContent/WEB-INF/lib/

右键项目-Refresh,可看到lib文件夹下出现jar包
右键项目-Build Path-Configure Build Path
在这里插入图片描述
选到当前的lib目录
在这里插入图片描述
CRTL+A全部选中-OK-OK
便出现引用的类库

7.代码编写

复制粘贴代码时可能格式会乱,可粘贴完进行自动缩进
Eclipse 自动缩进:Ctrl+Shift+F

7.1 index.jsp

右键单击WebContent 选择 “New”→“JSP File”新建名为 “index.jsp” 的文件,打开index.jsp文件,通过html编译网盘的主界面,展示hdfs的内容以及相关操作的布局。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
	function checkUser() {
		if (document.login.inputname.value == "") {
			alert("用户名不能为空.");
			return false;
		}
		if (document.login.inputpass.value == "") {
			alert("密码不能为空.");
			return false;
		}
		return true;
	}
</script>
<title>登录srk的网盘</title>
<link rel="stylesheet" href="assets/css/style.css">
<body
	style="background-color: #FFD700; background-position: center; background-repeat: repeat-y">
	<div class="login-container">
		<h1>hdfs网盘</h1>
		<form action="LoginServlet" method="post" id="loginForm" name="login"
			onsubmit="return checkUser()">
			<div>
				<input type="text" id="inputname" name="username" class="username"
					placeholder="用户名" autocomplete="off" />
			</div>
			<div>
				<input type="password" id="inputpass" name="password"
					class="password" placeholder="密码" oncontextmenu="return false"
					onpaste="return false" />
			</div>
			<button id="submit" type="submit">登 录</button>
		</form>
		<a href="register.jsp">
			<button type="button" class="register-tis">账号注册</button>
		</a>
	</div>

</body>
</html>

7.2 head.jsp

右键单击 WebContent选择 “New”→“JSP File” 新建名为“head.jsp”的文件,打开并编译head.jsp文件,对项目的界面进行美化。

head.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="assets/css/bootmetro.css">
<link rel="stylesheet" type="text/css"
	href="assets/css/bootmetro-responsive.css">
<link rel="stylesheet" type="text/css"
	href="assets/css/bootmetro-icons.css">
<link rel="stylesheet" type="text/css"
	href="assets/css/bootmetro-ui-light.css">
<link rel="stylesheet" type="text/css" href="assets/css/datepicker.css">
<!-- these two css are to use only for documentation -->
<link rel="stylesheet" type="text/css" href="assets/css/site.css">
<!-- Le fav and touch icons -->
<link rel="shortcut icon" href="assets/ico/favicon.ico">
<link rel="apple-touch-icon-precomposed" sizes="144x144"
	href="assets/ico/apple-touch-icon-144-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="114x114"
	href="assets/ico/apple-touch-icon-114-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72"
	href="assets/ico/apple-touch-icon-72-precomposed.png">
<link rel="apple-touch-icon-precomposed"
	href="assets/ico/apple-touch-icon-57-precomposed.png">
<!-- All JavaScript at the bottom, except for Modernizr and Respond.
	Modernizr enables HTML5 elements & feature detects; Respond is a polyfill for  min/max-width CSS3 Media Queries
	For optimal performance, use a custom Modernizr build:  www.modernizr.com/download/ -->
<script src="assets/js/modernizr-2.6.2.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎使用srk的网盘</title>
</head>
</html>

使用bootmetro-master框架,将框架里面的src/assets下面的文件夹导入项目的WebContent文件夹下面,美化用户的操作界面。
先将assets文件夹粘贴到共享文件夹share中
再复制到WebContent文件夹下面

cp -r /mnt/hgfs/share/assets /root/workspace/clouddisk/WebContent/

7.3 UploadServlet.java

右键单击hadoop/Java Resources下的src,选择 “New”→“Package”,新建名为“com.simple.controller”包名,相同操作步骤,新建名为“com.simple.bean”与“com.simple.model” 包名。

右击com.simple.controller包名选择 “New”→“Class”,新建名为 “UploadServlet” 的类文件并继承 HttpServlet ,重写doGet和doPost方法,对该类进行编译,操作对本地文 件上传至HDFS的 内容,基于安全考虑,无法获取文件的绝对路径,首先将得到的文件保存 至本地指定的地址,在从指定的地址拼 接文件的url得到文件的绝对路径,将文件上传至hdfs上。

UploadServlet.java

package com.simple.controller;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.hadoop.fs.FileStatus;

import com.simple.model.HdfsDAO;

public class UploadServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		File file;
		int maxFileSize = 50 * 1024 * 1024; // 50M
		int maxMemSize = 50 * 1024 * 1024; // 50M
		ServletContext context = getServletContext();
		String filePath = context.getInitParameter("file-upload");
		System.out.println("source file path:" + filePath + "");
		// 验证上传内容的类型
		String contentType = request.getContentType();
		if (contentType == null) { // if you clicked a folder in the index.jsp,
									// you will be here.
			System.out.println(request.getParameter("filePath"));
			HdfsDAO hdfs = new HdfsDAO();
			FileStatus[] documentList = hdfs.getDirectoryFromHdfs(request.getParameter("filePath"));
			// FileStatus[] documentList = hdfs.getDirectoryFromHdfs();
			request.setAttribute("documentList", documentList);
			System.out.println("得到list数据" + documentList);
			request.getRequestDispatcher("index.jsp").forward(request, response);
		} else if ((contentType.indexOf("multipart/form-data") >= 0)) {
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 设置内存中存储文件的最大值
			factory.setSizeThreshold(maxMemSize);
			// 本地存储的数据大于maxMemSize.
			factory.setRepository(new File("/tmp"));
			// 创建一个新的文件上传处理程序
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 设置最大上传的文件大小
			upload.setSizeMax(maxFileSize);
			try {
				// 解析获取的文件
				List fileItems = upload.parseRequest(request);
				// 处理上传的文件
				Iterator i = fileItems.iterator();
				System.out.println("begin to uploadfile to tomcat server</p>");
				while (i.hasNext()) {
					FileItem fi = (FileItem) i.next();
					if (!fi.isFormField()) {
						// 或取上传文件的参数
						String fieldName = fi.getFieldName();
						String fileName = fi.getName();
						String fn = fileName.substring(fileName.lastIndexOf("\\") + 1);
						System.out.println("<br>" + fn + "<br>");
						boolean isInMemory = fi.isInMemory();

						long sizeInBytes = fi.getSize();
						// 写入文件
						if (fileName.lastIndexOf("\\") >= 0) {
							file = new File(filePath, fileName.substring(fileName.lastIndexOf("\\")));
						} else {
							file = new File(filePath, fileName.substring(fileName.lastIndexOf("\\") + 1));
						}
						fi.write(file);
						System.out.println("upload file to tomcat server success!");
						System.out.println("begin to upload file to hadoop hdfs</p>");
						String name = filePath + "/" + fileName;
						// 将tomcat上的文件上传到hadoop上
						HdfsDAO hdfs = new HdfsDAO();
						hdfs.copyFile(name);
						System.out.println("upload file to hadoop hdfs success!");
						FileStatus[] documentList = hdfs.getDirectoryFromHdfs();
						request.setAttribute("documentList", documentList);
						System.out.println("得到list数据" + documentList);
						request.getRequestDispatcher("index.jsp").forward(request, response);
					}
				}
			} catch (Exception ex) {
				System.out.println(ex);
			}
		} else

		{
			System.out.println("<p>No file uploaded</p>");
		}
	}
}

7.4 HdfsDAO.java

右键单击 com.simple.model 包名选择“New”→“Class”新建名为 “HdfsDAO”的类文件,操作对HDFS的增删改查的方法,需要对hdfs做什么操作,只需在本类中调用相应的方法。

HdfsDAO.java

package com.simple.model;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HdfsDAO {
	private static String hdfsPath = "hdfs://192.168.100.10:8020/tmp";
	// 该IP和端口是你在配置分布式集群系统时候的NameNode的ip,端口也是你自己设置的一个端口,
	// 我这里设置的是8020,后面的路径,就是在Hadoop hdfs上的路径,可以通过在终端输入hadoop fs -ls /
	// 来查看你上面的目录,之后上传或者下载文件等操作会运用到这个目录
	Configuration conf = new Configuration();

	/** 上传文件到HDFS上去 */
	public void copyFile(String local) throws IOException {
		FileSystem fs = FileSystem.get(URI.create(hdfsPath), conf);
		// remote---/用户/用户下的文件或文件夹
		fs.copyFromLocalFile(new Path(local), new Path(hdfsPath));
		fs.close();
	}

	/** 从HDFS上下载数据 **/
	public void download(String remote, String local) throws IOException {
		FileSystem fs = FileSystem.get(URI.create(hdfsPath), conf);
		fs.copyToLocalFile(false, new Path(remote), new Path(local), true);
		System.out.println("download: from" + remote + " to " + local);
		fs.close();
	}

	/** 从HDFS上删除文件 */
	public static void deleteFromHdfs(String deletePath) throws FileNotFoundException, IOException {
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(deletePath), conf);
		fs.deleteOnExit(new Path(deletePath));
		fs.close();
	}

	/** 遍历HDFS上的文件和目录 */
	public static FileStatus[] getDirectoryFromHdfs(String... paths) throws FileNotFoundException, IOException {
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(hdfsPath), conf);
		FileStatus[] list = fs.listStatus(new Path(hdfsPath));
		for (String path : paths) {
			if (path == null || "".equals(path)) {

			} else {
				fs = FileSystem.get(URI.create(path), conf);
				list = fs.listStatus(new Path(path));
			}
		*斜体样式*}
		if (list != null)
			for (FileStatus f : list) {
				System.out.printf("name: %s, folder: %s, size: %d\n", f.getPath().getName(), f.isDir(), f.getLen());
			}
		fs.close();
		return list;
	}
}

7.5 DeleteFileServlet.java

右键单击com.simple.controller包名选择 “New”→“Class”新建名为 “DeleteFileServlet” 的类文件,操作对HDFS文件删除的内容。

DeleteFileServlet.java

package com.simple.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.hadoop.fs.FileStatus;

import com.simple.model.HdfsDAO;

public class DeleteFileServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String filePath = new String(request.getParameter("filePath").getBytes("ISO-8859-1"), "GB2312");
		HdfsDAO hdfs = new HdfsDAO();
		hdfs.deleteFromHdfs(filePath);
		System.out.println("====" + filePath + "====");
		FileStatus[] documentList = hdfs.getDirectoryFromHdfs();
		request.setAttribute("documentList", documentList);
		System.out.println(" 得 到 list 数 据 " + documentList);
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}

7.6 DownloadServlet.java

右击com.simple.controller包名选择 “New”→“Class”新建名为 “DownloadServlet”的类文件,操作对文件下载的内容。

DownloadServlet.java

package com.simple.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.hadoop.fs.FileStatus;

import com.simple.model.HdfsDAO;

public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String local = "/tmp";
		String filePath = new String(request.getParameter("filePath").getBytes("ISO-8859-1"), "GB2312");
		HdfsDAO hdfs = new HdfsDAO();
		hdfs.download(filePath, local);
		FileStatus[] documentList = hdfs.getDirectoryFromHdfs();
		request.setAttribute("documentList", documentList);
		System.out.println(" 得 到 list 数 据 " + documentList);
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}

其中String local = “/tmp”;指定了下载位置为tmp文件夹

7.7 UserBean.java

右键单击com.simple.bean包 名选择 “New”→“Class”新建名为 “UserBean”的类文件,操作用户的属性的内容,用户的ID,name,password属 性,重写属性的set与get方法。

UserBean.java

package com.simple.bean;

public class UserBean {
	private int id;
	private String name;
	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "UserBean [id=" + id + ", name=" + name + ", password=" + password + "]";
	}

	public UserBean(int id, String name, String password) {
		super();
		this.id = id;
		this.name = name;
		this.password = password;
	}

	public UserBean() {
		super();
	}
}

7.8 ConnDB.java

右击com.simple.model包 名选择 “New”→“Class” 新建名为“ConnDB”的类文件,操作连接 数据库的内容。

ConnDB.java

package com.simple.model;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnDB {
	private Connection ct = null;

	public Connection getConn() {

		try {
			// 加载驱动
			Class.forName("com.mysql.jdbc.Driver");

			// 得到连接
			ct = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql?user=root&password=123456");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return ct;
	}
}

其中的数据库连接可以根据自己情况修改

DriverManager.getConnection("jdbc:mysql://localhost:3306/hadoop?user=root&password=123456");

7.9 login.jsp

右键单击WebContent选择 “New”→“JSP File” 新建名为“login.jsp”的文件,打开并编译login.jsp文件,操作用户的登录界面及设置监听。

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
	function checkUser() {
		if (document.login.inputname.value == "") {
			alert("用户名不能为空.");
			return false;
		}
		if (document.login.inputpass.value == "") {
			alert("密码不能为空.");
			return false;
		}
		return true;
	}
</script>
<title>登录srk的网盘</title>
<link rel="stylesheet" href="assets/css/style.css">
<body
	style="background-color: #FFD700; background-position: center; background-repeat: repeat-y">
	<div class="login-container">
		<h1>hdfs网盘</h1>
		<form action="LoginServlet" method="post" id="loginForm" name="login"
			onsubmit="return checkUser()">
			<div>
				<input type="text" id="inputname" name="username" class="username"
					placeholder="用户名" autocomplete="off" />
			</div>
			<div>
				<input type="password" id="inputpass" name="password"
					class="password" placeholder="密码" oncontextmenu="return false"
					onpaste="return false" />
			</div>
			<button id="submit" type="submit">登 录</button>
		</form>
		<a href="register.jsp">
			<button type="button" class="register-tis">账号注册</button>
		</a>
	</div>

</body>
</html>

7.10 register.jsp

右键单击WebContent选择 “New”→“JSP File”新建名为 “register.jsp”的文件,打开并编译register.jsp文件,操作用户的注册界面并 对用户的操作作监听。

register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
	function checkRegister() {
		if (document.register.inputname.value == "") {
			alert("用户名不能为空.");
			return false;
		} else {
			if (document.register.inputpass.value == "") {
				alert("密码不能为空.");
				return false;
			} else {
				if (document.register.surepass.value == "") {
					alert("确认密码不能为空.");
					return false;
				} else {
					if (document.register.inputpass.value != document.register.surepass.value) {
						alert("两次密码不一致。");
						return false;
					}
				}
			}
		}
		return true;
	}
</script>
<title>注册srk的网盘</title>
<link rel="stylesheet" href="assets/css/login.css">
<body>
	<div>
		<h1>注册</h1>
		<div class="connect">
			<p>信息注册</p>
		</div>
		<form action="RegisterServlet" method="post" id="registerForm"
			onsubmit="return checkRegister()" name="register">
			<div>
				<input type="text" name="username" id="inputname" class="username"
					placeholder="您的用户名" autocomplete="off" />
			</div>
			<div>
				<input type="password" name="password" id="inputpass"
					class="password" placeholder="输入密码" />
			</div>
			<div>
				<input type="password" name="surepass" id="surepass"
					class="surepass" placeholder="再次输入密码" />
			</div>
			<button id="submit" type="submit">注 册</button>
		</form>
		<a href="login.jsp">
			<button type="button" class="register-tis">已经有账号?</button>
		</a>
	</div>
</body>
</html>

7.11 LoginServlet.java

右键单击 com.simple.controller包名选择“New”→“Class” 新建名为“LoginServlet”的类文件,并对该类进行编译,操作登录对用户的 登录信息在数据库中查询,存在登录成功,否则登录失败。

LoginServlet.java

package com.simple.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.hadoop.fs.FileStatus;

import com.simple.model.HdfsDAO;
import com.simple.model.UserDAO;

public class LoginServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		UserDAO user = new UserDAO();
		if (user.checkUser(username, password)) {
			// 用户合法,跳转到页面
			HttpSession session = request.getSession();
			session.setAttribute("username", username);
			HdfsDAO hdfs = new HdfsDAO();
			FileStatus[] documentList = hdfs.getDirectoryFromHdfs();
			request.setAttribute("documentList", documentList);
			System.out.println("得到list数据" + documentList);
			request.getRequestDispatcher("index.jsp").forward(request, response);
		} else {
			// 用户不合法,调回登录界面,并提示错误信息
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}
	}
}

7.12 UserDAO.java

右键单击com.simple.model包名选择“New”→“Class”新建名为“UserDAO”的类文件,操作对数据验证,插入数据至数据库的内容。

UserDAO.java

package com.simple.model;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class UserDAO {
	private Statement sm = null;
	private Connection ct = null;
	private ResultSet rs = null;

	public void close() {
		try {
			if (sm != null) {
				sm.close();
				sm = null;
			}
			if (ct != null) {
				ct.close();
				ct = null;
			}
			if (rs != null) {
				rs.close();
				rs = null;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 检查用户是否合法
	public boolean checkUser(String user, String password) {
		boolean b = false;
		try {
			// 获得连接
			ct = new ConnDB().getConn();
			// 创建statement
			sm = ct.createStatement();
			String sql = "select * from student where name=\"" + user + "\"";
			rs = sm.executeQuery(sql);
			if (rs.next()) {
				// 说明用户存在
				String pwd = rs.getString(3);
				if (password.equals(pwd)) {
					// 说明密码正确
					b = true;
				} else {
					b = false;
				}
			} else {
				b = false;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			this.close();
		}
		return b;
	}

	public void insert(String name, String password) throws SQLException {
		int i = 0;
		// 获得连接
		ct = new ConnDB().getConn();
		// 创建statement
		sm = ct.createStatement();
		String sql = "insert into student (name,password) values ('" + name + "','" + password + "')";
		System.out.println(sql + "333333333");
		i = sm.executeUpdate(sql);
	}
}

7.13 RegisterServlet.java

右键单击com.simple.controller包名选择 “New”→“Class” 新建名为 “RegisterServlet” 的类文件,操作用户注册的信息,并将用户的信息保存至 MySQL中。

RegisterServlet.java

package com.simple.controller;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.hadoop.fs.FileStatus;

import com.simple.model.HdfsDAO;
import com.simple.model.UserDAO;

public class RegisterServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		HttpSession session = request.getSession();
		session.setAttribute("username", username);
		UserDAO user = new UserDAO();
		try {
			user.insert(username, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		HdfsDAO hdfs = new HdfsDAO();
		FileStatus[] documentList = hdfs.getDirectoryFromHdfs();
		request.setAttribute("documentList", documentList);
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}
}

7.14 web.xml

打开“WEB-INF”下的web.xml文件

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>hadoop</display-name>
	<welcome-file-list>
		<welcome-file>login.html</welcome-file>
		<welcome-file>login.htm</welcome-file>
		<welcome-file>login.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<description></description>
		<display-name>UploadServlet</display-name>
		<servlet-name>UploadServlet</servlet-name>
		<servlet-class>com.simple.controller.UploadServlet</servlet-class>
	</servlet>
	<servlet>
		<description></description>
		<display-name>DeleteFileServlet</display-name>
		<servlet-name>DeleteFileServlet</servlet-name>
		<servlet-class>com.simple.controller.DeleteFileServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DeleteFileServlet</servlet-name>
		<url-pattern>/DeleteFileServlet</url-pattern>
	</servlet-mapping>

	<servlet>
		<description></description>
		<display-name>DownloadServlet</display-name>
		<servlet-name>DownloadServlet</servlet-name>
		<servlet-class>com.simple.controller.DownloadServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DownloadServlet</servlet-name>
		<url-pattern>/DownloadServlet</url-pattern>
	</servlet-mapping>

	<servlet>
		<description></description>
		<display-name>LoginServlet</display-name>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.simple.controller.LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>LoginServlet</servlet-name>
		<url-pattern>/LoginServlet</url-pattern>
	</servlet-mapping>
	<servlet>
		<description></description>
		<display-name>RegisterServlet</display-name>
		<servlet-name>RegisterServlet</servlet-name>
		<servlet-class>com.simple.controller.RegisterServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>RegisterServlet</servlet-name>
		<url-pattern>/RegisterServlet</url-pattern>
	</servlet-mapping>

	<context-param>
		<description>Location to store uploaded file</description>
		<param-name>file-upload</param-name>
		<param-value>
			/root/Upload-files
		</param-value>
	</context-param>
	<servlet-mapping>
		<servlet-name>UploadServlet</servlet-name>
		<url-pattern>/UploadServlet</url-pattern>
	</servlet-mapping>
</web-app>

其中

<param-value>
	/root/Upload-files
</param-value>

代表了上传的文件的存储位置。

需要先建立Upload-files文件夹

mkdir /root/Upload-files

8.效果展示

首先要启动mysql服务

cd /usr/local/mysql/bin/
service mysql start
./mysql -u root -p
输入密码123456

新开一个命令行窗口

su
输入密码
start-dfs.sh

开启3台虚拟机,启动hdfs集群

start-dfs.sh

打开eclipse

cd /usr/eclipse/
./eclipse 

左键项目-Run As-Run on Server
在这里插入图片描述
复制下地址,到浏览器中访问http://localhost:8080/clouddisk/
主界面如下:
在这里插入图片描述
可进行用户的登录和账号的注册
在这里插入图片描述

点Browse可选择要上传的文件,再点击上传文件,文件便上传到hdfs上
在这里插入图片描述
并可以进行文件的下载和删除

点击下载后,文件下载到/tmp路径下

使用结束后关闭集群

stop-dfs.sh

注:有一个小bug,当注册两个同样账号密码的用户时,会出现无法登录的情况

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值