demo_3
## 控制器层
需求分析:
访问路径:`/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数据的类`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的更多相关文章
- Java 零基础之作业小练习
[练习1] 需求:输入学员的名称及总科目数并显示每项科目成绩的分数,算出总成绩. package demo2; import java.util.Scanner; //先import Scanner语 ...
- 类Collections的静态方法的使用(代码)
package cn.itcast.p2.toolclass.collections.demo; import java.util.ArrayList; import java.util.Collec ...
- Mysql存储过程语法
一口气弄完了! 一.条件语句if-then-else: create procedure demo_1(in param int) begin declare var int; ; then inse ...
- Java多线程技术学习笔记(一)
目录: 概述 多线程的好处与弊端 JVM中的多线程解析 多线程的创建方式之一:继承Thread类 线程的状态 多线程创建的方式之二:实现Runnable接口 使用方式二创建多线程的好处 多线程示例 线 ...
- Java实现HTML代码生成PDF文档
1.IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源. 2.Flying Sauser实现html2pdf,纠错能力差,支 ...
- 黑马程序员——String类
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- shell中的cat和文件分界符(<<EOF)
在shell中,文件分界符(通常写成EOF,你也可以写成FOE或者其他任何字符串)紧跟在<<符号后,意思是分界符后的内容将被当做标准输入传给<<前面的命令,直到再次在独立的一行 ...
- 类似智能购票的demo--进入页面后默认焦点在第一个输入框,输入内容、回车、right时焦点自动跳到下一个,当跳到select时,下拉选项自动弹出,并且可以按上下键选择,选择完成后再跳到下一个。
要实现的效果:进入页面后默认焦点在第一个输入框,输入内容.回车.right时焦点自动跳到下一个,当跳到select时,下拉选项自动弹出,并且可以按上下键选择,选择完成后再跳到下一个. PS:自己模拟的 ...
- Java集合框架体系详细梳理,含面试知识点。
一.集合类 集合的由来: 面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式. 集合特点: 1,用于存储对象的容器.(容器本身就 ...
随机推荐
- mybatis3源码阅读之SqlSessionFactoryBuilder
/** 构造器,根据配置或者代码生成SqlSessionFactory,采用分布构建的Builder模式 /* public class SqlSessionFactoryBuilder { /** ...
- Python基础之迭代器、生成器
一.迭代器: 1.迭代:每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值.例如:循环获取容器中的元素. 2.可迭代对象(iterable): 1)定义:具有__ite ...
- 微信小程序学习笔记(一)
1.新添加页面,找到app.json,在pages中加入写的路径会自动生成文件 2.页面跳转方式,传参数: wx.navigateTo({ url: '../home/home?title=' + a ...
- Hadoop源码分析(1):HDFS读写过程解析
一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public F ...
- High Availability手册(1): 环境
三台KVM虚拟机 首先我们得有一个pacemaker的环境,需要三台机器,如果没有那么多物理机器,可以用kvm虚拟机 创建一个bridge ovs-vsctl add-br ubuntu_br ifc ...
- 【.NET Core微服务实战-统一身份认证】开篇及目录索引
简介 学习.NETCORE也有1年多时间了,发现.NETCORE项目实战系列教程很少,都是介绍开源项目或基础教程,对于那些观望的朋友不能形成很好的学习思路,遇到问题怕无法得到解决而不敢再实际项目中 ...
- IntelliJ Idea 2017 免费激活方法
1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...
- [Swift]LeetCode392. 判断子序列 | Is Subsequence
Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...
- [Swift]LeetCode403. 青蛙过河 | Frog Jump
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- [Swift]LeetCode909. 蛇梯棋 | Snakes and Ladders
On an N x N board, the numbers from 1 to N*N are written boustrophedonically starting from the botto ...