项目名称:易买网
指导老师:原玉明
负责功能点:登录,前台商品信息展示带分页,新闻动态,最近浏览,购物车,后台订单管理。
说实话刚开始拿到这个项目我不知如何下手,只感觉到这个项目真的很庞大,有很多的知识没有学习过,这次做这个易买网项目涉及到团队合作,应该也是学习过程中做的
最大的一次项目。所有下定决心好好完成这次的项目。这不仅代表了个人的能力,还代表着团队的合作能力。
登录模块:
登录模块:用户名,登录名,验证码的校验,如果用户名,密码,验证码输入的不合法,会给出相应的提示。
有人会觉得登录模块验证码是一个难点,下面看一下关键代码,其实这个东西不难,百度上一搜一堆,主要是你搜到的东西如何能正确的运用到你的项目上是关键。
01.首先是一个script标签的内容在login.jsp页面,其实前面一部分这是判断ajax的兼容性,不必太过关注,主要的是checkcode()这个方法。
<script type="text/javascript"> //取得XMLHttpRequest对象是AJAX的要点 //此getXMLRequest()方法是根据不同浏览器来取得XMLHttpRequest对象 function getXMLRequest(){ var request; try{ //for火狐等浏览器 request = new XMLHttpRequest(); }catch(e){ try{ //for IE request = new ActiveXObject("Microsoft.XMLHttp"); }catch(e){ alert("您的浏览器不支持AJAX!!!"); return null; } } return request; } //此checkcode()方法是更换验证码图片的要点 function checkcode(){ var request = getXMLRequest();//得到XMLHttpRequest对象 request.onreadystatechange = function(){ if(request.readyState == 4){ document.getElementById("safeCode").src = "servlet/LoginServlet_hyj?opr=Login";//改变验证码图片 }; }; //将请求发送出去 request.open("GET","servlet/LoginServlet_hyj?opr=Login",true); request.send(null); } </script>
02.然后那个验证码事实上是一个图片路径,默认这个图片路径去访问一个servlet获取这个路径,当用户点击看不清换一张的时候,会调用checkcode方法,checkcode方法发送一个ajax请求,去访问servlet,然后通过js的手段动态改变img的图片路径。
<td class="field">验证码:</td> <td> <img src="<%=path %>/servlet/LoginServlet_hyj?opr=Login" id="safeCode"/> <a id="changeCode" onclick="checkcode()">看不清,换一张</a><br> <input type="text" name="code"><div class="mess">${message}</div> <span></span> </td>
03.上面一直说访问servlet获取验证,下面来揭秘一下这个servlet
package servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.List; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.impl.ProoductCategoryDaoImpl_hyj; import dao.impl.UserDaoimpl; import entity.Cart; import entity.ProductCategory; import entity.User; public class LoginServlet_hyj extends HttpServlet { ProoductCategoryDaoImpl_hyj pcd=new ProoductCategoryDaoImpl_hyj(); /** HYJ Success */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void LoadData(HttpServletRequest request,HttpServletResponse response){ try { // 1获取一级菜单的集合放到作用域中 List<ProductCategory> listOne = pcd.getAllOneLeveInfo(0); // 2.获取二级菜单的集合放到作用域中 List<ProductCategory> listTwo = pcd.getAllTowLeveInfo(0); request.setAttribute("listOne", listOne); request.setAttribute("listTwoType", listTwo); } catch (Exception e) { // TODO: handle exception e.getMessage(); } } /** HYJ Success */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { LoadData(request, response); String opr=request.getParameter("opr");//获取opr的值 if(opr!=null){ if(opr.equals("Login")){//证明执行登录操作返回验证码 getCheckNum(request, response); }else if(opr.equals("doLogin")){//登录验证 String message="";//定义变量保存错误信息 //获取用户信息 String userId=request.getParameter("userId"); String passworkd=request.getParameter("password"); request.setAttribute("userId", userId); request.setAttribute("passworkd", passworkd); //获取用户输入的验证码 String checkNum=request.getParameter("code"); if(checkNum==null||checkNum.equals("")){//证明用户没有输入验证码,提示用户输入验证码 message="验证码不能为空"; request.setAttribute("message",message); //跳转到登录页面 request.getRequestDispatcher("/login.jsp").forward(request,response); }else{ //获取每一次生成在session中的验证码 String sessionCheckNum=(String)request.getSession().getAttribute("numrand"); if(checkNum.equals(sessionCheckNum)){//验证相同 //实例化User对象 User user=new User(); user.setUserId(userId); user.setPassword(passworkd); //实例化用户接口实现类 UserDaoimpl ud=new UserDaoimpl(); try { if(ud.selectUserInfo(user)){//证明登录成功 //用户信息id保存到session中 request.getSession().setAttribute("userId",userId); response.sendRedirect("IndexServlet"); //request.getRequestDispatcher("IndexServlet").forward(request, response); }else{ message="用户名或密码错误"; request.setAttribute("message",message); //登录失败 //跳转到登录页面 request.getRequestDispatcher("/login.jsp").forward(request,response); } } catch (Exception e) { e.getMessage(); } }else{//证明验证码不同,没有必要再判断用户名和密码 message="验证码输入错误"; request.setAttribute("message",message); //跳转到登录页面 request.getRequestDispatcher("/login.jsp").forward(request,response); } } }else if(opr.equals("Out")){//证明是注销 //清除session request.getSession().removeAttribute("userId"); //获取session中的数据Cart Cart cart= (Cart)request.getSession().getAttribute("cart"); if(cart!=null){ request.getSession().removeAttribute("cart"); } //重定向到首页 String path=request.getContextPath(); response.sendRedirect(path+"/servlet/IndexServlet"); } }else{ request.getRequestDispatcher("/login.jsp").forward(request, response); } } /** * 获取的的登录时的验证码 * @param request * @param response */ public void getCheckNum(HttpServletRequest request,HttpServletResponse response){ //设置页面不缓存 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 在内存中创建图象 int width = 60, height = 20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); //生成随机类 Random random = new Random(); // 设定背景色 g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); //设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); //画边框 //g.setColor(new Color()); //g.drawRect(0,0,width-1,height-1); g.setColor(getRandColor(160, 200)); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 for (int i = 0; i < 155; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x, y, x + xl, y + yl); } // 取随机产生的认证码(4位数字) String sRand = ""; for (int i = 0; i < 4; i++) { String rand = String.valueOf(random.nextInt(10)); sRand += rand; // 将认证码显示到图象中 g.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.drawString(rand, 13 * i + 6, 16); } // 将认证码存入SESSION request.getSession().setAttribute("numrand", sRand); // 图象生效 g.dispose(); // 输出图象到页面 try { ImageIO.write(image, "JPEG", response.getOutputStream()); } catch (Exception e) { e.getMessage(); } } public Color getRandColor(int fc, int bc) {//给定范围获得随机颜色 Random random = new Random(); if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } }
2.前台商品信息展示带分页功能。这个功能就不做详细介绍(主要就是访问servlet,获取一个list集合,放到request作用域中,首页通过jstl表达是进行遍历)
3.新闻动态
01访问servlet获取集合,通过jstl表达是遍历出来数据。
02.如果用户点击的是哪个新闻就获取该新闻的编号,让后访问servlet,在servlet中获取新闻编号,然后调用dao查询出该编号对应的信息详情,然后封装到集合中放到request作用域中,然后转发到新闻详情页,最后也是通过jstl表达是来遍历集合,在界面上显示新闻标题和内容。
后续内容.....正在更新,请读者耐心等待,不会太常时间