项目的搭建与使用测试驱动开发登录注册的具体实现(一),带验证码的登录

项目的搭建基本步骤

用户的一个功能,通常对应我们的一个业务方法

1.熟悉静态页面

2.使用Maven来创建工作,创建模块

根据三层架构来创建文件夹(再加上工具类,以及用户类)
在这里插入图片描述

3.准备工作 技术选型
(1)Web层
a)Servlet:前端控制器
b)html:视图
c)Filter:过滤器
d)BeanUtils:数据封装
e)Jackson:json序列化工具
(2)Service层
f)Javamail:java发送邮件工具
g)Redis:nosql内存数据库
h)Jedis:java的redis客户端
(3)Dao层
i)Mysql:数据库
j)Mybatis:对jdbc进行封装
4.配置依赖(通过Maven来导入相应的jar包)
pom.xml依赖

<dependencies>
        <!-- junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <!--servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- MySql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--日志包-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!--beanUtils-->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.2</version>
            <scope>compile</scope>
        </dependency>
        <!--jackson-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.3.3</version>
        </dependency>


        <!--javaMail-->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>javax.mail-api</artifactId>
            <version>1.5.6</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.3</version>
        </dependency>
        <!--jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.0</version>
        </dependency>

    </dependencies>

5.创建数据库,找到表与表之间的联系
6.搭建Mybatis

    核心配置文件   SqlMapConfig.xml   (核心 四大信息 )
    映射文件   UserDao.xml  (写sql语句的地方)
    日志文件    log4j.properties
    工具类      MySessionUtil
    (在工具类中记得有ThreadLocal来减低耦合)

7.使用git来备份数据,init
git init 创建一个git
git config --global user.name 用户名( 输入你的账户)
git config --global user.Email 邮箱( 输入你的邮箱)
git status (要保存的已经更改的文件)
git add . (添加)
git commit -m " "( 提交,命名)

8.从登录开始分析(使用测试驱动开发)
在这里插入图片描述

9.根据三层架构,先从service层开始编写代码,然后是Dao层最后才是web层
web层是从浏览器拿到用户提交的数据
dao层是从数据库中拿出已经存在的用户数据
service层则是对web层还有dao层中拿到的数据进行处理,对编写其功能
所以先写service层,从service的测试开始开发

  
  1.生成UserService与测试逻辑   com\zx\service\TestUserService.java
  2.编写User对象类
  com\zx\domain\User.java
  3.编写UserDao方法与测试
  com\wzx\dao\UserDaoTest.java
  4.创建UserDao接口
  src\main\java\com\wzx\dao\UserDao.java
public interface UserDao {
   //select * from tab_user where username = 'jackhello'
   User findByName(String name);
}
 5.在UserDao.xml映射文件和SqlMapConfig.xml核心映射文件中加入相应代码,实现Mybits的配置,好对MySQL进行操作
 6.Junit的注解(在对UserDao的测试中使用)
@Before:用来初始化@Test方法要使用到的资源
@After:用来释放资源
@Before ->@Test -> @After

10.编写UserService的login方法,并进行测试(模拟登录进行输入)
login方法是对来自浏览器的数据与从数据库查找的数据进行比较,从而到得一个code状态(用1,-1,-2,-3来表示不同的状态,1表示登录成功,-1表示未注册等等)

 public int login(User user) {
        UserDao userDao =MySessionUtils2.getSession().getMapper(UserDao.class);//内部就使用你编写接口来生成代理对象
        User user1=userDao.findByName(user.getUsername());
        if(user1==null){
            return -1;     //未注册
        }
         else {
             if('Y'==user1.getStatus()){
                 if(user1.getUsername().equals(user.getUsername())&&user1.getPassword().equals(user.getPassword())){
                     return  1;   //登录成功
                 }else{
                     return  -2;  //密码或者用户名错误
                 }
             }else {
                 return  -3;   //没有激活
             }
        }

    }

11.在web的开发
用浏览器来减少服务器的负担(在浏览器端进行格式判断),提升用户体验
(1).jQuery在登录页面判断数据的格式 ,使用正则表达式的test方法来判断格式
(2)在登录页面,jQuery发送ajax给serlvet,ajax 提交先给表单做拦截,如果是submit() 提交函数(使用条件 页面是带有submit按钮的form表单) return false来拦截
不是的话则用点击事件$().click(function(){},然后在用ajax提交
(3)编写LoginServlet
三个步骤 1.接受请求,获取参数 2.处理参数 3.把处理后的结果返回给浏览器

扫描二维码关注公众号,回复: 11924864 查看本文章
 //接受请求获取参数
        Map<String,String[]> map=request.getParameterMap();
        User user=new User();
        System.out.println(map);
        try {
            //参数一JavaBean  参数二map
            BeanUtils.populate(user,map);    //将map中的所有的参数赋值给JavaBean
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //处理参数
        UserService userService=new UserService();
        int code=userService.login(user);
        //响应给浏览器   因为是ajax提交 所以响应json给浏览器
        ResponseInfo responseInfo=new ResponseInfo();
        responseInfo.setCode(code);
        if(code==-1){
            responseInfo.setData("用户不存在");
        }else if (code==1){
            responseInfo.setData("登录成功");
         //查出用户数据
         User user1=userService.findUserByName(user.getUsername());
         //保存在session中
            request.getSession().setAttribute("user",user1);
        }
        else if (code==-2){
            responseInfo.setData("密码或者用户名错误");
        }
        else if (code==-3){
            responseInfo.setData("没有激活");
        }
        //转化为json
        String json=new ObjectMapper().writeValueAsString(responseInfo);
        response.getWriter().println(json);
    }

12.对代码进行测试,然后进行验证码部分

验证码(防止有人用程序进行暴力登录,判断是人还是程序)

在后台中生成check01 ,图片验证码,然后在从浏览器拿到输入的验证码 check02

用ajax提交,在登录的servlet中对两个进行处理

先从请求中获得check01,再从session(后台生成的)中获取check02,再把check02删除,最后进行比较判断

public class CheckCodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		
		//服务器通知浏览器不要缓存
		response.setHeader("pragma","no-cache");
		response.setHeader("cache-control","no-cache");
		response.setHeader("expires","0");
		
		//在内存中创建一个长80,宽30的图片,默认黑色背景
		//参数一:长
		//参数二:宽
		//参数三:颜色
		int width = 80;
		int height = 30;
		BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		
		//获取画笔
		Graphics g = image.getGraphics();
		//设置画笔颜色为灰色
		g.setColor(Color.GRAY);
		//填充图片
		g.fillRect(0,0, width,height);
		
		//产生4个随机验证码,12Ey
		String checkCode = getCheckCode();
		//将验证码放入HttpSession中
		request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
		
		//设置画笔颜色为黄色
		g.setColor(Color.YELLOW);
		//设置字体的小大
		g.setFont(new Font("黑体",Font.BOLD,24));
		//向图片上写入验证码
		g.drawString(checkCode,15,25);
		
		//将内存中的图片输出到浏览器
		//参数一:图片对象
		//参数二:图片的格式,如PNG,JPG,GIF
		//参数三:图片输出到哪里去
		ImageIO.write(image,"PNG",response.getOutputStream());
	}
	/**
	 * 产生4位随机字符串 
	 */
	private String getCheckCode() {
		String base = "0123456789ABCDEFGabcdefg";
		int size = base.length();
		Random r = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i=1;i<=4;i++){
			//产生0到size-1的随机值
			int index = r.nextInt(size);
			//在base字符串中获取下标为index的字符
			char c = base.charAt(index);
			//将c放入到StringBuffer中去
			sb.append(c);
		}
		return sb.toString();
	}

13.对前端代码的进行完善

登录到这里就差不多了,根据三层架构来写,思路会清晰许多,但是还是会有许多的小bug,有时一个小小的bug就会要一个上午,头秃

猜你喜欢

转载自blog.csdn.net/mighty_Jon/article/details/108874856