一,项目目的
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"> 封面:<input type="file" name="img" accept="image/*"><br></li>
<li class="tables"> 内容:<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 ,无需下载极速在线查看,视频原画倍速播放。