##  控制器层

需求分析:

访问路径:`/user/reg.do`
请求参数:`username=xx&password=xx&&phone=xx&email=xx`
请求类型:`POST`
响应内容:`JSON`

 在`pom.xml`中添加对`Jackson`的依赖:

     <!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>

对于JSON的解释

创建专门用于响应给客户端的JSON数据的类`com.demo.pojo.ResponseResult`

 package com.demo.pojo;

 import java.io.Serializable;

 public class ResponseResult<T> implements Serializable {

     /**
*
*/
private static final long serialVersionUID = -8070114279101787255L; private static final int STATE_SUCCESS = 1;
private static final int STATE_ERROR = 0; private Integer state;// 成功(1)或失败(0)
private String message;// 当失败时封装错误信息
private T data;// 数据 public ResponseResult() {
super();
// TODO Auto-generated constructor stub
} public ResponseResult(Integer state) {
super();
this.state = state;
} public ResponseResult(Integer state, String message) {
super();
this.state = state;
this.message = message;
} /**
* 状态成功
*
* @param state 1
* @param data 数据
*/
public ResponseResult(Integer state, T data) {
super();
this.state = STATE_SUCCESS;
this.data = data;
} /**
* 状态失败
*
* @param throwable 返回异常
*/
public ResponseResult(Throwable throwable) {
super();
this.state = STATE_ERROR;
this.message = throwable.getMessage();
} public Integer getState() {
return state;
} public void setState(Integer state) {
this.state = state;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public T getData() {
return data;
} public void setData(T data) {
this.data = data;
} public static long getSerialversionuid() {
return serialVersionUID;
} public static int getStateSuccess() {
return STATE_SUCCESS;
} public static int getStateError() {
return STATE_ERROR;
} @Override
public String toString() {
return "ResponseResult [state=" + state + ", message=" + message + ", data=" + data + "]";
} }

##  在IUserService业务层添加登陆接口

 /**
* 用户登录
* @param username 用户名
* @param password 密码
* @return 成功登录的用户名
* @throws UsernameNotExistsException
* @throws PasswordNotMatchException
*/
User login(String username,String password);

在UserServiceImpl类实现

 public User login(String username, String password) {
// 根据用户名查询用户信息
User user = findUserByUsername(username);
// 判断是否查询到匹配的用户信息
if (user == null) {
// 没有则抛出异常,用户名不存在UsernameNotExistsException
throw new UsernameNotExistsException("尝试登陆的用户名" + username + "不存在!");
} else {
// 获取该用户的盐(UUID)
String salt = user.getUuid();
// 基于盐,对用于输入的密码(方法的参数)进行加密
String md5Password = getEncrpytedPassword(password, salt);
// 判断加密后的密码,与获取的用户信息中的密码是否匹配
if (user.getPassword().equals(md5Password)) {
// 返回查询到的User对象
return user;
} else {
// 不匹配则抛出异常,密码错误PasswordNotMatchException
throw new PasswordNotMatchException("您输入的用户名或密码不正确");
}
}
}

创建控制器类`com.demo.controller.UserController`,使用`@Controller`注解,并添加`@RequestMapping("/user")`注解。

在这个类中添加`public ResponseResult<Void> handleReg()`方法以处理请求,该方法使用`@RequestMapping(value="/reg.do",method=RequestMethod.POST)`注解,并添加`@ResponseBody`注解。

 package com.demo.controller;

 import javax.servlet.http.HttpSession;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import com.demo.pojo.ResponseResult;
import com.demo.pojo.User;
import com.demo.service.IUserService;
import com.demo.service.ex.ServiceException;
import com.demo.service.ex.UsernameNotExistsException; @Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService; // 访问注册页面
@RequestMapping("/reg.do")
public String showReg() {
return "reg";
} // 访问登录页面
@RequestMapping("login.do")
public String showLogin() {
return "login";
} /**
* 将java数据转换为JSON串类型
*
* @param username
* @param password
* @param phone
* @param email
* @param session
* @return 执行的数据
*/
//处理注册信息
@RequestMapping(value = "/handle_reg.do", method = RequestMethod.POST)
@ResponseBody
public ResponseResult<Void> handleReg(String username, String password, String phone, String email,
HttpSession session) {
ResponseResult<Void> rr; User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setPhone(phone);
user.setEmail(email); try {
User u = userService.reg(user);
//绑定信息
session.setAttribute("uid", u.getUsername());
rr = new ResponseResult<Void>(ResponseResult.STATE_ERROR);
} catch (UsernameNotExistsException e) {
rr = new ResponseResult<Void>(e);
}
return rr;
}
/**
*
* @param username
* @param password
* @param session
* @return
*/
//处理登录信息
@RequestMapping(value = "/handle_login.do", method = RequestMethod.POST)
@ResponseBody
public ResponseResult<Void> handlerLogin(String username, String password, HttpSession session) {
ResponseResult<Void> rr;
try {
User user = userService.login(username, password);
//绑定信息
session.setAttribute("uid", user.getId());
session.setAttribute("username", user.getUsername());
rr = new ResponseResult<Void>(ResponseResult.STATE_SUCCESS);
} catch (ServiceException e) {
rr = new ResponseResult<Void>(e);
}
return rr;
}
}

编辑`/web/register.jsp`,测试完毕

demo_3的更多相关文章

  1. Java 零基础之作业小练习

    [练习1] 需求:输入学员的名称及总科目数并显示每项科目成绩的分数,算出总成绩. package demo2; import java.util.Scanner; //先import Scanner语 ...

  2. 类Collections的静态方法的使用(代码)

    package cn.itcast.p2.toolclass.collections.demo; import java.util.ArrayList; import java.util.Collec ...

  3. Mysql存储过程语法

    一口气弄完了! 一.条件语句if-then-else: create procedure demo_1(in param int) begin declare var int; ; then inse ...

  4. Java多线程技术学习笔记(一)

    目录: 概述 多线程的好处与弊端 JVM中的多线程解析 多线程的创建方式之一:继承Thread类 线程的状态 多线程创建的方式之二:实现Runnable接口 使用方式二创建多线程的好处 多线程示例 线 ...

  5. Java实现HTML代码生成PDF文档

    1.IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源. 2.Flying Sauser实现html2pdf,纠错能力差,支 ...

  6. 黑马程序员——String类

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  7. shell中的cat和文件分界符(<<EOF)

    在shell中,文件分界符(通常写成EOF,你也可以写成FOE或者其他任何字符串)紧跟在<<符号后,意思是分界符后的内容将被当做标准输入传给<<前面的命令,直到再次在独立的一行 ...

  8. 类似智能购票的demo--进入页面后默认焦点在第一个输入框,输入内容、回车、right时焦点自动跳到下一个,当跳到select时,下拉选项自动弹出,并且可以按上下键选择,选择完成后再跳到下一个。

    要实现的效果:进入页面后默认焦点在第一个输入框,输入内容.回车.right时焦点自动跳到下一个,当跳到select时,下拉选项自动弹出,并且可以按上下键选择,选择完成后再跳到下一个. PS:自己模拟的 ...

  9. Java集合框架体系详细梳理,含面试知识点。

    一.集合类 集合的由来: 面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式. 集合特点: 1,用于存储对象的容器.(容器本身就 ...

随机推荐

  1. 用Group by分组后,取每组的前3条记录,怎么取?

    使用子查询进行查询 SELECT * FROM home_content a WHERE ( SELECT count(id) FROM home_content WHERE class_link = ...

  2. cadence布线完成后的补充操作

    完成布线之后,需要生成光绘文件和钻孔文件,在生成钻孔文件之前,还有几点补充!

  3. java数组和集合的相互转换

    由于在学习过程中经常碰到这么一个问题,就是java中几种装数据的容器之间的转换,所以写了这篇随笔专门来总结这些转换方法. 数组转集合: 1.遍历,最常用的方法,但是过程会繁琐一点 int arrs[] ...

  4. 几个比较常用的jar包

    implementation 'com.android.support:recyclerview-v7:26+'implementation 'org.greenrobot:eventbus:3.1. ...

  5. 香港,将军澳,TKO,服务器,运维,机房,云清洗

    目前香港到大陆速度最快.最稳定线路之一. 线路也是唯一华南华北一样快速的线路,是100%的“双线”,不存在其他香港线路网通访问比电信慢的问题. (香港)将军澳TKO机房网络速度快捷,机房内部环境配有意 ...

  6. libguestfs手册(2):guestfish command

    添加一个drive:guestfs_add_drive_opts add-drive filename [readonly:true|false] [format:..] [iface:..] [na ...

  7. RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ

    摘要 本篇经验将和大家介绍Windows下安装和部署RabbitMQ消息队列服务器,希望对大家的工作和学习有所帮助! 目录 一.Erlang语言环境的搭建 二.RabbitMQ服务环境的搭建 三.Ra ...

  8. 实战深度学习OpenCV(一):canny边缘检测

    利用canny边缘检测,我们可以很好地得到哦一个图像的轮廓,下面是基于C++的,这是我们通过这段代码得到的结果: #include "pch.h" #include <ios ...

  9. [Swift]LeetCode474. 一和零 | Ones and Zeroes

    In the computer world, use restricted resource you have to generate maximum benefit is what we alway ...

  10. [Swift]LeetCode655. 输出二叉树 | Print Binary Tree

    Print a binary tree in an m*n 2D string array following these rules: The row number m should be equa ...