手写一个微型下载资源网站Java实现用户注册登陆下载功能
Posted ahcfl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写一个微型下载资源网站Java实现用户注册登陆下载功能相关的知识,希望对你有一定的参考价值。
文章目录
手写一个微型下载资源网站【Java实现用户注册、登陆、下载功能】
一、技术栈
语言:Java
Web:html + css + js +bootstrap
数据库:mysql8.2
服务器:Tomcat
开发环境:JDK–1.8 、Servlet–3.0 、ntelliJ IDEA、Navicat-11
所需知识:javase、servlet、http、request、response、cookie、session、jsp+el+jstl、filter、listener
知识点详细总结链接:
02-JavaWeb开发【Tomcat服务器&Servlet接口&HTTP协议&HttpServletRequest&BeanUtils工具包封装请求数据&HttpServletResponse】
03-JavaWeb开发【最详细的Cookie&Session分析】
04-JavaWeb开发【JSP&EL&JSTL&MVC&Bootstrap前端框架】
05-JavaWeb的三大组件:小程序Servlet+过滤器Filter+监听器Listener
二、流程分析图
注册
登陆
下载
三、案例实现效果
页面没有太多美化修饰,具体以后端业务实现为主哦!
首页
注册
登陆
下载网主页
壁纸下载
书籍下载
影视下载
四、案例代码实现
注意事项
可先看,这些处理概念。后面开发时需要处理的细节。
一、将下载的文件放到WEB-INF下面,更安全,用户不会通过浏览器对其访问。
-------------------------------------------------------------
二、关于乱码问题:
首先要处理接收请求中文乱码问题:
request.setCharacterEncoding("utf-8");
然后解决响应给浏览器的乱码问题:
//解决响应体乱码问题
response.setContentType("text/html;charset=utf-8");
说明:上述只是解决响应体乱码问题,不能解决响应头乱码问题,由于告诉浏览器以附件形式下载,
使用的文件名在响应头中响应给浏览器,所以上述不能解决乱码问题。所以我们采用另外一种解决方案。
方案:URLEncoder按照UTF-8的编码方式对filename文件名进行编码。
//设置浏览器以附件形式下载
//对文件名编码
String encodeFilename = URLEncoder.encode(filename, "UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+encodeFilename);
--------------------------------------------------------------
三、关于下载编写Servlet处理文件下载逻辑
1. 获取当前项目中资源的真实路径;
String realPath = getServletContext().getRealPath("/WEB-INF/"+filename);
2. 获取文件的mimeType;
String mimeType = getServletContext().getMimeType(fileName);
--------------------------------------------------------------
四、关于设置文件为附件的形式
对于response.setHeader("Content-Disposition","attachment;filename="+encodeFilename);
1.如果不加attachment关键字,则用户点击图片就可以直接在浏览器查看图片了,而我们的功能是下载。
所以要加attachment关键字,attachment表示附件的意思。
2.如果不书写 filename ,那么下载的文件名字就是当前servlet的路径名字。
3.【文件下载】两个响应头+流拷贝
1. 设置响应头: Content-Disposition // 告诉浏览器以附件的形式来处理文件;
2. 设置响应头: response.setContentType(mimeType) // 告诉浏览器下载的文件的类型;
3. 流拷贝:
1. 将文件读取到流里边: FileInputStream fin = new FileInputStream(file);
2. 将流写给浏览器:response.getOutputStream().write(arr,0,len);
1、数据库设计
create database user_managerment;
use user_managerment;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '1234');
INSERT INTO `user` VALUES ('2', 'lisi', '1234');
INSERT INTO `user` VALUES ('3', 'wangwu', '1234');
INSERT INTO `user` VALUES ('4', 'zhaoliu', '1234');
2、项目结构
1)src
2)web
3)工具包
4)配置文件
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/user_managerment\\
?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
jdbc.username=root
jdbc.password=1234
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--加载外部的配置文件-->
<properties resource="jdbc.properties"/>
<!--别名-->
<typeAliases>
<package name="cn.itcast.sh.login.pojo"/>
</typeAliases>
<!--mybatis环境的配置
一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境
-->
<environments default="development">
<!--通常我们只需要配置一个就可以了, id是环境的名字 -->
<environment id="development">
<!--事务管理器:由JDBC来管理-->
<!--
事务管理器type的取值:
1. JDBC:由JDBC进行事务的管理
2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
-->
<transactionManager type="JDBC"/>
<!--数据源的配置:mybatis自带的连接池-->
<!--
数据源:
1. POOLED:使用mybatis创建的连接池
2. UNPOOLED:不使用连接池,每次自己创建连接
3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源。
-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--映射器-->
<mappers>
<!--加载其它的映射文件 注:注解开发是点号-->
<!--<package name="com.itheima.sh.dao"></package>-->
<!--
加载其它的映射文件 xml形式
包扫描方式加载mapper映射文件,说明:
1. 要求mapper映射文件,与mapper接口要放在同一个目录
2. 要求mapper映射文件的名称,与mapper接口的名称要一致
-->
<package name="cn.itcast.sh.login.dao"/>
</mappers>
</configuration>
log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D:/IdeaProjects/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=debug, stdout,file
5)web页面
index.jsp
<!DOCTYPE html>
<html lang="en">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 指定网页的字符集为utf-8-->
<meta charset="utf-8">
<!--使用微软最新的浏览器Edge的内核来解析当前的HTML文件,最新的浏览器都支持 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--
响应式布局参数:
viewport: 视口的参数
width=device-width:默认的网页宽度是设备的宽度
initial-scale=1: 初始的缩放比1:1
-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<!-- 1. 导入bootstrap的全局css样式 -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<title>Beauty下载网</title>
</head>
<body>
<!--<div align="left">-->
<!-- <a href="register.jsp" class="btn btn-success">用户注册</a>-->
<!-- <a href="login.jsp" class="btn btn-primary">用户登陆</a>-->
<!--</div>-->
<h3 font-siz:200px align="center">Beauty下载网</h3>
<hr>
<div class="container">
<!-- 默认是白色,navbar-inverse 表示黑色-->
<nav class="navbar navbar-inverse">
<!-- container-fluid 表示占容器nav的100%-->
<div class="container-fluid">
<!-- navbar-header表示指定商标和开关的样式,让它在手机上更好的显示-->
<div class="navbar-header">
<!--开关按钮-->
<!--data-toggle="collapse" 表示点击按钮时可以折叠
data-target 点击开关按钮时,可以找到id是bs-example-navbar-collapse-1下拉菜单
而我们发现下面的下拉菜单的id正好是 bs-example-navbar-collapse-1
-->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1">
<!--开关按钮中的白线-->
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!--navbar-brand 表示商标 类似于苹果网站的苹果标志,无论设备窗口怎么变化,商标都会存在-->
<a class="navbar-brand" href="#">Beauty</a>
</div>
<!-- 下拉菜单,表单等 navbar-collapse 表示可以折叠的所有的项-->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active">
<span class="sr-only">(current)</span></a>
<a href="/register.jsp" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">注册
<!--向下箭头-->
</a>
</li>
<li class="dropdown">
<a href="/login.jsp" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">登陆
<!--向下箭头-->
</a>
</li>
<li class="dropdown">
<a href="/images.jsp" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">壁纸
<!--向下箭头-->
<span class="caret"></span></a>
<!--下拉项-->
<ul class="dropdown-menu">
<li><a href="#">风景</a></li>
<li><a href="#">美女</a></li>
<!--divider表示一条线-->
</ul>
</li>
<li class="dropdown">
<a href="/books.jsp" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">书籍
<!--向下箭头-->
<span class="caret"></span></a>
<!--下拉项-->
<ul class="dropdown-menu">
<li><a href="#">编程</a></li>
<li><a href="#">名著</ajava网站开发怎么实现用户账号信息本地保存
Dreamweaver+asp+access 会员注册与登陆的MD5加密如何实现,懂的人教下,要教程,注册和登陆时的调用。