项目名称:易买网
指导老师:原玉明
负责功能点:登录,前台商品信息展示带分页,新闻动态,最近浏览,购物车,后台订单管理。
说实话刚开始拿到这个项目我不知如何下手,只感觉到这个项目真的很庞大,有很多的知识没有学习过,这次做这个易买网项目涉及到团队合作,应该也是学习过程中做的
最大的一次项目。所有下定决心好好完成这次的项目。这不仅代表了个人的能力,还代表着团队的合作能力。
登录模块:
登录模块:用户名,登录名,验证码的校验,如果用户名,密码,验证码输入的不合法,会给出相应的提示。
有人会觉得登录模块验证码是一个难点,下面看一下关键代码,其实这个东西不难,百度上一搜一堆,主要是你搜到的东西如何能正确的运用到你的项目上是关键。
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表达是来遍历集合,在界面上显示新闻标题和内容。
后续内容.....正在更新,请读者耐心等待,不会太常时间