JAVAWEB之小说书城项目

一,项目目的

1.熟悉网站开发的基本流程。

2.将以学习的知识进行复习总结。

3,明确自身知识薄弱区。

二,项目内容

使用所学习对jsp,HTML,Mysql,css等知识制作一个小型的网页,初步实现登录注册,与对网站其他功能的处理。

项目所有文件展示(包括jar包和jsp页面)。 

三,项目过程

首先是制作容纳用户账号的数据库表格:

然后是java部分

我的整个项目所有Java代码包 

先是准备部分,就是上面展示的两个类,一个配置文件。

jdbc不用说,dasedam是对数据库所有功能的一个统筹,后面所有调用数据库的方法一般都是继承与他。 

import Txtshop.Txt;
import org.apache.commons.dbutils.QueryRunner;
import jdbc.jdbcutils;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.*;
import java.util.List;

public abstract class basedam {
    /**整体上这个文件是利用QueryRunner封装的功能实现的,基本上一直在调方法*/
    private QueryRunner queryRunner=new QueryRunner();
//  增
    public int update(String sql, Object...args){
        Connection connection= jdbcutils.getConnection();
        try {
            return queryRunner.update(connection,sql,args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return -1;
    }
    /**单个搜索*/
    public <T> T QueryForOne(Class<T> clazz,String sql,Object... args){
        Connection connection=jdbcutils.getConnection();
        try {
            return queryRunner.query(connection,sql,new BeanHandler<T>(clazz),args);
        } catch (SQLException throwables) {
            System.out.println("问题1");
            throwables.printStackTrace();
        }finally {
            jdbcutils.closeConnection(connection);
        }
        return null;
    }
    /**整行搜索*/
    public <T> List<T> QueryForList(Class<Txt> clazz, String sql, String args){
        Connection connection=jdbcutils.getConnection();
        try {
            return (List<T>) queryRunner.query(connection,sql,new BeanListHandler<>(clazz),args);
        } catch (SQLException throwables) {
            System.out.println("问题2");
            throwables.printStackTrace();
        }finally {
            jdbcutils.closeConnection(connection);
        }
        return null;
    }
    /**对某些情况的单独搜索*/
    public Object QueryForSingleValue(String sql,Object... args){
        Connection connection=jdbcutils.getConnection();
        try {
            return queryRunner.query(connection,sql,new ScalarHandler(),args);
        } catch (SQLException throwables) {
            System.out.println("问题3");
            throwables.printStackTrace();
        }finally {
            jdbcutils.closeConnection(connection);
        }
        return null;
    }
    /**删除*/
    public int Querydelete(String sql,Object... args){
        Connection connection=jdbcutils.getConnection();
        try {
            return queryRunner.update(connection,sql,args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            System.out.println("问题w");
            jdbcutils.closeConnection(connection);
        }
        return -1;
    }
    /**修改*/
    public int UpdateFile(String sql,Object... args){
        try {
            return queryRunner.update(sql,args);
        } catch (SQLException throwables) {
            System.out.println("问题q");
            throwables.printStackTrace();
        }
        return -1;
    }
}

 jdbc和配置先不展示了,最后我会把代码都发出来的。

然后是用户登录注册功能的实现,我是对每一个针对对象进行分类,这部分是对用户的。

 这里分别是JavaBean对象,dao与Serlet接口,

 然后就是代表登录注册的LoginServlet与ReginServlet。同理,项目内部的增删改查也是相通的流程,但这之恩做到增删改查,而下载需要另外写。

import Txtshop.Txtdao;
import Txtshop.Txtdaolmpo;
import org.apache.commons.io.IOUtils;
import sun.misc.BASE64Encoder;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.jar.Attributes;

public class DownText extends HttpServlet {
    Txtdao txtdao=new Txtdaolmpo();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String filetxt = req.getParameter("txt");
//        System.out.println();
        String downloadFileName = filetxt;
//        2、读取要下载的文件内容 (通过ServletContext对象可以读取)
        ServletContext servletContext = getServletContext();
        // 获取要下载的文件类型
        String mimeType = servletContext.getMimeType("/Txt/" + downloadFileName);
        System.out.println("下载的文件类型:" + mimeType);
//        4、在回传前,通过响应头告诉客户端返回的数据类型
        resp.setContentType(mimeType);
//        5、还要告诉客户端收到的数据是用于下载使用(还是使用响应头)
        // Content-Disposition响应头,表示收到的数据怎么处理
        // attachment表示附件,表示下载使用
        // filename= 表示指定下载的文件名
        // url编码是把汉字转换成为%xx%xx的格式
        if (req.getHeader("User-Agent").contains("Firefox")) {
            // 如果是火狐浏览器使用Base64编码
            resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" + new BASE64Encoder().encode(downloadFileName.getBytes("UTF-8")) + "?=");
        } else {
            // 如果不是火狐,是IE或谷歌,使用URL编码操作
            resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downloadFileName, "UTF-8"));
        }
        InputStream resourceAsStream = servletContext.getResourceAsStream("/Txt/" + downloadFileName);
        // 获取响应的输出流
        OutputStream outputStream = resp.getOutputStream();
        //        3、把下载的文件内容回传给客户端
        // 读取输入流中全部的数据,复制给输出流,输出给客户端
        IOUtils.copy(resourceAsStream, outputStream);
//        resp.sendRedirect(req.getContextPath()+"/test02.jsp");
    }
}

 我在小说的数据库表格存储的是文件名,存储地址都是写死的。

四,项目效果展示 

  登录界面,注册和他差不多,我没有在页面中加入隐藏的文字域用来提示错误,而是是使用了弹窗的方式,对账号名,密码,验证码进行验证。并且加入了Fiter拦截和Mysql防注入,没有进行验证是无法进入后面的页面的。

 欢迎界面

功能页面三个主页面

 如果搜索栏是空白,代表这是个全局搜索,另外也可以进行单独搜索(模糊收缩我还没添加)

修改界面与上传相似

 我将修改的内容都显示,想修改名字或作者直接该就行,封面与内容则是直接上传,不想修改的不用动他就好,并且不管是上传还是修改,我在封面与内容都有限制,封面只能传图片,内容只能传文档,否则会修改\上传失败。

阅读界面搜索文件,并将其打印在页面上,至于显示效果。。。。我尽力了。 

 但实际上我只写了一个,一个页面显示,另外两个页面就会隐藏

<%@ page import="Servlet.UpdateServlet" %>
<%--
  Created by IntelliJ IDEA.
  User: 86188
  Date: 2022/4/8
  Time: 16:51
  To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String d1=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<html>
<head>
    <title>Myworld</title>
    <link type="text/css" rel="stylesheet" href="css03.css">
    <script type="text/javascript" src="Jqery/jquery.js"></script>
    <script>
        jQuery(function (){
            jQuery("#y1").show();
            jQuery("#y2").hide();
            jQuery("#y3").hide();
        })
        jQuery(function (){
           jQuery("#d2").click(function (){
               jQuery("#y1").hide();
               jQuery("#y2").show();
               jQuery("#y3").hide();
           });
           jQuery(function (){
               jQuery("#d1").click(function (){
                   jQuery("#y1").show();
                   jQuery("#y2").hide();
                   jQuery("#y3").hide();
               })
           });
           jQuery(function (){
               jQuery("#d3").click(function (){
                   jQuery("#y1").hide();
                   jQuery("#y2").hide();
                   jQuery("#y3").show();
               })
           })
        });
        jQuery(function (){
            var s="${requestScope.wo}";
            if (s!=""){
                alert(s);
                jQuery("#y1").hide();
                jQuery("#y2").show();
                jQuery("#y3").hide();
            }
        });
        jQuery(function (){
            var o="${requestScope.wos}";
            if (o!=""){
                jQuery("#y1").hide();
                jQuery("#y2").hide();
                jQuery("#y3").show();
            }
        });
        jQuery(function (){
            var r="${requestScope.del}";
            if (r=="kong"){
                alert("书库暂时未收录此书");
            }else if (r=="cheng"){
                alert("删除成功");
            }
        });
        jQuery(function (){
            var p="${requestScope.xiu}";
            if(p!=""){
                alert(p);
            }
        });
    </script>
</head>
<body>
<div id="div03">
    <ul id="UI2" style="width: 120px; margin: 0% 10%;" >
        <li class="table"><button style="font-size: 35px;font-family: 隶书; height: 60px;width: 120px;" id="d1">搜索</button></li>
        <li class="table"><button style="font-size: 35px;font-family: 隶书; height: 60px;width: 120px;" id="d2">添加</button></li>
        <li class="table"><button style="font-size: 35px;font-family: 隶书; height: 60px;width: 120px;" id="d3">下载</button></li>
    </ul>
</div>
<%--****************************************搜索***********************************--%>
<div id="y1" style="text-align:center;">
    <form action="<%=d1%>in" method="post">
        <div id="div01">
            <h1 style="margin: 0% 40%;font-family: 华文行楷;">星火</h1>
            <input type="text" name="s1" style="width: 500px; height: 40px;">
            <input type="submit" style="width: 80px;height: 40px;">
        </div>
    </form>
    <div  id="div02">
        <ul id="UI1">
            <li class="tabled">书名</li>
            <li class="tabled">作者</li>
            <li class="tabled">封面</li>
            <li class="tabled">操作</li>
            <li class="tabled">操作</li>
            <li class="tabled">操作</li>
            <c:forEach items="${requestScope.list}" begin="0" varStatus="status" var="it" end="${requestScope.list.size()}" step="1">
                <c:if test="${it.name!=null&&it.author!=null}">
                    <li class="tabled" id="w1"><c:out value="${it.name}">${it.name}</c:out></li>
                    <li class="tabled" id="w2"><c:out value="${it.author}">${it.author}</c:out></li>
                    <li class="tabled"><img src="gdj/封面.jpeg" width="120px" height="60px"></li>
                    <li class="tabled"><a href="test04.jsp?name=${it.name}&author=${it.author}&">修改</a></li>
                    <li class="tabled"><a href="del?name=${it.name}&author=${it.author}">删除</a></li>
                    <li class="tabled"><a href="watch?name=${it.name}&author=${it.author}">阅读</a></li>
                </c:if>
            </c:forEach>
        </ul>
    </div>
</div>
<%--******************************添加**********************************************--%>
<div id="y2" style="text-align:center; margin: 5%;">
    <div id="div05">
        <h1 style="margin: 0% 40%;font-family: 华文行楷;">星火-添加</h1>
    </div>
    <div style="margin: 5% 30%;width: 500px;">
        <form action="<%=d1%>up" method="post" enctype="multipart/form-data">
            <ul>
                <li class="tables">书名:<input type="text" name="name" style="width: 190px; height: 25px;"><br></li>
                <li class="tables">作者:<input type="text" name="author" style="width: 190px; height: 25px;"><br></li>
                <li class="tables">&nbsp;&nbsp;&nbsp;&nbsp;封面:<input type="file" name="img" accept="image/*"><br></li>
                <li class="tables">&nbsp;&nbsp;&nbsp;&nbsp;内容:<input type="file" name="File" accept="text/*"><br></li>
                <li class="tables"><input type="submit" name="d1" value="上传"></li>
            </ul>
        </form>
    </div>
</div>
<%--**************************************下载********************************************--%>
<div id="y3" style="text-align:center; margin: 5%">
    <form action="<%=d1%>item" method="post">
        <div id="div08">
            <h1 style="margin: 0% 40%;font-family: 华文行楷;">星火</h1>
            <input type="text" name="x1" style="width: 500px; height: 40px;">
            <input type="submit" style="width: 80px;height: 40px;">
        </div>
    </form>
    <div  id="div07">
            <ul id="UI3">
                <li class="tabled">书名</li>
                <li class="tabled">作者</li>
                <li class="tabled">封面</li>
                <li class="tabled">操作</li>
                <c:forEach items="${requestScope.lists}" begin="0" varStatus="status" var="its" end="${requestScope.lists.size()}" step="1">
                    <c:if test="${its.name!=null&&its.author!=null}">
                        <li class="tabled" name="filename" id="wa1"><c:out value="${its.name}">${its.name}</c:out></li>
                        <li class="tabled" name="fileauthor" id="wa2"><c:out value="${its.author}">${its.author}</c:out></li>
                        <li class="tabled"><img src="gdj/封面.jpeg" width="120px" height="60px"></li>
                        <li class="tabled"><a href="dwon?txt=${its.txt}" name="${its.img}">下载</a></li>
                    </c:if>
                </c:forEach>
            </ul>
    </div>
</div>
</body>
</html>

下载文件名与上传时一致,所以有现在小说名与下载文件不一致的请况。

 五,项目心得

这个项目在制作中制作过很多问题,包括找不到数据库等,一些主要问题我放在上一个博客中了,这里就不多说了。除了知识上的新的,还有就是能力上的,比如页面写不好啊什么的,最大的就是开始时我是想讲增删改查等Servlrt放在同一个java中的,结果写着写着忘了。。。。还有我的文件命名。。一言难尽。并且这个严格来说并不是我独立写出来的,还有一部分参考了书城项目。以及向他人求助bug改不好了,它们让我明白了合作的重要性。我相信,在后来的学习中,我会珍惜这次的学习结果,更加努力地向前。

六,代码分享

items https://www.aliyundrive.com/s/zt3R9tnSuTm 提取码: o45x 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值