本系统的组件一共包括:1.管理员登录控制器,2.用户登录控制器,3.验证码控制器,4.统一异常处理,5.工具类下面挨个进行实现
一、管理员登录控制器
管理员只有成功登录了才可以管理商品、商品类型、用户、订单等等网站信息,因此需要建立一个管理员登录控制器,不然对于系统安全来说是十分危险的
在src目录下创建一个com.controller.admin包,并在包中创建BaseController控制器类,代码如下:
package com.controller.admin;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import com.exception.AdminLoginNoException;
@Controller
public class BaseController {
//在每次一处理方法前执行该方法
@ModelAttribute
public void idLogin(HttpSession session,HttpServletRequest request)
throws AdminLoginNoException{
if(session.getAttribute("auser")==null) {
throw new AdminLoginNoException("没有登录");
}
}
}
方法执行中,如果在session中没有找到auser的相关信息,在通过AdminLoginNoException类进行提示没有登录,使用@modelAttribute的方法首先被控制器执行
在src目录下创建com.exception包,并在包中创建AdminLoginNoException类,其代码如下:
package com.exception;
public class AdminLoginNoException extends Exception{
private static final long serialVersionUID = 1L;
public AdminLoginNoException(String message) {
super(message);
}
}
二、创建前端用户登录控制器
用户登录成功后才可以进行选购商品,提交订单等活动
在src目录下,创建com.controller.before包,并在包中创建BaseController控制器类,其代码如下所示:
package com.controller.before;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import com.exception.UserLoginNoException;
@Controller
public class BaseController {
//前台执行任何方法之前都先执行此方法
@ModelAttribute
public void isLogin(HttpSession session,HttpServletRequest request)
throws UserLoginNoException{
if(session.getAttribute("bruser")==null) {
throw new UserLoginNoException("您还没有登录");
}
}
}
若session中没有bruser的信息,则通过UserLoginNoException进行处理,
在com.exception包中创建UserLoginNoException,其代码如下:
package com.exception;
public class UserLoginNoException extends Exception{
private static final long serialVersionUID = 1L;
public UserLoginNoException(String message){
super(message);
}
}
三、创建验证码类
在com.controller.before包中创建产生验证码的控制器类ValidateCodeController,具体代码如下:
package com.controller.before;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 验证码
*/
@Controller
public class ValidateCodeController {
private char code[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2',
'3', '4', '5', '6', '7', '8', '9' };
private static final int WIDTH = 50;
private static final int HEIGHT = 20;
private static final int LENGTH = 4;
@RequestMapping("/validateCode")
public void validateCode(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 设置响应报头信息
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 设置响应的MIME类型
response.setContentType("image/jpeg");
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Font mFont = new Font("Arial", Font.TRUETYPE_FONT, 18);
Graphics g = image.getGraphics();
Random rd = new Random();
// 设置背景颜色
g.setColor(new Color(rd.nextInt(55) + 200, rd.nextInt(55) + 200, rd
.nextInt(55) + 200));
g.fillRect(0, 0, WIDTH, HEIGHT);
// 设置字体
g.setFont(mFont);
// 画边框
g.setColor(Color.black);
g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);
// 随机产生的验证码
String result = "";
for (int i = 0; i < LENGTH; ++i) {
result += code[rd.nextInt(code.length)];
}
HttpSession se = request.getSession();
se.setAttribute("code", result);
// 画验证码
for (int i = 0; i < result.length(); i++) {
g.setColor(new Color(rd.nextInt(200), rd.nextInt(200), rd
.nextInt(200)));
g.drawString(result.charAt(i) + "", 12 * i + 1, 16);
}
// 随机产生2个干扰线
for (int i = 0; i < 2; i++) {
g.setColor(new Color(rd.nextInt(200), rd.nextInt(200), rd
.nextInt(200)));
int x1 = rd.nextInt(WIDTH);
int x2 = rd.nextInt(WIDTH);
int y1 = rd.nextInt(HEIGHT);
int y2 = rd.nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
// 释放图形资源
g.dispose();
try {
OutputStream os = response.getOutputStream();
// 输出图像到页面
ImageIO.write(image, "JPEG", os);
} catch (IOException e) {
e.printStackTrace();
}
}
}
若使用验证码,则在相关jsp页面的合适位置添加如下代码:
<tr>
<td>验证码:</td>
<td><input type="text" name="code" class="textSize"/></td>
</tr>
<tr>
<td>
<img id="code" src="validateCode"/>
</td>
<td class="ared">
<a href="javascript:refreshCode();"><font color="blue">看不清,换一个!</font></a>
</td>
</tr>
四、统一异常处理
系统对于前台未登录异常,以及后台未登录异常,以及未知异常进行统一异常处理。刚刚已经创建了前台未登录处理类UserLoginNoException和后台未登录处理类AdminLoginNoException,现在需要创建统一异常处理类MyException类,此类继承于HandlerExceptionResolver,具体代码如下:
package com.exception;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import com.po.Auser;
import com.po.Buser;
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
Exception arg3) {
Map<String, Object> model = new HashMap<String,Object>();
model.put("ex", arg3);
//根据不同错误转向不同页面
if(arg3 instanceof AdminLoginNoException) {
//登录页面需要auser对象
arg0.setAttribute("auser", new Auser());
arg0.setAttribute("msg", "没有登录,请登录!");
return new ModelAndView("/admin/login",model);
}else if(arg3 instanceof UserLoginNoException){
arg0.setAttribute("buser", new Buser());
arg0.setAttribute("msg", "没有登录,请登录!");
return new ModelAndView("/before/login", model);
}else {
return new ModelAndView("/error/error",model);
}
}
}
完成之后记得在springmvc-servlet.xml中使用bean元素进行托管
<!-- 托管MyExceptionHandler -->
<bean class="com.exception.MyExceptionHandler"/>
五、创建工具类
本系统使用的工具类是MyUtil,具体代码如下:
package com.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpSession;
import com.po.Buser;
public class MyUtil {
//获得时间字符串
public static String getStringID() {
String id=null;
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
id=simpleDateFormat.format(date);
return id;
}
//获得用户id
public static Integer getUserId(HttpSession session) {
Buser buser = (Buser) session.getAttribute("bruser");
return buser.getId();
}
}
到这一步,电子商务网站基本的组件全部建立了