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,用于存储对象的容器.(容器本身就 ...
随机推荐
- LoadRunner(一)——性能测试基础及性能指标概述
参考学习感谢:<精通软件性能测试与LoadRunner实战> 一.典型的性能测试场景 某个产品要发布了,需要对全市的用户做集中培训.通常在进行培训的时候,老师讲解完成一个业务以后,被培训用 ...
- Signed Distance Field Shadow in Unity
0x00 前言 最近读到了一个今年GDC上很棒的分享,是Sebastian Aaltonen带来的利用Ray-tracing实现一些有趣的效果的分享. 其中有一段他介绍到了对Signed Distan ...
- [编译] 6、开源两个简单且有用的安卓APP命令行开发工具和nRF51822命令行开发工具
星期四, 27. 九月 2018 12:00上午 - BEAUTIFULZZZZ 一.前言 前几天给大家介绍了如何手动搭建安卓APP命令行开发环境和nRF51822命令行开发环境,中秋这几天我把上面篇 ...
- 浅析PHP正则表达式的利用技巧
浅析PHP正则表达式的利用技巧 正则表达式是什么 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串. 将匹配的子串替换 ...
- [Swift]LeetCode902. 最大为 N 的数字组合 | Numbers At Most N Given Digit Set
We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}. (Not ...
- mysql_study_2
select 代码: CREATE DATABASE mysql_shiyan; use mysql_shiyan; CREATE TABLE department ( dpt_name ) NOT ...
- Kubernetes 笔记 07 豌豆荚之旅(二)
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...
- qt 拖拽 修改大小
写次篇文章之前,qt窗口的放大缩小和拖拽我都是通过setGeometry方法实现的,但是作为windows程序,windows支持橡 皮筋式(拖拽时有一个虚框)拖拽和拉伸.通过setGeometry方 ...
- .NET Core WebApi中实现多态数据绑定
什么是多态数据绑定? 我们都知道在ASP.NET Core WebApi中数据绑定机制(Data Binding)负责绑定请求参数, 通常情况下大部分的数据绑定都能在默认的数据绑定器(Binder)中 ...
- Lucene 07 - 对Lucene的索引库进行增删改查
目录 1 添加索引 2 删除索引 2.1 根据Term删除索引 2.2 删除全部索引(慎用) 3 更新索引 数据保存在关系型数据库中, 需要实现增.删.改.查操作; 索引保存在索引库中, 也需要实现增 ...