网上商城项目SSM(四)——系统组件实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40788630/article/details/85469758

本系统的组件一共包括: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();
	}
}

到这一步,电子商务网站基本的组件全部建立了

猜你喜欢

转载自blog.csdn.net/qq_40788630/article/details/85469758