2026/4/16 22:42:13
网站建设
项目流程
游戏建设网站,seo关键词库,网站建设员工技能要求,app开发价格参考网上书城
主要技术
关键字#xff1a;JSP、servlet、AJAX、jstl、JavaScript、注册登录、分页、购物车、增删改查
开发环境#xff1a;Eclipse、MySQL 5.7、Tomcat 8.0
数据库表结构设计 books 表结构#xff1a; items 表结构#xff1a; orders 表结构#xff1a; u…网上书城主要技术关键字JSP、servlet、AJAX、jstl、JavaScript、注册登录、分页、购物车、增删改查开发环境Eclipse、MySQL 5.7、Tomcat 8.0数据库表结构设计books 表结构items 表结构orders 表结构userinfo 表结构项目包结构MVC 设计模式Mmodel 层biz 包业务处理。dao 包数据访问对数据库的一些封装操作。entity 包实体类javabean 构建View 层和数据库之间的桥梁作用。Vview 层JSP 页面与用户进行交互的界面。Ccontroller 层servlet 包控制层处理 View 层 JSP 页面发来的请求。注册登录模块Register注册页面中 form 表单验证用户名、验证密码、验证邮箱form methodpost actionRegisterServlet onsubmitreturn checkRegister() dl dt用 户 名/dt ddinput classinput-text typetext idusername nameusername onblurisUsernameLegal()/span idusernull/spanspan idalreadyExsits/span/dd dt密 码/dt ddinput classinput-text typepassword idpassword namepassword onblurisPasswordLegal() /span idnullpasswordfont color\green\密码至少8位/font/spanspan idsimplepassword/span/dd dt确认密码/dt ddinput classinput-text typepassword idrePassword namerePassword onblurisRepasswordLegal() /span idnullrePassword/spanspan iduneq/span/dd dtEmail地址/dt ddinput classinput-text typetext idemail nameemail onblurisEmailLegal() /span idnullemailfont color\green\请输入正确格式的邮箱/font/spanspan iderrorInput/span/dd dt/dt dd classbuttoninput classinput-reg typesubmit nameregister value //dd /dl /formAJAX异步 JavaScript 和 XML 验证用户名是否已被注册页面部分数据刷新而无需加载整个网页提高网站的访问效率。/** * Ajax检查用户是否已经被注册 * 异步发送请求时不等返回结果由回调函数处理结果 * returns {Boolean} */ function isExists() { var xmlHttp; //定义 xmlHttp XmlHttpRequest对象从服务器异步获取数据后通过javascript修改页面局部信息 try { //根据不同浏览器初始化不同的xmlHttp浏览器对象 //IE6以上浏览器 xmlHttp new ActiveXObject(Msxml2.XMLHTTP); } catch (e) { try { //FireFox xmlHttp new XMLHttpRequest(); } catch (e) { try { //IE5.5 xmlHttp new ActiveXObject(Microsoft.XMLHTTP); } catch (e) { alert(您的浏览器不支持Ajax); return false; } } } var username document.getElementById(username).value; //获取用户名 /** * open(提交方式[get|post]urlservlet路径同步或异步[false|true]) * RegisterServlet servlet路径 * 打开和后台服务器的链接 */ xmlHttp.open(POST, RegisterServlet?actioncheckusernameusername, true); //路径中不能有空格 xmlHttp.send(null); //传送数据 /** * onreadystatechange:调用回调函数 * readyState请求状态代码是未初始化1初始化2发送请求3开始接受数据4接受结果完毕 * status: http状态码 200成功404路径错误500后台代码错误, */ xmlHttp.onreadystatechange function() { if(xmlHttp.readyState4 xmlHttp.status200) { var usernull document.getElementById(usernull); var result xmlHttp.responseText; //接受服务器端传过来的数据写出来的数据都是String类型 if(result true) { usernull.innerHTML font colorred当前用户名已被注册/font; return false; } else if(result false) { usernull.innerHTML font colorgreen当前用户名可用/font; return true; } } } }LoginLoginServlet 中 doGet 方法protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username);//获取页面传过来的参数 String password request.getParameter(password); //登录操作 boolean flag userBiz.checkLogin(username, password); if(flag) { request.getSession().setAttribute(loginuser, username); // response.sendRedirect(main.jsp); response.sendRedirect(SearchServlet); //首页直接显示 } else {//登录失败 response.setContentType(text/html;charsetutf-8); // response.setCharacterEncoding(utf-8); PrintWriter out response.getWriter(); out.println(script typetext/javascript); out.println(alert(\登录失败请重新登录\));//反斜杠转义 out.println(open(\login.jsp\, \_self\););//重新打开新的页面, _self在原窗口打开 out.println(/script); out.close(); } }网站首页及搜索图书模块分页展示Jstl 标签库 cforEach循环遍历展示图书信息。c:forEach varbook items${books } tr tdinput typecheckbox namebookId value${book.bid } //td td classtitle${book.bookname }/td input typehidden nametitle value ${book.bid }:${book.bookname}/ td${book.b_price }/td input typehidden nameprice value ${book.bid }:${book.b_price}/ !-- b_price跟数据库字段名相对应 -- td${book.stock }/td input typehidden namestock value ${book.bid }:${book.stock}/ td classthumbimg src${book.\image } //td input typehidden name\image value ${book.bid }:${book.\image}/ /tr /c:forEach!--分页开始-- %if(request.getAttribute(current) ! null) { % div classpage-spliter a hrefSearchServlet首页/a %for(int i 1; i totalPage; i) { % %if(ino) { % !-- 如果不是当前页显示为链接 -- span classcurrent%i %/span %continue;} % a hrefSearchServlet?currentPage%i %%i %/a %} % a hrefSearchServlet?currentPage%totalPage %尾页/a /div %} % !--分页结束--servlet 处理protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(utf-8); String currentPage request.getParameter(currentPage);//获取当前页 int no currentPage null?1:Integer.parseInt(currentPage);//如果当前页为空则默认为1否则转化为相应的int // String currentSearchPage request.getParameter(currentSearchPage); String bookname request.getParameter(keywords);//获取你输入的书名 ListBook books null; if(booknamenull || bookname.equals()){ booksbookbiz.findAll(3, no);//查询所有。3代表每页显示的条数no当前显示页面 request.setAttribute(totalPage, (bookbiz.count()/3 1));//将总页面数存入request } else { books bookbiz.findBookByName(bookname,3, no);//根据书名模糊查询出数据 System.out.println(books.size()); request.setAttribute(totalPage, (books.size()/3 1));//将总页面数存入request } request.setAttribute(books, books);//将查询出的数据存入request request.setAttribute(current, no);//将当前页存入request request.getRequestDispatcher(main.jsp).forward(request, response);//页面转发 }关键字匹配查询输入“J”关键字展示搜索结果购物车模块增注意当库存不足时防止库存数被减到负值。if(oneStock 0) {//如果库存大于0 //查看当前图书是否已经存在于购物车中 //查看购物车列表是否已经存在该图书对比两个图书id for (int j 0; j bookcart.size(); j) { Book existBook (Book) bookcart.get(j); if(existBook.getBid() bid) {//如果购物车中的id被选中的图书id则购物车中的数量1 bookcart.remove(j); existBook.setCount(existBook.getCount()1);//购物车中商品数量1 double totalPrice existBook.getPrice(); bookcart.add(existBook);//商品总价 System.out.println(总价totalPrice); isNotExists false; //修改库存 isOrNotChangeStock bookbiz.changeStock(bid, -1); break; } } if(!isNotExists) { continue; } book.setBid(bid); //判断当前获取的图书信息是否为指定bid下的信息 for (int j 0; j title.length; j) { // request.setCharacterEncoding(utf-8); //解决页面图书标题中文显示乱码 String title_temp new String(title[j].getBytes(ISO-8859-1),utf-8);//取标题 if(title_temp.indexOf(bids[i]:)0) {//indexOf匹配bids是否包含在title_temp中如果没有返回-1 continue; } if(\image[j].indexOf(bids[i]:)0) { continue; } if(price[j].indexOf(bids[i]:)0) { continue; } if(stock[j].indexOf(bids[i]:)0) { continue; } //添加指定bid下的图书信息 book.setBookname(filter(title_temp, bids[i])); book.set\image(filter(\image[j], bids[i])); book.setPrice(Double.parseDouble(filter(price[j], bids[i]))); // book.setPrice(Double.valueOf(filter(price[j], bids[i]))); book.setStock(filter(stock[j], bids[i])); book.setCount(1); //修改库存 bookbiz.changeStock(bid, -1); bookcart.add(book); } }删移除操作protected void remove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取图书id String bid request.getParameter(bid); //2.获取购物车 ListBook bookcart (ListBook) request.getSession().getAttribute(bookcart); //3.循环查找购物车中相同的图书id for(int i 0; i bookcart.size(); i) { Book book bookcart.get(i); if(Integer.valueOf(bid) book.getBid()) { //4.移除图书 bookcart.remove(i); //5.修改库存 bookbiz.changeStock(Integer.parseInt(bid), book.getCount()); break; } } //6.将购物车保存到session中 // request.getSession().setAttribute(bookcart, bookcart); request.getSession().setAttribute(bookcart_count, bookcart.size()); System.out.println(request.getSession().getAttribute(bookcart_count)); }改前端 shopping.jsp 页面添加 onblur 失去焦点事件当鼠标离开输入框时执行 JavaScript 代码调用 update 方法。c:set value1 varcount/c:set c:forEach varbook items${bookcart } tr input typehidden idhidden_bid_${count } namehidden_bid_${count } value${book.bid }/ td classthumbimg src${book.\image } //td td classtitle${book.bookname }/td tdinput classinput-text typetext idnums_${count } namenums_${count } value${book.count } onblurupdate(${bookcart_count}, ${count }, ${book.bid })//td !-- onblur事件 -- input typehidden idhidden_${count } namehidden_${count } value${book.price }/ tdspan idprice_${count }/span/td input typehidden idhidden_book_total_price_${count } namehidden_book_total_price_${count } / tdspan idremove_${count }a href# onclickdel(${book.bid})移除/a/span/td !-- href链接 -- /tr c:set value${count1 } varcount/c:set /c:forEach异步更新图书购买量数据并向控制层 Servlet 中返回一个“update”/** * Ajax修改购物车中的数量 */ function update(size_str, i, bid_str) { //初始化XMLHttpRequest对象 var xmlHttp; try { xmlHttp new ActiveXObject(Msxml2.XMLHTTP); } catch (e) { try { xmlHttp new XMLHttpRequest(); } catch (e) { try { xmlHttp new ActiveXObject(Microsoft.XMLHTTP); } catch (e) { e.message(); alert(你的浏览器不支持Ajax); } } } //2.获取修改后的数量 var num_str document.getElementById(nums_i); //3.打开服务器链接 xmlHttp.open(POST, ModifyCartServlet?actionupdatebidbid_strcountnum_str.value, true); //4.传值 无参传null值 xmlHttp.send(null); //5.设置回调函数 xmlHttp.onreadystatechange function() { if(xmlHttp.readyState 4 xmlHttp.status 200) { count(size_str);//调用Servlet中的方法 } } }servlet 中通过前端返回的请求调用相应的方法。String action request.getParameter(action); if(action.equals(update)) { updateCart(request, response); } else if(action.equals(remove)) { remove(request, response); }控制层 Servlet 更新购物车数据并修改库存。protected void updateCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取图书id和修改后的数量 String bid request.getParameter(bid); String count request.getParameter(count); //2.获取购物车 ListBook bookcart (ListBook) request.getSession().getAttribute(bookcart); //3.查找购物车中修改过的图书并修改相应的信息 for (Book book : bookcart) { if(Integer.valueOf(bid) book.getBid()) { //4.获取修改前的图书数量 int old_count book.getCount(); //5.设置当前图书的新数量 book.setCount(Integer.valueOf(count)); System.out.println(当前图书新数量count); int nowStock 0; try { nowStock basedao.queryStock(Integer.parseInt(bid)); } catch (Exception e) { e.printStackTrace(); } //6.修改库存 bookbiz.changeStock(Integer.parseInt(bid), (old_count-Integer.parseInt(count))); break; } } }查与搜索图书模块类似我的订单模块获取订单信息存入 List 中% List orders (List) request.getAttribute(orders); %订单展示c:forEach varorder items${orders } tr td idid_${td_id}${order.oid }/td td iduser_${td_id}${order.username }/td td idcrdt_${td_id}${order.createdate }/td td idtotal_${td_id}${order.total_price }/td td classthumbimg src${order.\image } //td td${order.bookname }/td td${order.b_price }/td td${order.total_price/order.b_price }/td /tr /c:forEach用户退出当用户退出登录清空 session。%--用户退出登录 --% % request.getSession().removeAttribute(loginuser); request.getSession().removeAttribute(bookcart); request.getSession().removeAttribute(bookcart_count); response.sendRedirect(login.jsp); %一些注意细节为防止游客非法访问页面在每一个前端页面 body 之后加上登录检测代码。% String username (String)session.getAttribute(loginuser); if(username null) { response.sendRedirect(login.jsp); } %当库存不足时防止库存数被减到负值。if(oneStock 0) {//如果库存大于0 //... }href 中加上空链接否则该页面中的 session 不会刷新必须手动刷新。span idremove_${count }a href# onclickdel(${book.bid})移除/a/span致谢感谢老师、Java Web 课程老师的指导并感谢同学们的相互帮助♻️ 资源大小6.52MB➡️资源下载https://download.csdn.net/download/s1t16/87404240注更多内容可关注微信公众号【神仙别闹】如当前文章或代码侵犯了您的权益请私信作者删除