手写一个微型下载资源网站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

知识点详细总结链接:

01-HTML+CSS+JS【常用总结+案例练习】

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加密如何实现,懂的人教下,要教程,注册和登陆时的调用。

用java实现一个简单的单用户登陆功能的思路

[转载]python实现带验证码网站的自动登陆

利用Java手写简单的httpserver

javawebstart下载无法登陆