代码如下:
drop database if exists db_ajax; create database db_ajax; use db_ajax; create table user_table ( user_id int auto_increment primary key, name varchar(255) unique, pass varchar(255) ); create table photo_table ( photo_id int auto_increment primary key, title varchar(255), fileName varchar(255), owner_id int, foreign key(owner_id) references user_table(user_id) );
/ajax_0500_jQuery_album/WebRoot/album.html 代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> 电子相册系统 </title> <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> <link rel="stylesheet" href="css/flora.dialog.css" type="text/css" /> <link rel="stylesheet" href="css/flora.resizable.css" type="text/css" /> <link rel="stylesheet" href="css/flora.draggable.css" type="text/css" /> <link rel="stylesheet" href="css/flora.css" type="text/css" /> <link rel="stylesheet" href="css/album.css" type="text/css" /> <script type="text/javascript" src="js/jquery-1.2.6.min.js"></script> <script type="text/javascript" src="js/ui.core.js"></script> <script type="text/javascript" src="js/ui.dialog.js"></script> <script type="text/javascript" src="js/ui.resizable.js"></script> <script type="text/javascript" src="js/ui.draggable.js"></script> <script type="text/javascript" src="js/album.js"></script> </head> <body class="flora"> <table width="780" border="0" cellspacing="1" align="center"> <caption><h3>电子相册系统</h3></caption> <tr> <td height="60" colspan="2"> <!-- 没有登录显示下面div元素 --> <div id="noLogin"> <!-- 这里是注册/登录的表格 --> <table width="100%" border="0" cellspacing="0"> <tr> <td width="38%">用户名: <input id="user" type="text" name="user" /></td> <td width="38%">密 码: <input id="pass" type="text" name="pass" /></td> <td width="24%">我还没有注册,请让我<a href="javascript:void(0);" onclick="changeRegist();">注册</a></td> </tr> <tr> <td colspan="5"> <div id="loginDiv" align="center"> <input id="login" type="button" onclick="proLogin();" value="登录" /> <input id="resetLogin" type="button" onclick="reset();" value="重设" /> </div> <div id="registDiv" align="center" style="display:none"> <a href="javascript:void(0)" onclick="validateName();">验证用户名是否可用</a> <input id="regist" type="button" onclick="regist();" value="注册" /> <input id="resetRegist" type="button" onclick="reset();" value="重设" /> </div> </td> </tr> </table> </div> <!-- 已经登录显示下面div元素 --> <div id="hasLogin" align="center" style="display:none"> 您已经登录成功,下面是您的相册,您也可以<a href="javascript:void(0);" onclick="openUpload();">增加相片</a> </div> </td> </tr> <tr> <!-- 显示相片列表的元素 --> <td width="120" height="440" valign="top"> <div align="center"><h3>相片列表</h3></div> <div id="list"></div><hr /> <div align="center"><a href="javascript:void(0);" onclick="turnPage(-1);"></a></div> </td> <!-- 显示相片的元素 --> <td width="660" align="center" valign="middle"> <div style="width:640px;height:430px;overflow:auto"> <img id="show" alt="当前相片"></img></div></td> </tr> </table> <div id="uploadDiv" style="display:none"> <form action="proUpload" method="post" enctype="multipart/form-data"> <table width="400" border="0" cellspacing="1" cellpadding="10"> <caption>上传图片</caption> <tr> <td height="25">图片标题:</td> <td><input id="title" name="title" type="text" /></td> </tr> <tr> <td height="25">浏览图片:</td> <td><input id="file" name="file" type="file" /></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="上传" /> <input type="reset" value="重设" /> </td> </tr> </table> </form> </div> <div id="tipDiv" style="display:none"> </div> </body> </html>
/ajax_0500_jQuery_album/WebRoot/WEB-INF/web.xml 代码如下:
<?xml version="1.0" encoding="GBK"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!-- 配置Web应用启动时候加载Spring容器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>proLogin</servlet-name> <servlet-class>com.b510.album.web.ProLoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>proLogin</servlet-name> <url-pattern>/proLogin</url-pattern> </servlet-mapping> <servlet> <servlet-name>proRegist</servlet-name> <servlet-class>com.b510.album.web.ProRegistServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>proRegist</servlet-name> <url-pattern>/proRegist</url-pattern> </servlet-mapping> <servlet> <servlet-name>validateName</servlet-name> <servlet-class>com.b510.album.web.ValidateNameServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>validateName</servlet-name> <url-pattern>/validateName</url-pattern> </servlet-mapping> <servlet> <servlet-name>getPhoto</servlet-name> <servlet-class>com.b510.album.web.GetPhotoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getPhoto</servlet-name> <url-pattern>/getPhoto</url-pattern> </servlet-mapping> <servlet> <servlet-name>showImg</servlet-name> <servlet-class>com.b510.album.web.ShowImgServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>showImg</servlet-name> <url-pattern>/showImg</url-pattern> </servlet-mapping> <servlet> <servlet-name>pageLoad</servlet-name> <servlet-class>com.b510.album.web.PageLoadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>pageLoad</servlet-name> <url-pattern>/pageLoad</url-pattern> </servlet-mapping> <servlet> <servlet-name>turnPage</servlet-name> <servlet-class>com.b510.album.web.TurnPageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>turnPage</servlet-name> <url-pattern>/turnPage</url-pattern> </servlet-mapping> <servlet> <servlet-name>proUpload</servlet-name> <servlet-class>com.b510.album.web.ProUploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>proUpload</servlet-name> <url-pattern>/proUpload</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>album.html</welcome-file> </welcome-file-list> </web-app>
/ajax_0500_jQuery_album/WebRoot/WEB-INF/applicationContext.xml 代码如下:
<?xml version="1.0" encoding="GBK"?> <!-- 指定Spring配置文件的Schema信息 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <!-- 定义数据源Bean,使用C3P0数据源实现 --> <bean id="dataSource" destroy-method="close" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 指定连接数据库的驱动 --> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!-- 指定连接数据库的URL --> <property name="jdbcUrl" value="jdbc:mysql://localhost:3308/db_ajax"/> <!-- 指定连接数据库的用户名 --> <property name="user" value="root"/> <!-- 指定连接数据库的密码 --> <property name="password" value="root"/> <!-- 指定连接数据库连接池的最大连接数 --> <property name="maxPoolSize" value="40"/> <!-- 指定连接数据库连接池的最小连接数 --> <property name="minPoolSize" value="1"/> <!-- 指定连接数据库连接池的初始化连接数 --> <property name="initialPoolSize" value="1"/> <!-- 指定连接数据库连接池的连接的最大空闲时间 --> <property name="maxIdleTime" value="20"/> </bean> <!-- 定义Hibernate的SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 依赖注入数据源,注入上面定义的dataSource --> <property name="dataSource" ref="dataSource"/> <!-- mappingResouces属性用来列出全部映射文件 --> <property name="mappingResources"> <list> <!-- 以下用来列出Hibernate映射文件 --> <value>com/b510/album/model/User.hbm.xml</value> <value>com/b510/album/model/Photo.hbm.xml</value> </list> </property> <!-- 定义Hibernate的SessionFactory的属性 --> <property name="hibernateProperties"> <props> <!-- 指定数据库方言 --> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLInnoDBDialect</prop> <!-- 是否根据需要每次自动创建数据库 --> <prop key="hibernate.hbm2ddl.auto">update</prop> <!-- 显示Hibernate持久化操作所生成的SQL --> <prop key="hibernate.show_sql">true</prop> <!-- 将SQL脚本进行格式化后再输出 --> <prop key="hibernate.format_sql">true</prop> </props> </property> </bean> <!-- 配置UserDao组件 --> <bean id="userDao" class="com.b510.album.dao.impl.UserDaoHibernate"> <!-- 注入SessionFactory引用 --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 配置PhotoDao组件 --> <bean id="photoDao" class="com.b510.album.dao.impl.PhotoDaoHibernate"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 配置albumService业务逻辑组件 --> <bean id="albumService" class="com.b510.album.service.impl.AlbumServiceImpl"> <!-- 为业务逻辑组件注入2个DAO组件 --> <property name="userDao" ref="userDao"/> <property name="photoDao" ref="photoDao"/> </bean> <!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 --> <!-- 该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <!-- 配置HibernateTransactionManager时需要依注入SessionFactory的引用 --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 配置事务切面Bean,指定事务管理器 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 用于配置详细的事务语义 --> <tx:attributes> <!-- 所有以'get'开头的方法是read-only的 --> <tx:method name="get*" read-only="true"/> <!-- 其他方法使用默认的事务设置 --> <tx:method name="*"/> </tx:attributes> </tx:advice> <aop:config> <!-- 配置一个切入点,匹配lee包下所有以Impl结尾的类执行的所有方法 --> <aop:pointcut id="leeService" expression="execution(* com.b510.album.service.impl.*Impl.*(..))"/> <!-- 指定在leeService切入点应用txAdvice事务切面 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="leeService"/> </aop:config> </beans>
/ajax_0500_jQuery_album/WebRoot/js/album.js 代码如下:
$(document).ready(function(){ $.getScript("pageLoad"); //处理地址栏的resultCode参数 var locationStr = document.location.toString(); var resultIndex = locationStr.indexOf("resultCode"); var resultCode = -1; if (resultIndex > 1) { resultCode = locationStr.substring(resultIndex + 11 , resultIndex + 12); //根据不同的resultCode,系统进行不同处理 switch(resultCode) { case "0" : alert('恭喜你,上传文件成功!'); $('#uploadDiv').dialog('close'); break; case "1" : alert('本系统只允许上传JPG、GIF、PNG图片文件,请重试!'); $('#title,#file').val(''); break; case "2" : alert('处理上传文件出现错误,请重试!'); $('#title,#file').val(''); break; } } }); function reset() { //清空user、pass两个单行文本框 $("#user").val(""); $("#pass").val(""); } //切换到注册对话框 function changeRegist() { //隐藏登录用的两个按钮 $("#loginDiv").hide("500"); //显示注册用的两个按钮 $("#registDiv").show("500"); } //处理用户登录的函数 function proLogin() { //获取user、pass两个文本框的值 var user = $.trim($("#user").val()); var pass = $.trim($("#pass").val()); if (user == null || user == "" || pass == null|| pass =="") { alert("必须先输入用户名和密码才能登录"); return false; } else { //向proLogin发送异步、POST请求 $.post("proLogin", $('#user,#pass').serializeArray() , null , "script"); } } //处理用户注册的函数 function regist() { //获取user、pass两个文本框的值 var user = $.trim($("#user").val()); var pass = $.trim($("#pass").val()); if (user == null || user == "" || pass == null || pass =="") { alert("必须先输入用户名和密码才能注册"); return false; } else { //向proRegist发送异步、POST请求 $.post("proRegist", $('#user,#pass').serializeArray() , null , "script"); } } //验证用户名是否可用 function validateName() { //获取user文本框的值 var user = $.trim($("#user").val()); if (user == null || user == "") { alert("您还没有输入用户名!"); return false; } else { //向validateName发送异步、POST请求 $.post("validateName", $('#user').serializeArray() , null , "script"); } } //周期性地获取当前用户、当前页的相片 function onLoadHandler() { //向getPhoto发送异步、GET请求 $.getScript("getPhoto"); //指定1秒之后再次执行此方法 setTimeout("onLoadHandler()", 1000); } //显示照片 function showImg(fileName) { $.getScript("showImg?img=" + fileName); // document.getElementById("show").src="uploadfiles/" + fileName + "?now=" + new Date(); // $("#show").attr("src" , "uploadfiles/" + fileName); } //处理翻页的函数 function turnPage(flag) { $.getScript("turnPage?turn=" + flag); } //打开上传窗口 function openUpload() { $("#uploadDiv").show() .dialog( { modal: true, resizable: false, width: 428, height: 220, overlay: {opacity: 0.5 , background: "black"} }); }
/ajax_0500_jQuery_album/src/com/b510/album/web/base/BaseServlet.java 代码如下:
package com.b510.album.web.base; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.b510.album.service.AlbumService; /** * * @author Hongten * */ public class BaseServlet extends HttpServlet { private static final long serialVersionUID = -2041755371540813745L; protected AlbumService as; // 定义构造器,获得Spring容器的引用 public void init(ServletConfig config) throws ServletException { super.init(config); ApplicationContext ctx = WebApplicationContextUtils .getWebApplicationContext(getServletContext()); as = (AlbumService) ctx.getBean("albumService"); } }
/ajax_0500_jQuery_album/src/com/b510/album/web/ValidateNameServlet.java 代码如下:
package com.b510.album.web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.b510.album.exception.AlbumException; import com.b510.album.web.base.BaseServlet; /** * * @author Hongten * */ public class ValidateNameServlet extends BaseServlet { private static final long serialVersionUID = 9038839276327742641L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String name = request.getParameter("user"); response.setContentType("text/javascript;charset=GBK"); // 获取输出流 PrintWriter out = response.getWriter(); try { if (name != null) { if (as.validateName(name)) { out.println("alert('恭喜您,该用户名还未使用,你可使用该用户名!');"); } else { out.println("alert('对不起,该用户名已被他人占用!');"); out.println("$('#user').val('');"); } } else { out.println("alert('验证用户名出现异常,请更换用户名重试!');"); } } catch (AlbumException ex) { out.println("alert('" + ex.getMessage() + "请更换用户名重试!');"); } } }
/ajax_0500_jQuery_album/src/com/b510/album/web/TurnPageServlet.java 代码如下:
package com.b510.album.web; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.b510.album.exception.AlbumException; import com.b510.album.vo.PhotoHolder; import com.b510.album.web.base.BaseServlet; /** * * @author Hongten * */ public class TurnPageServlet extends BaseServlet { private static final long serialVersionUID = -5097286750384714951L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String turn = request.getParameter("turn"); HttpSession session = request.getSession(true); String name = (String) session.getAttribute("curUser"); Object pageObj = session.getAttribute("curPage"); // 如果HttpSession中的curPage为null,则设置当前页为第一页 int curPage = pageObj == null ? 1 : (Integer) pageObj; response.setContentType("text/javascript;charset=GBK"); PrintWriter out = response.getWriter(); if (curPage == 1 && turn.equals("-1")) { out.println("alert('现在已经是第一页,无法向前翻页!')"); } else { // 执行翻页,修改curPage的值。 curPage += Integer.parseInt(turn); try { List<PhotoHolder> photos = as.getPhotoByUser(name, curPage); // 翻页后没有记录 if (photos.size() == 0) { out.println("alert('翻页后找不到任何相片记录,系统将自动返回上一页')"); // 重新返回上一页 curPage -= Integer.parseInt(turn); } else { // 把用户正在浏览的页码放入HttpSession中 session.setAttribute("curPage", curPage); } } catch (AlbumException ex) { out.println("alert('" + ex.getMessage() + "请重试!')"); } } } }
/ajax_0500_jQuery_album/src/com/b510/album/web/ShowImgServlet.java 代码如下:
package com.b510.album.web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.b510.album.web.base.BaseServlet; /** * * @author Hongten * */ public class ShowImgServlet extends BaseServlet { private static final long serialVersionUID = 1460203270448078666L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String img = request.getParameter("img"); HttpSession session = request.getSession(true); // 将用户正在浏览的图片放入HttpSession中。 session.setAttribute("curImg", img); response.setContentType("text/javascript;charset=GBK"); // 获取输出流 PrintWriter out = response.getWriter(); out.println("$('#show').attr('src' , 'uploadfiles/" + img + "');"); } }
/ajax_0500_jQuery_album/src/com/b510/album/web/ProUploadServlet.java 代码如下:
package com.b510.album.web; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.b510.album.exception.AlbumException; import com.b510.album.web.base.BaseServlet; /** * * @author Hongten * */ @SuppressWarnings("unchecked") public class ProUploadServlet extends BaseServlet { private static final long serialVersionUID = 642229801989188793L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { Iterator iter = null; String title = null; response.setContentType("text/html;charset=GBK"); // 获取输出流 PrintWriter out = response.getWriter(); out.println("<script type='text/javascript>'"); try { // 使用Uploader处理上传 FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List items = upload.parseRequest(request); iter = items.iterator(); // 遍历每个表单控件对应的内容 while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); // 如果该项是普通表单域 if (item.isFormField()) { String name = item.getFieldName(); if (name.equals("title")) { title = item.getString("GBK"); } } // 如果是需要上传的文件 else { String user = (String) request.getSession().getAttribute( "curUser"); String serverFileName = null; // 返回文件名 String fileName = item.getName(); // 取得文件后缀 String appden = fileName.substring(fileName .lastIndexOf(".")); // 返回文件类型 String contentType = item.getContentType(); // 只允许上传jpg、gif、png图片 if (contentType.equals("image/pjpeg") || contentType.equals("image/gif") || contentType.equals("image/jpeg") || contentType.equals("image/png")) { InputStream input = item.getInputStream(); serverFileName = String.valueOf(System .currentTimeMillis()); FileOutputStream output = new FileOutputStream( getServletContext().getRealPath("/") + "uploadfiles\\" + serverFileName + appden); byte[] buffer = new byte[1024]; int len = 0; while ((len = input.read(buffer)) > 0) { output.write(buffer, 0, len); } input.close(); output.close(); as.addPhoto(user, title, serverFileName + appden); response.sendRedirect("album.html?resultCode=0"); } else { response.sendRedirect("album.html?resultCode=1"); } } } } catch (FileUploadException fue) { fue.printStackTrace(); response.sendRedirect("album.html?resultCode=2"); } catch (AlbumException ex) { ex.printStackTrace(); } } }
/ajax_0500_jQuery_album/src/com/b510/album/web/ProRegistServlet.java 代码如下:
package com.b510.album.web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.b510.album.exception.AlbumException; import com.b510.album.web.base.BaseServlet; /** * * @author Hongten * */ public class ProRegistServlet extends BaseServlet { private static final long serialVersionUID = -3174994243043815566L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String name = request.getParameter("user"); String pass = request.getParameter("pass"); response.setContentType("text/javascript;charset=GBK"); // 获取输出流 PrintWriter out = response.getWriter(); try { out.println("$('#user,#pass').val('');"); if (name != null && pass != null && as.registUser(name, pass) > 0) { HttpSession session = request.getSession(true); session.setAttribute("curUser", name); out.println("alert('恭喜您,您已经注册成功!');"); out.println("$('#noLogin').hide(500);"); out.println("$('#hasLogin').show(500);"); // 调用获取相片列表的方法 out.println("onLoadHandler();"); } else { out.println("alert('您注册出现失败,请选择合适的用户名重试!');"); } } catch (AlbumException ex) { out.println("alert('" + ex.getMessage() + "请更换用户名重试!');"); } } }
/ajax_0500_jQuery_album/src/com/b510/album/web/ProLoginServlet.java 代码如下:
package com.b510.album.web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.b510.album.exception.AlbumException; import com.b510.album.web.base.BaseServlet; /** * * @author Hongten * */ public class ProLoginServlet extends BaseServlet { private static final long serialVersionUID = -1253530202224049958L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String name = request.getParameter("user"); String pass = request.getParameter("pass"); response.setContentType("text/javascript;charset=GBK"); // 获取输出流 PrintWriter out = response.getWriter(); try { // 清空id为user、pass输入框的内容 out.println("$('#user,#pass').val('');"); if (name != null && pass != null && as.userLogin(name, pass)) { HttpSession session = request.getSession(true); session.setAttribute("curUser", name); out.println("alert('您已经登录成功!')"); out.println("$('#noLogin').hide(500)"); out.println("$('#hasLogin').show(500)"); // 调用获取相片列表的方法 out.println("onLoadHandler();"); } else { out.println("alert('您输入的用户名、密码不符,请重试!')"); } } catch (AlbumException ex) { out.println("alert('" + ex.getMessage() + "请更换用户名、密码重试!')"); } } }
/ajax_0500_jQuery_album/src/com/b510/album/web/PageLoadServlet.java 代码如下:
package com.b510.album.web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.b510.album.web.base.BaseServlet; /** * * @author Hongten * */ public class PageLoadServlet extends BaseServlet { private static final long serialVersionUID = 7512001492425261841L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/javascript;charset=GBK"); // 获取输出流 PrintWriter out = response.getWriter(); HttpSession session = request.getSession(true); String name = (String) session.getAttribute("curUser"); // 如果name不为null,表明用户已经登录 if (name != null) { // 隐藏id为noLogin的元素(用户登录面板) out.println("$('#noLogin').hide()"); // 隐藏id为hasLogin的元素(用户控制面板) out.println("$('#hasLogin').show()"); // 调用获取相片列表的方法 out.println("onLoadHandler();"); // 取出HttpSession中的curImg属性 String curImg = (String) session.getAttribute("curImg"); // 重新显示用户正在浏览的相片 if (curImg != null) { out.println("$('#show').attr('src' , 'uploadfiles/" + curImg + "');"); } } } }
/ajax_0500_jQuery_album/src/com/b510/album/web/GetPhotoServlet.java 代码如下:
package com.b510.album.web; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.b510.album.exception.AlbumException; import com.b510.album.vo.PhotoHolder; import com.b510.album.web.base.BaseServlet; /** * * @author Hongten * */ public class GetPhotoServlet extends BaseServlet { private static final long serialVersionUID = -8380695760546582385L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { HttpSession session = request.getSession(true); // 从HttpSession中获取系统当前用户、相片列表的当前页码 String name = (String) session.getAttribute("curUser"); Object pageObj = session.getAttribute("curPage"); // 如果HttpSession中的curPage为null,则设置当前页为第一页 int curPage = pageObj == null ? 1 : (Integer) pageObj; response.setContentType("text/javascript;charset=GBK"); // 获取输出流 PrintWriter out = response.getWriter(); try { List<PhotoHolder> photos = as.getPhotoByUser(name, curPage); // 清空id为list的元素 out.println("var list = $('#list').empty();"); for (PhotoHolder ph : photos) { // 将每个相片动态添加到id为list的元素中 out.println("list.append(\"<div align='center'>" + "<a href='javascript:void(0)' onclick=\\\"showImg('" + ph.getFileName() + "');\\\">" + ph.getTitle() + "</a></div>\");"); } } catch (AlbumException ex) { out.println("alert('" + ex.getMessage() + "请重试!')"); } } }
/ajax_0500_jQuery_album/src/com/b510/album/vo/PhotoHolder.java 代码如下:
package com.b510.album.vo; /** * * @author Hongten * */ public class PhotoHolder { // 相片的名称 private String title; // 相片在服务器上的文件名 private String fileName; // 无参数的构造器 public PhotoHolder() { } // 初始化全部属性的构造器 public PhotoHolder(String title, String fileName) { this.title = title; this.fileName = fileName; } // title属性的setter和getter方法 public void setTitle(String title) { this.title = title; } public String getTitle() { return this.title; } // fileName属性的setter和getter方法 public void setFileName(String fileName) { this.fileName = fileName; } public String getFileName() { return this.fileName; } }
/ajax_0500_jQuery_album/src/com/b510/album/service/impl/AlbumServiceImpl.java 代码如下:
package com.b510.album.service.impl; import java.util.ArrayList; import java.util.List; import com.b510.album.dao.PhotoDao; import com.b510.album.dao.UserDao; import com.b510.album.exception.AlbumException; import com.b510.album.model.Photo; import com.b510.album.model.User; import com.b510.album.service.AlbumService; import com.b510.album.vo.PhotoHolder; /** * * @author Hongten * */ public class AlbumServiceImpl implements AlbumService { // 业务逻辑组件所依赖的2个DAO组件 private UserDao ud = null; private PhotoDao pd = null; // 依赖注入2个DAO组件所需的setter方法 public void setUserDao(UserDao ud) { this.ud = ud; } public void setPhotoDao(PhotoDao pd) { this.pd = pd; } /** * 验证用户登录是否成功。 * * @param name * 登录的用户名 * @param pass * 登录的密码 * @return 用户登录的结果,成功返回true,否则返回false */ public boolean userLogin(String name, String pass) { try { // 使用UserDao根据用户名查询用户 User u = ud.findByName(name); if (u != null && u.getPass().equals(pass)) { return true; } return false; } catch (Exception ex) { ex.printStackTrace(); throw new AlbumException("处理用户登录出现异常!"); } } /** * 注册新用户 * * @param name * 新注册用户的用户名 * @param pass * 新注册用户的密码 * @return 新注册用户的主键 */ public int registUser(String name, String pass) { try { // 创建一个新的User实例 User u = new User(); u.setName(name); u.setPass(pass); // 持久化User对象 ud.save(u); return u.getId(); } catch (Exception ex) { ex.printStackTrace(); throw new AlbumException("新用户注册出现异常!"); } } /** * 添加照片 * * @param user * 添加相片的用户 * @param title * 添加相片的标题 * @param fileName * 新增相片在服务器上的文件名 * @return 新添加相片的主键 */ public int addPhoto(String user, String title, String fileName) { try { // 创建一个新的Photo实例 Photo p = new Photo(); p.setTitle(title); p.setFileName(fileName); p.setUser(ud.findByName(user)); // 持久化Photo实例 pd.save(p); return p.getId(); } catch (Exception ex) { ex.printStackTrace(); throw new AlbumException("添加相片过程中出现异常!"); } } /** * 根据用户获得该用户的所有相片 * * @param user * 当前用户 * @param pageNo * 页码 * @return 返回属于该用户、指定页的相片 */ public List<PhotoHolder> getPhotoByUser(String user, int pageNo) { try { List<Photo> pl = pd.findByUser(ud.findByName(user), pageNo); List<PhotoHolder> result = new ArrayList<PhotoHolder>(); for (Photo p : pl) { result.add(new PhotoHolder(p.getTitle(), p.getFileName())); } return result; } catch (Exception ex) { ex.printStackTrace(); throw new AlbumException("查询相片列表的过程中出现异常!"); } } /** * 验证用户名是否可用,即数据库里是否已经存在该用户名 * * @param name * 需要校验的用户名 * @return 如果该用户名可用,返回true,否则返回false。 */ public boolean validateName(String name) { try { // 根据用户名查询对应的User实例 User u = ud.findByName(name); if (u != null) { return false; } return true; } catch (Exception ex) { ex.printStackTrace(); throw new AlbumException("验证用户名是否存在的过程中出现异常!"); } } }
/ajax_0500_jQuery_album/src/com/b510/album/service/AlbumService.java 代码如下:
package com.b510.album.service; import java.util.List; import com.b510.album.vo.PhotoHolder; /** * * @author Hongten * */ public interface AlbumService { /** * 验证用户登录是否成功。 * * @param name * 登录的用户名 * @param pass * 登录的密码 * @return 用户登录的结果,成功返回true,否则返回false */ boolean userLogin(String name, String pass); /** * 注册新用户 * * @param name * 新注册用户的用户名 * @param pass * 新注册用户的密码 * @return 新注册用户的主键 */ int registUser(String name, String pass); /** * 添加照片 * * @param user * 添加相片的用户 * @param title * 添加相片的标题 * @param fileName * 新增相片在服务器上的文件名 * @return 新添加相片的主键 */ int addPhoto(String user, String title, String fileName); /** * 根据用户获得该用户的所有相片 * * @param user * 当前用户 * @param pageNo * 页码 * @return 返回属于该用户、指定页的相片 */ List<PhotoHolder> getPhotoByUser(String user, int pageNo); /** * 验证用户名是否可用,即数据库里是否已经存在该用户名 * * @param name * 需要校验的用户名 * @return 如果该用户名可用,返回true,否则返回false。 */ boolean validateName(String name); }
/ajax_0500_jQuery_album/src/com/b510/album/model/Photo.java 代码如下:
package com.b510.album.model; /** * Photo实体类 * * @author Hongten * */ public class Photo { // 标识属性 private Integer id; // 该相片的名称 private String title; // 相片在服务器上的文件名 private String fileName; // 保存该相片所属的用户 private User user; // 无参数的构造器 public Photo() { } // 初始化全部属性的构造器 public Photo(Integer id, String title, String fileName, User user) { this.id = id; this.title = title; this.fileName = fileName; this.user = user; } // id属性的setter和getter方法 public void setId(Integer id) { this.id = id; } public Integer getId() { return this.id; } // title属性的setter和getter方法 public void setTitle(String title) { this.title = title; } public String getTitle() { return this.title; } // fileName属性的setter和getter方法 public void setFileName(String fileName) { this.fileName = fileName; } public String getFileName() { return this.fileName; } // user属性的setter和getter方法 public void setUser(User user) { this.user = user; } public User getUser() { return this.user; } }
/ajax_0500_jQuery_album/src/com/b510/album/model/User.java 代码如下:
package com.b510.album.model; import java.util.Set; import java.util.HashSet; /** * User实体类 * * @author Hongten * */ public class User { // 标识属性 private Integer id; // 该用户的用户名 private String name; // 该用户的密码 private String pass; // 使用Set保存该用户关联的相片 private Set<Photo> photos = new HashSet<Photo>(); // 无参数的构造器 public User() { } // 初始化全部属性的构造器 public User(Integer id, String name, String pass) { this.id = id; this.name = name; this.pass = pass; } // id属性的setter和getter方法 public void setId(Integer id) { this.id = id; } public Integer getId() { return this.id; } // name属性的setter和getter方法 public void setName(String name) { this.name = name; } public String getName() { return this.name; } // pass属性的setter和getter方法 public void setPass(String pass) { this.pass = pass; } public String getPass() { return this.pass; } // photos属性的setter和getter方法 public void setPhotos(Set<Photo> photos) { this.photos = photos; } public Set<Photo> getPhotos() { return this.photos; } }
/ajax_0500_jQuery_album/src/com/b510/album/model/Photo.hbm.xml 代码如下:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Hibernate映射文件的根元素 --> <hibernate-mapping package="com.b510.album.model"> <!-- 每个class元素映射一个持久化类 --> <class name="Photo" table="photo_table"> <id name="id" type="int" column="photo_id"> <!-- 指定主键生成器策略 --> <generator class="identity"/> </id> <!-- 映射普通属性 --> <property name="title" type="string"/> <property name="fileName" type="string"/> <!-- 映射和User实体的N:1关联 --> <many-to-one name="user" column="owner_id" class="User" not-null="true"/> </class> </hibernate-mapping>
/ajax_0500_jQuery_album/src/com/b510/album/model/User.hbm.xml 代码如下:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Hibernate映射文件的根元素 --> <hibernate-mapping package="com.b510.album.model"> <!-- 每个class元素映射一个持久化类 --> <class name="User" table="user_table"> <!-- 映射标识属性 --> <id name="id" type="int" column="user_id"> <!-- 指定主键生成器策略 --> <generator class="identity"/> </id> <!-- 映射普通属性 --> <property name="name" type="string" unique="true"/> <property name="pass" type="string"/> <!-- 映射和Photo实体的1:N关联 --> <set name="photos" inverse="true"> <key column="owner_id"/> <one-to-many class="Photo"/> </set> </class> </hibernate-mapping>
/ajax_0500_jQuery_album/src/com/b510/album/exception/AlbumException.java 代码如下:
package com.b510.album.exception; /** * 自定义的Exception * * @author Hongten * */ public class AlbumException extends RuntimeException { private static final long serialVersionUID = 8050756054850450421L; // 提供一个无参数的构造器 public AlbumException() { } // 提供一个带字符串参数的构造器 public AlbumException(String msg) { super(msg); } }
/ajax_0500_jQuery_album/src/com/b510/album/enhance/HongtenHibernateDaoSupport.java 代码如下:
package com.b510.album.enhance; import java.sql.SQLException; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** * * @author Hongten * */ @SuppressWarnings("unchecked") public class HongtenHibernateDaoSupport extends HibernateDaoSupport { /** * 使用hql 语句进行分页查询操作 * * @param hql * 需要查询的hql语句 * @param offset * 第一条记录索引 * @param pageSize * 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByPage(final String hql, final int offset, final int pageSize) { List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { List result = session.createQuery(hql).setFirstResult(offset) .setMaxResults(pageSize).list(); return result; } }); return list; } /** * 使用hql 语句进行分页查询操作 * * @param hql * 需要查询的hql语句 * @param value * 如果hql有一个参数需要传入,value就是传入的参数 * @param offset * 第一条记录索引 * @param pageSize * 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByPage(final String hql, final Object value, final int offset, final int pageSize) { List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { List result = session.createQuery(hql).setParameter(0, value) .setFirstResult(offset).setMaxResults(pageSize).list(); return result; } }); return list; } /** * 使用hql 语句进行分页查询操作 * * @param hql * 需要查询的hql语句 * @param values * 如果hql有多个个参数需要传入,values就是传入的参数数组 * @param offset * 第一条记录索引 * @param pageSize * 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByPage(final String hql, final Object[] values, final int offset, final int pageSize) { List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } List result = query.setFirstResult(offset).setMaxResults( pageSize).list(); return result; } }); return list; } }
/ajax_0500_jQuery_album/src/com/b510/album/dao/impl/PhotoDaoHibernate.java 代码如下:
package com.b510.album.dao.impl; import java.util.List; import com.b510.album.dao.PhotoDao; import com.b510.album.enhance.HongtenHibernateDaoSupport; import com.b510.album.model.Photo; import com.b510.album.model.User; /** * * @author Hongten * */ @SuppressWarnings("unchecked") public class PhotoDaoHibernate extends HongtenHibernateDaoSupport implements PhotoDao { /** * 根据标识属性来加载Photo实例 * * @param id * 需要加载的Photo实例的标识属性值 * @return 指定标识属性对应的Photo实例 */ public Photo get(Integer id) { return (Photo) getHibernateTemplate().get(Photo.class, id); } /** * 持久化指定的Photo实例 * * @param photo * 需要被持久化的Photo实例 * @return Photo实例被持久化后的标识属性值 */ public Integer save(Photo photo) { return (Integer) getHibernateTemplate().save(photo); } /** * 修改指定的Photo实例 * * @param photo * 需要被修改的Photo实例 */ public void update(Photo photo) { getHibernateTemplate().update(photo); } /** * 删除指定的Photo实例 * * @param photo * 需要被删除的Photo实例 */ public void delete(Photo photo) { getHibernateTemplate().delete(photo); } /** * 根据标识属性删除Photo实例 * * @param id * 需要被删除的Photo实例的标识属性值 */ public void delete(Integer id) { getHibernateTemplate().delete(get(id)); } /** * 查询全部的Photo实例 * * @return 数据库中全部的Photo实例 */ public List<Photo> findAll() { return (List<Photo>) getHibernateTemplate().find("from Photo"); } /** * 查询属于指定用户的相片,且进行分页控制 * * @param user * 查询相片所属的用户 * @param pageNo * 需要查询的指定页 * @return 查询到的相片 */ public List<Photo> findByUser(User user, int pageNo) { int offset = (pageNo - 1) * PAGE_SIZE; // 返回分页查询的结果 return (List<Photo>) findByPage("from Photo b where b.user = ?", user, offset, PAGE_SIZE); } }
/ajax_0500_jQuery_album/src/com/b510/album/dao/impl/UserDaoHibernate.java 代码如下:
package com.b510.album.dao.impl; import java.util.List; import com.b510.album.dao.UserDao; import com.b510.album.enhance.HongtenHibernateDaoSupport; import com.b510.album.model.User; /** * * @author Hongten * */ @SuppressWarnings("unchecked") public class UserDaoHibernate extends HongtenHibernateDaoSupport implements UserDao { /** * 根据标识属性来加载User实例 * * @param id * 需要加载的User实例的标识属性值 * @return 指定标识属性对应的User实例 */ public User get(Integer id) { return (User) getHibernateTemplate().get(User.class, id); } /** * 持久化指定的User实例 * * @param user * 需要被持久化的User实例 * @return User实例被持久化后的标识属性值 */ public Integer save(User user) { return (Integer) getHibernateTemplate().save(user); } /** * 修改指定的User实例 * * @param user * 需要被修改的User实例 */ public void update(User user) { getHibernateTemplate().update(user); } /** * 删除指定的User实例 * * @param user * 需要被删除的User实例 */ public void delete(User user) { getHibernateTemplate().delete(user); } /** * 根据标识属性删除User实例 * * @param id * 需要被删除的User实例的标识属性值 */ public void delete(Integer id) { getHibernateTemplate().delete(get(id)); } /** * 查询全部的User实例 * * @return 数据库中全部的User实例 */ public List<User> findAll() { return (List<User>) getHibernateTemplate().find("from User"); } /** * 根据用户名查找用户 * * @param name * 需要查找的用户的用户名 * @return 查找到的用户 */ public User findByName(String name) { List<User> users = (List<User>) getHibernateTemplate().find( "from User u where u.name = ?", name); if (users != null && users.size() == 1) { return users.get(0); } return null; } }
/ajax_0500_jQuery_album/src/com/b510/album/dao/PhotoDao.java 代码如下:
package com.b510.album.dao; import java.util.List; import com.b510.album.model.Photo; import com.b510.album.model.User; /** * PhotoDao接口 * * @author Hongten * */ public interface PhotoDao { // 以常量控制每页显示的相片数 final int PAGE_SIZE = 8; /** * 根据标识属性来加载Photo实例 * * @param id * 需要加载的Photo实例的标识属性值 * @return 指定标识属性对应的Photo实例 */ Photo get(Integer id); /** * 持久化指定的Photo实例 * * @param photo * 需要被持久化的Photo实例 * @return Photo实例被持久化后的标识属性值 */ Integer save(Photo photo); /** * 修改指定的Photo实例 * * @param photo * 需要被修改的Photo实例 */ void update(Photo photo); /** * 删除指定的Photo实例 * * @param photo * 需要被删除的Photo实例 */ void delete(Photo photo); /** * 根据标识属性删除Photo实例 * * @param id * 需要被删除的Photo实例的标识属性值 */ void delete(Integer id); /** * 查询全部的Photo实例 * * @return 数据库中全部的Photo实例 */ List<Photo> findAll(); /** * 查询属于指定用户的相片,且进行分页控制 * * @param user * 查询相片所属的用户 * @param pageNo * 需要查询的指定页 * @return 查询到的相片 */ List<Photo> findByUser(User user, int pageNo); }
/ajax_0500_jQuery_album/src/com/b510/album/dao/UserDao.java 代码如下:
package com.b510.album.dao; import java.util.List; import com.b510.album.model.User; /** * UserDao接口 * * @author Hongten * */ public interface UserDao { /** * 根据标识属性来加载User实例 * * @param id * 需要加载的User实例的标识属性值 * @return 指定标识属性对应的User实例 */ User get(Integer id); /** * 持久化指定的User实例 * * @param user * 需要被持久化的User实例 * @return User实例被持久化后的标识属性值 */ Integer save(User user); /** * 修改指定的User实例 * * @param user * 需要被修改的User实例 */ void update(User user); /** * 删除指定的User实例 * * @param user * 需要被删除的User实例 */ void delete(User user); /** * 根据标识属性删除User实例 * * @param id * 需要被删除的User实例的标识属性值 */ void delete(Integer id); /** * 查询全部的User实例 * * @return 数据库中全部的User实例 */ List<User> findAll(); /** * 根据用户名查找用户 * * @param name * 需要查找的用户的用户名 * @return 查找到的用户 */ User findByName(String name); }
============================================================================================