导读:电子书代表人们所阅读的数字化出版物, 从而区别于以纸张为载体的传统出版物, 电子书是利用计算机技术将一定的文字、图片、声音、影像等信息, 通过数码方式记录在以光、电、磁为介质的设备中, 借助于特定的设备来读取、复制、传输,已经为人们所熟悉。
众所周知,自20世纪80年代以来,电子图书的出现和迅速发展已经引起社会各界的普遍关注。在信息社会化和社会信息化的今天,电子图书极大地刺激了传统图书出版、发行市场,改变了读者阅读习惯,给人类社会文化和社会生活带来了深刻的变革。一般情况下,阅读电子图书主要有两种形式,一种是在线或在PC机上阅读,即通过台式电脑或笔记本电脑直接阅读网站提供的免费或付费的电子图书,也可以下载到本地计算机上阅读;另一种是离线或脱机阅读,即通过使用专用的手持阅读器阅读。手持阅读器具有体积小,分量轻,容易携带的特点,不受时间、地点、环境的限制。而且,随着阅读器材技术、内容、格式的日臻完善,电子图书必将展示其更为广阔的发展空间。
对比传统的图书出租的书店,电子书租借平台有许多的优越性。对租借者来说,方便了大家租借图书的途径,不必走出家门,只需有一台电脑,一根网线,连上网就可以访问因特网上大量的电子书网站。随着因特网发展和上网用户的增加,农村也已开始有越来越多的网络连接,上网早已不是难事,所以,一个网络的电子书租借平台可以适应大众的需求。对于管理者来说,便于管理,运营成本低,没有地域限制。总之,电子书租借平台有着很高的灵活性和方便性,随着社会的发展,会为越来越多的人所接受,有着极高的应用前景。
在国外,电子图书的发展体现在阅读软件和阅读硬件两个方面。阅读软件主要指在线阅读器,阅读硬件一般是手持式阅读器,也包括手机。各软硬件生产厂商为了更好的吸引消费者,在这上面都下了不小的精力来完善自己产品的功能,保证产品质量和提高其可用性,竞争也比较激烈。
在国内,最为普遍的电子书阅读终端是PC,手机阅读电子书的方式也在逐渐增加,而专用的手持阅读器还有待推广。国内已经出现了很多的电子书网站,比较出名的有晋江文学、潇湘书院、小说阅读网等,内容包括一些原创,各类小说和国内外名著。为了自身发展,网站往往和一些网络作家签约,网络作家在签约网站发表自己的原创并获得不低的著作费,这样也丰富了网站的内容,更好地吸引读者,达到双赢的目的。网站盈利的方式主要是向读者收取阅读费,收费方式不尽相同,一般分为按字数收取,按本数收取和按时间收取费用,所以,拥有一个广大的用户群是保证网站持续良好发展的基础。网站也可以靠出租广告位置获得额外的利益,但是过多的广告,会影响网页的美观简洁,一些弹窗广告甚至会影响读者的操作,给用户造成不必要的麻烦,所以广告的投放一般不会过多
首页
后台管理
结构设计
浏览公告是前台页面的功能,只要登录网站主页即可进行公告的浏览,在主页上显示最新的几条公告。
List gonggaoList=new ArrayList();
String sql="select * from t_gonggao order by id desc";
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
Tgonggao gonggao=new Tgonggao();
gonggao.setId(rs.getString("id"));
gonggao.setTitle(rs.getString("title"));
gonggao.setContent(rs.getString("content"));
gonggao.setShijian(rs.getString("shijian"));
gonggaoList.add(gonggao);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
发布公告是由管理员来进行的操作,只有管理员有权限进行公告的发布及修改、删除,其他人只能够进行浏览,而管理员进行公告发布之前需要进行登录
在登陆进入管理页面之后,就可以进行公告的发布,管理员进入管理页面之后可以进行很多操作,而公告的发布与管理只是管理员众多工作之一
公告管理
public void gonggaoAdd(HttpServletRequest req,HttpServletResponse res)
{
String id=String.valueOf(new Date().getTime());
String title=req.getParameter("title");
String content=req.getParameter("content");
String shijian=new Date().toLocaleString();
String sql="insert into t_gonggao values(?,?,?,?)";
Object[] params={id,title,content,shijian};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "操作成功");
req.setAttribute("path", "gonggao?type=gonggaoMana");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void gonggaoDel(HttpServletRequest req,HttpServletResponse res)
{
String id=req.getParameter("id");
String sql="delete from t_gonggao where id=?";
Object[] params={id};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "操作成功");
req.setAttribute("path", "gonggao?type=gonggaoMana");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void gonggaoMana(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
List gonggaoList=new ArrayList();
String sql="select * from t_gonggao";
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
Tgonggao gonggao=new Tgonggao();
gonggao.setId(rs.getString("id"));
gonggao.setTitle(rs.getString("title"));
gonggao.setContent(rs.getString("content"));
gonggao.setShijian(rs.getString("shijian"));
gonggaoList.add(gonggao);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
req.setAttribute("gonggaoList", gonggaoList);
req.getRequestDispatcher("admin/gonggao/gonggaoMana.jsp").forward(req, res);
}
会员信息的注册有一定的限制条件,用户名必填项,年龄必须为数字,密码输入两次必须一致,否则会提示出错
public void userReg(HttpServletRequest req,HttpServletResponse res)
{
String id=String.valueOf(new Date().getTime());
String loginname=req.getParameter("loginname");
String loginpw=req.getParameter("loginpw");
String name=req.getParameter("name");
String sex=req.getParameter("sex");
String age=req.getParameter("age");
String address=req.getParameter("address");
String tel=req.getParameter("tel");
String email=req.getParameter("email");
String qq=req.getParameter("qq");
int dianquan=0;
String del="no";
String sql="insert into t_user values(?,?,?,?,?,?,?,?,?,?,?,?)";
Object[] params={id,loginname,loginpw,name,sex,age,address,tel,email,qq,dianquan,del};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
String targetURL = "/common/add_success.jsp";
dispatch(targetURL, req, res);
}
点券充值应为条件限制,不能做到与付费接口的连接,再此只做模拟,点券充值后需由管理员来确认。
public void chongzhiAdd(HttpServletRequest req,HttpServletResponse res)
{
String user_id=req.getParameter("user_id");
int jine=Integer.parseInt(req.getParameter("jine"));
String fukuanfangshi=req.getParameter("fukuanfangshi");
String shijian=new Date().toLocaleString();
String zhuangtai="a";
String sql="insert into t_chongzhi values(?,?,?,?,?)";
Object[] params={user_id,jine,fukuanfangshi,shijian,zhuangtai};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("msg", "申请成功。等待管理员审核");
String targetURL = "/common/msg.jsp";
dispatch(targetURL, req, res);
}
public void chongzhiMana(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
List chongzhiList=new ArrayList();
String sql="select * from t_chongzhi order by zhuangtai";
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
Tchongzhi chongzhi=new Tchongzhi();
chongzhi.setId(rs.getInt("id"));
chongzhi.setUser_id(rs.getString("user_id"));
chongzhi.setJine(rs.getInt("jine"));
chongzhi.setFukuanfangshi(rs.getString("fukuanfangshi"));
chongzhi.setShijian(rs.getString("shijian"));
chongzhi.setZhuangtai(rs.getString("zhuangtai"));
chongzhiList.add(chongzhi);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
req.setAttribute("chongzhiList", chongzhiList);
req.getRequestDispatcher("admin/chongzhi/chongzhiMana.jsp").forward(req, res);
}
登录到系统的会员,可以搜索自己喜爱的书籍, 可以按照书名搜索,也可以按照作者搜索, 如果有符合搜索条件的书籍,则会显示在主页面。
public void bookSearch(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
List bookList=new ArrayList();
String sql="select * from t_book where del='no' and name like '%"+req.getParameter("name").trim()+"%'"+" and zuozhe like '%"+req.getParameter("zuozhe").trim()+"%'";
System.out.println(sql+"^^^^^");
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
Tbook book=new Tbook();
book.setId(rs.getInt("id"));
book.setCatelog_id(rs.getInt("catelog_id"));
book.setName(rs.getString("name"));
book.setShifoumianfei(rs.getString("shifoumianfei"));
book.setDianquan(rs.getInt("dianquan"));
book.setDaxiao(rs.getString("daxiao"));
book.setJieshao(rs.getString("jieshao"));
book.setMianfeizhangjie(rs.getString("mianfeizhangjie"));
book.setFujian(rs.getString("fujian"));
book.setFujianYuanshiming(rs.getString("fujianYuanshiming"));
book.setFabushijian(rs.getString("fabushijian"));
book.setDel(rs.getString("del"));
book.setCatelog(liuService.getCatelog(rs.getInt("catelog_id")));
bookList.add(book);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
req.setAttribute("bookList", bookList);
req.getRequestDispatcher("qiantai/book/bookSearch.jsp").forward(req, res);
}
下载书籍
try
{
String fujianPath=request.getParameter("fujianPath");
String fujianYuashiMing=request.getParameter("fujianYuashiMing");
fujianYuashiMing=java.net.URLDecoder.decode(fujianYuashiMing,"UTF-8");
System.out.println(fujianYuashiMing+fujianPath);
SmartUpload su = new SmartUpload(); // 新建一个SmartUpload对象
su.initialize(pageContext); // 初始化
su.setContentDisposition(null);
// 设定contentDisposition为null以禁止浏览器自动打开文件,
//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开它。扩展名为pdf时,将用acrobat打开
//response.sendRedirect(path+"/updown/updown_err.jsp");
//su.downloadFile("/uploadPath/file/liu.doc"); // 下载英文文件
su.downloadFile(fujianPath, null, new String(fujianYuashiMing.getBytes(), "ISO8859-1")); // 下载中文文件
//downloadFile(String sourceFilePathName, String contentType, String destFileName)
out.clear();
out=pageContext.pushBody();
}
catch(Exception e)
{%>
<%}
书籍管理模块包括电子书类别管理模块和电子书的管理,由管理员来管理操作,可以添加和删除相应的电子书类别,电子书.电子书类别的管理包括添加和删除电子书
public void catelogAdd(HttpServletRequest req,HttpServletResponse res)
{
String name=req.getParameter("name");
String jieshao=req.getParameter("jieshao");
String del="no";
String sql="insert into t_catelog values(?,?,?)";
Object[] params={name,jieshao,del};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "操作成功");
req.setAttribute("path", "catelog?type=catelogMana");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void catelogDel(HttpServletRequest req,HttpServletResponse res)
{
String sql="update t_catelog set del='yes' where id="+Integer.parseInt(req.getParameter("id"));
Object[] params={};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "操作成功");
req.setAttribute("path", "catelog?type=catelogMana");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void catelogMana(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
List catelogList=new ArrayList();
String sql="select * from t_catelog where del='no'";
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
Tcatelog catelog=new Tcatelog();
catelog.setId(rs.getInt("id"));
catelog.setName(rs.getString("name"));
catelog.setJieshao(rs.getString("jieshao"));
catelogList.add(catelog);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
req.setAttribute("catelogList", catelogList);
req.getRequestDispatcher("admin/catelog/catelogMana.jsp").forward(req, res);
}
会员之间的交流,每个会员可以在系统的留言版上进行留言,而其他会员看到留言后可以与之进行交流。
public void liuyanAdd(HttpServletRequest req,HttpServletResponse res)
{
String id=String.valueOf(new Date().getTime());
String title=req.getParameter("title");
String content=req.getParameter("content");
String shijian=new Date().toLocaleString();
String user_id="0";
if(req.getSession().getAttribute("user")!=null)
{
Tuser user=(Tuser)req.getSession().getAttribute("user");
user_id=user.getId();
}
String sql="insert into t_liuyan values(?,?,?,?,?)";
Object[] params={id,title,content,shijian,user_id};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "操作成功");
req.setAttribute("path", "liuyan?type=liuyanAll");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void liuyanAll(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
List liuyanList=new ArrayList();
String sql="select * from t_liuyan";
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
Tliuyan liuyan=new Tliuyan();
liuyan.setId(rs.getString("id"));
liuyan.setTitle(rs.getString("title"));
liuyan.setContent(rs.getString("content"));
liuyan.setShijian(rs.getString("shijian"));
liuyan.setUser_id(rs.getString("user_id"));
liuyan.setUser_name(liuService.getUserName(rs.getString("user_id")));
liuyanList.add(liuyan);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
req.setAttribute("liuyanList", liuyanList);
req.getRequestDispatcher("qiantai/liuyan/liuyanAll.jsp").forward(req, res);
}
采用数据库的连接是用了一个java包来进行连接的,这样方便了数据库的管理。
在实现某一个功能时,首先要连接数据库。那么,如果我们在每一次进行数据库操作前都需要加载驱动、创建连接,则这些操作可以封装在一个数据库操作类中。这样做有很大的优点,一旦系统移植、数据库参数改变,则不需要重新修改所有的连接代码并重新编译,只要在这个封装类中改变其中的参数即可。在jsp页面中只需要引入这个包就可以,就不需要在每个页面写数据库的链接,大大的提高了工作的效率以及方便了编程。我采用了如下代码的一个类来统一管理数据库的连接:
public class DB
{
private Connection con;
private PreparedStatement pstm;
private String user = "sa";
private String password = "sa";
private String className = "net.sourceforge.jtds.jdbc.Driver";
private String url = "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=db_ebook";
public DB()
{
try
{
Class.forName(className);
} catch (ClassNotFoundException e)
{
System.out.println("加载数据库驱动失败!");
e.printStackTrace();
}
}
/** 创建数据库连接 */
public Connection getCon()
{
try
{
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e)
{
System.out.println("创建数据库连接失败!");
con = null;
e.printStackTrace();
}
return con;
}
public void doPstm(String sql, Object[] params)
{
if (sql != null && !sql.equals(""))
{
if (params == null)
params = new Object[0];
getCon();
if (con != null)
{
try
{
System.out.println(sql);
pstm = con.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
for (int i = 0; i < params.length; i++)
{
pstm.setObject(i + 1, params[i]);
}
pstm.execute();
} catch (SQLException e)
{
System.out.println("doPstm()方法出错!");
e.printStackTrace();
}
}
}
}
public ResultSet getRs() throws SQLException
{
return pstm.getResultSet();
}
public int getCount() throws SQLException
{
return pstm.getUpdateCount();
}
public void closed()
{
try
{
if (pstm != null)
pstm.close();
} catch (SQLException e)
{
System.out.println("关闭pstm对象失败!");
e.printStackTrace();
}
try
{
if (con != null)
{
con.close();
}
} catch (SQLException e)
{
System.out.println("关闭con对象失败!");
e.printStackTrace();
}
}
}
虽然基本功能可以实现,但是系统还是不够完善,在以后的学习和生活中需要继续对此系统进行完善。
点我下载完整项目及数据库