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,用于存储对象的容器.(容器本身就 ...
随机推荐
- Android Gradle Task
Tasks runnable from root project ------------------------------------------------------------ Androi ...
- Flutter 文本样式继承
使用inherit来设置是否继承样式 DefaultTextStyle( style: TextStyle(color: Colors.red, fontSize: 22), child: Colum ...
- Nginx负载均衡的5种策略(转载)
Nginx的upstream目前支持的5种方式的分配 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. upstream backserver { s ...
- mybatis的配置和使用
mybatis的配置和使用 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
- 测试连接失败,因为初始化提供程序时发生错误,[DBNMPNTW] ConnectionOpen (CreateFile())
此主题相关图片如下:错误.jpg 今天发布的程序,在其它电脑上运行没问题,就是其中一台电脑上运程报这个错.系统是Win7的查了好久,最后解决 方法如下: 在报错的电脑上,单击"开始" ...
- Java script 逻辑运算符
a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回a 1.只要“&&”前面是false,无论“&& ...
- Python代码缩进与测试模块
一.Python代码缩进 Python 函数没有明显的 begin 和 end ,没有标明函数的开始和结束的花括号.唯一的分隔符是一个冒号 ( : ),接着代码本身是缩进的. 例如:缩进 bui ...
- [Swift]LeetCode52. N皇后 II | N-Queens II
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
- [Swift]LeetCode204. 计数质数 | Count Primes
Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 E ...
- [Swift]LeetCode376. 摆动序列 | Wiggle Subsequence
A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...