描述:
- jQuery:用于前段的js和Ajax处理
- SpringMVC:用于接收请求分发处理,返回JSON响应
SpringIOC:用于管理Controller,Service,Dao组件,注入关系.
降低组件之间的关联
- 所有请求采用Ajax方式与服务器端交互
所有请求响应的JSON统一格式为
{
"status":请求处理状态,
"msg":消息,
"data":数据
}
- ##登录功能
发送Ajax请求
-发送时机:登录按钮onclick
-请求参数:用户名和密码
-请求地址:/user/login.action
准备的类
- Result.class 用于对返回json数据的封装
- NoteUtil.class 用于MD5加密,利用UUID生成User的ID
UserMapper.xml
和以前一样没有什么改变.
UserServiceImpl
package com.qiushiju.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.qiushiju.mapper.UserMapper;
import com.qiushiju.model.User;
import com.qiushiju.service.UserService;
import com.qiushiju.util.NoteUtil;
import com.qiushiju.util.Result;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public Result<User> checkLogin(String userName, String password) {
Result<User> result = new Result<User>();
User user = userMapper.getUserByName(userName);
if (user == null) {
result.setStatus(1);
result.setMsg("用户名错误");
return result;
}
String md5_pwd;
try {
md5_pwd = NoteUtil.md5(password);
if (!user.getCnUserPassword().equals(md5_pwd)) {
result.setStatus(2);
result.setMsg("密码错误");
return result;
}
} catch (Exception e) {
e.printStackTrace();
}
// 登录成功
result.setStatus(0);
result.setMsg("登录成功");
//密码可以屏蔽返回
//user.setCnUserPassword("");
result.setData(user);
return result;
}
@Override
public Result<Object> addUser(String userName, String userNick, String password) {
Result<Object> result = new Result<Object>();
User hasUser = userMapper.getUserByName(userName);
if (hasUser != null) {
result.setStatus(1);
result.setMsg("用户名已占用");
return result;
}
User user = new User();
user.setCnUserId(NoteUtil.createId());
user.setCnUserName(userName);
user.setCnUserNick(userNick);
try {
user.setCnUserPassword(NoteUtil.md5(password));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
userMapper.addUser(user);
result.setStatus(0);
result.setMsg("注册成功");
return result;
}
}
UserController.java
package com.qiushiju.controller;
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.qiushiju.model.User;
import com.qiushiju.service.UserService;
import com.qiushiju.util.Result;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/login.action")
@ResponseBody
public Result<User> login(String userName, String password) {
Result<User> result = userService.checkLogin(userName, password);
return result;
}
@RequestMapping("/add.action") // 不写的method = RequestMethod.的话,就是默认两种都可以
@ResponseBody
public Result<Object> regis(String userName, String password, String userNick) {
Result<Object> result = userService.addUser(userName, userNick, password);
return result;
}
}
Result.java
package com.qiushiju.util;
public class Result<T> {
private Integer status; // 状态位,0表示成功,1表示用户名错误,2表示棉密码错误
private String msg; // 各种信息,如登录成功,用户名错误,密码错误
private T data; // 返回的数据.
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
NoteUtil.java
package com.qiushiju.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
import com.alibaba.druid.util.Base64;
public class NoteUtil {
public static String createId(){
UUID uuid = UUID.randomUUID();
return uuid.toString().replace("-","");
}
public static String md5(String c) throws Exception{
//将字符串信息采用MD5处理
MessageDigest md = MessageDigest.getInstance("MD5");
// 将MD5处理结果利用base64转成字符串
byte[] output = md.digest(c.getBytes());
String s = org.apache.tomcat.util.codec.binary.Base64.encodeBase64String(output);
return s;
}
public static void main(String[] args) throws Exception {
System.out.println(createId());
System.out.println(md5("123456"));
}
}
log_in.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles/login.css"/>
<script type="text/javascript"
src="scripts/jquery.min.js">
</script>
<script type="text/javascript"
src="scripts/basevalue.js">
</script>
<script type="text/javascript"
src="scripts/cookie_util.js">
</script>
<script type="text/javascript"
src="scripts/login.js">
</script>
</head>
<body>
<div class="global">
<div class="log log_in" tabindex='-1' id='dl'>
<dl>
<dt>
<div class='header'>
<h3>登 录</h3>
</div>
</dt>
<dt></dt>
<dt>
<div class='letter'>
用户名: <input type="text" name="" id="count" tabindex='1'/>
<span id="count_span"></span>
</div>
</dt>
<dt>
<div class='letter'>
密 码: <input
type="password" name="" id="password" tabindex='2' /> <span id="password_span"></span>
</div>
</dt>
<dt>
<div>
<input type="button" name="" id="login" value=' 登 录 ' tabindex='3'/>
<input type="button" name="" id="sig_in" value=' 注 册 ' tabindex='4'/>
</div>
</dt>
</dl>
</div>
<div class="sig sig_out" tabindex='-1' id='zc' style='visibility:hidden;'>
<dl>
<dt>
<div class='header'>
<h3>注 册</h3>
</div>
</dt>
<dt></dt>
<dt>
<div class='letter'>
用户名: <input type="text" name="" id="regist_username" tabindex='5'/>
<div class='warning' id='warning_1'><span id="warning_1 span">该用户名不可用</span></div>
</div>
</dt>
<dt>
<div class='letter'>
昵 称: <input type="text" name="" id="nickname" tabindex='6'/>
</div>
</dt>
<dt>
<div class='letter'>
密 码: <input type="password" name="" id="regist_password" tabindex='7'/>
<div class='warning' id='warning_2'><span id="warning_2 span">密码长度过短</span></div>
</div>
</dt>
<dt>
<div class='password'>
确认密码: <input type="password" name="" id="final_password" tabindex='8'/>
<div class='warning' id='warning_3'><span id="warning_3 span">密码输入不一致</span></div>
</div>
</dt>
<dt>
<div>
<input type="button" name="" id="regist_button" value=' 注 册 ' tabindex='9'/>
<input type="button" name="" id="back" value=' 返 回 ' tabindex='10'/>
<script type="text/javascript">
function get(e){
return document.getElementById(e);
}
get('sig_in').onclick=function(){
get('dl').className='log log_out';
get('zc').className='sig sig_in';
}
get('back').onclick=function(){
get('zc').className='sig sig_out';
get('dl').className='log log_in';
}
window.onload=function(){
var t =setTimeout("get('zc').style.visibility='visible'",800);
get('final_password').onblur=function(){
var npassword=get('regist_password').value;
var fpassword=get('final_password').value;
if(npassword!=fpassword){
get('warning_3').style.display='block';
}
}
get('regist_password').onblur=function(){
var npassword=get('regist_password').value.length;
if(npassword<6&&npassword>0){
get('warning_2').style.display='block';
}
}
get('regist_password').onfocus=function(){
get('warning_2').style.display='none';
}
get('final_password').onfocus=function(){
get('warning_3').style.display='none';
}
}
</script>
</div>
</dt>
</dl>
</div>
</div>
</body>
</html>
login.js类
/**
* 主处理
*/
$(function() {
// 登录按钮处理
$("#login").click(login);
// 注册按钮处理
$("#regist_button").click(regist);
});
/**
* 登录处理
*/
function login() {
// 清除提示信息
$("#count_span").html("");
$("#password_span").html("");
// 1.获取请求参数
// var 属性名,要与controlller层一致
var userName = $("#count").val().trim(); // .trim()去空
var password = $("#password").val().trim();
// 2.检查参数格式
// true通过检测;false未通过检测
var check = true;
if (userName == "") {
$("#count_span").html("用户名为空");
check = false;
}
if (password == "") {
$("#password_span").html("密码为空");
check = false;
}
// 3.发送Ajax请求
if (check) {
$.ajax({
url : base_path + "/user/login.action",
type : "post",
data : {
// ""引号内要与controller参数保持一致
// : 后的要与上面的var 属性名 保持一致
"userName" : userName,
"password" : password
},
dataType : "json",
// ajax的回调函数:发送请求经过后台处理将结果返回到此函数中,并利用js将页面更新
// result 是后台controller返回的一个json格式的数据result
success : function(result) {
if (result.status == 0) { // 0 表示登录成功
var user = result.data;
// 获取返回的用户ID,存入Cookie
// var userId = result.data.cnUserId; // 对应实体类的属性
// 获取返回的令牌号,存入Cookie
// var token = result.data.cnUserToken;
// 调用cookie_util.js函数写入cookie
// addCookie("userId", userId, 2);
// addCookie("token", token, 2);
addCookie("uid", user.cnUserId, 2);
addCookie("uname", user.cnUserName, 2);
// 跳转到指定页面
window.location.href = "edit.html";
} else if (result.status == 1) { // 1 表示用户名错误
$("#count_span").html(result.msg);
} else if (result.status == 2) { // 2表示密码错误
$("#password_span").html(result.msg);
}
},
error : function() {
alert("登录异常");
}
});
}
};
/**
* 注册处理
*/
function regist() {
// 清空提示信息
$("#warning_1 span").html("");
$("#warning_2 span").html("");
$("#warning_3 span").html("");
$("#warning_1").hide();
$("#warning_2").hide();
$("#warning_3").hide();
// 获取请求参数
var name = $("#regist_username").val().trim();
var nick = $("#nickname").val().trim();
var password = $("#regist_password").val().trim();
var final_password = $("#final_password").val().trim();
// 检查格式
var check = true;
if (name == "") {
$("#warning_1 span").html("用户名为空");
$("#warning_1").show();
check = false;
}
if (password == "") {
$("#warning_2 span").html("密码为空");
$("#warning_2").show();
check = false;
} else if (password.length < 6) {
$("#warning_2 span").html("密码大于等于6位");
$("#warning_2").show();
check = false;
}
if (final_password == "") {
$("#warning_3 span").html("确认密码为空");
$("#warning_3").show();
check = false;
} else if (final_password != password) {
$("#warning_3 span").html("与密码不一致");
$("#warning_3").show();
check = false;
}
// 发送Ajax请求
if (check) {
$.ajax({
url : base_path + "/user/add.action",
type : "post",
data : {
"userName" : name,
"userNick" : nick,
"password" : password
},
dataType : "json",
success : function(result) {
if (result.status == 0) { // 成功
// 提示成功
alert(result.msg);
// 切换到登录页面
$("#back").click(); // 出发点击事件
} else if (result.status == 1) {
// 提示用户名已经占用
$("#warning_1 span").html(result.msg);
$("#warning_1").show();
}
},
error : function() {
alert("注册发生异常");
}
});
}
};