##  控制器层

需求分析:

访问路径:`/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. Web开发者の实用代码账簿

    介里就都是恶魔菌整理的我平时会用的代码啦-现在在这里总结规划一下,希望能对你以及其他阅读这篇文章的小可耐们有帮助喵!欢迎订阅我的博客来get恶魔菌记事簿的新动态鸭! ↓ ↓ ↓ 以下就是内容啦~记得看 ...

  2. Java_重载与重写

    在java中,重载与重写都是多态的体现.重载(Overload)体现的是编译时多态,而重写(Override)体现了运行时多态. 重载(Overload): 定义:在一个类中,同名的方法如果有不同的参 ...

  3. python获取多线程的返回值

    import threading class MyThread(threading.Thread): def __init__(self,func,args=()): super(MyThread,s ...

  4. vue项目中引入mint-ui的方式(全部引入与按需引入)

    参考哦 https://blog.csdn.net/qq_36742720/article/details/83620584 https://jingyan.baidu.com/article/c1a ...

  5. this全解js

    转(掘金) this关键字是JavaScript中最复杂的机制之一,是一个特别的关键字,被自动定义在所有函数的作用域中,但是相信很多JavaScript开发者并不是非常清楚它究竟指向的是什么.听说你很 ...

  6. 2sat

    之前做的两发 https://vjudge.net/problem/UVALive-3211 #include<cstdio> #include<cstring> #inclu ...

  7. OSGi类加载流程

    思路 OSGi每个模块都有自己独立的classpath.如何实现这一点呢?是因为OSGi采取了不同的类加载机制: OSGi为每个bundle提供一个类加载器,该加载器能够看到bundle Jar文件内 ...

  8. storm集群架构

    一.storm何许人也? Storm 是Twitter的一个开源框架.Storm一个分布式的.容错的实时计算系统,它被托管在GitHub上,遵循 Eclipse Public License 1.0. ...

  9. [Swift]LeetCode15. 三数之和 | 3Sum

    Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...

  10. [Swift]LeetCode268. 缺失数字 | Missing Number

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...