控制层和ajax用法的详解
商城项目第二天复习的内容
package cn.tedu.store.entity;
public class ResponseResult<T> {
public static final int STATE_OK = 1;
public static final int STATE_ERR = 0;
private Integer state;
private String message;
private T data;
public ResponseResult() {
super();
}
public ResponseResult(Integer state) {
super();
this.state = state;
}
public ResponseResult(
Integer state, String message) {
super();
this.state = state;
this.message = message;
}
public ResponseResult(Integer state, T data) {
super();
this.state = state;
this.data = data;
}
public ResponseResult(Throwable throwable) {
super();
this.state = STATE_ERR;
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;
}
}
说明:
0~1状态 失败成功状态
添加一个带参数的构造方法
构造方法的作用是什么?看王克晶笔记或视频
为了快速创建对象出来,有了构造函数之后
//出于规范性
public ResponseResult(){ } //成功
public ResponseResult(Integer state){
super();
this.state=state;
} //有了这个就可以快速地new一个出来对象出来了 //失败
public ResponseResult(Integer state,String message){
//错误和错误的提示信息
super();
this.state=state;
this.message=message;
} //
public ResponseResult(Integer state,T data){
//表示成功的时候还有数据
super();
this.state=state;
this.data=data;
} public ResponseResult(Throwable throwable){
super();
}
-----------------------------------------------------------------------------------------------------------------------------
package cn.tedu.store.controller; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import cn.tedu.store.entity.ResponseResult;
import cn.tedu.store.entity.User;
import cn.tedu.store.service.IUserService;
import cn.tedu.store.service.ex.ServiceException;
import cn.tedu.store.service.ex.UsernameConflictException; @Controller
@RequestMapping("/user")
public class UserController extends BaseController { @Autowired//按照类型自动注入属性的值,按照类型来查找和装配元素
private IUserService userService;
//控制器层要调用业务层对象,所以要有业务层对象,
//把前面的依赖注入的例子好好地看看,默写相关例子 @RequestMapping("/reg.do")
public String showReg() {//转发显示注册页面 显示请求页面的处理
return "register";
} @RequestMapping("/login.do")
public String showLogin() {
return "login";
} @RequestMapping("/change_password.do")
public String showChangePassword() {
return "user_password";
} @RequestMapping("/change_info.do")
public String showChangeInfo(
ModelMap modelMap,
HttpSession session) {
// 从session中获取当前用户的id
Integer id = getUidFromSession(session);
// 根据id获取当前用户的信息
User user = userService.findUserById(id);
// 判断是否获取到用户数据,因为可能在登录后,数据被管理员删除
if (user != null) {
// 将数据封装到ModelMap对象,以转发到前端页面
modelMap.addAttribute("user", user);
// 执行转发
return "user_info";
} else {
// 找不到数据,极可能是被管理员删除了
// 执行重定向
return "redirect:../main/error.do";
}
}
/**控制器层:学子商城的注册功能的处理*/
@RequestMapping(value="/handle_reg.do",method=RequestMethod.POST)
@ResponseBody//只要响应方式不是转发或重定型,就要使用该注解,一般是json或字符串
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.getId());
session.setAttribute("username", u.getUsername());
rr = new ResponseResult<Void>(
ResponseResult.STATE_OK);
} catch (UsernameConflictException e) {//注册失败并抛出异常
rr = new ResponseResult<Void>(e);
} return rr;
}
说明:
//输入localhost:8080/TeduStore/user/handle_reg.do? username=mike&password=123456&&phone1&email=1
页面上显示json字符串{"state":1,"message":null,"data":null}
控制器是响应一个对象,所以会响应成json 响应通过jackson包就会响应成json
这些页面上的内容会在终端数据库显示
@RequestMapping(value="/handle_login.do",
method=RequestMethod.POST)
@ResponseBody
public ResponseResult<Void> handleLogin(
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_OK);
} catch (ServiceException e) {
rr = new ResponseResult<Void>(e);
}
return rr;
} @RequestMapping(value="/handle_change_password.do",
method=RequestMethod.POST)
@ResponseBody
public ResponseResult<Void> handleChangePassword(
String oldPassword,
String newPassword,
String confirmPassword,
HttpSession session) {
// 声明返回值
ResponseResult<Void> rr;
// 检查数据的有效性
if (newPassword != null &&
newPassword.equals(confirmPassword) &&
newPassword.length() >= 6 && newPassword.length() <= 16) {
try {
// 从session中获取当前登录的用户的id
Integer id = getUidFromSession(session);
// 执行修改密码
userService.changePassword(
id, oldPassword, newPassword);
rr = new ResponseResult<Void>(
ResponseResult.STATE_OK);
} catch (ServiceException e) {
rr = new ResponseResult<Void>(e);
}
} else {
// 两次输入的新密码不一致
rr = new ResponseResult<Void>(
ResponseResult.STATE_ERR,
"两次输入的新密码不一致!");
}
// 返回
return rr;
} @RequestMapping(value="/handle_change_info.do",
method=RequestMethod.POST)
@ResponseBody
public ResponseResult<Void> handleChangeInfo(
String username,
Integer gender,
String phone,
String email,
HttpSession session) {
// 检查数据的有效性
if ("".equals(username)) {
username = null;
}
// 获取session中的uid
Integer id = getUidFromSession(session); // 声明返回值
ResponseResult<Void> rr; try {
// 执行修改
userService.changeInfo(id, username, gender, phone, email);
rr = new ResponseResult<Void>(
ResponseResult.STATE_OK);
} catch (ServiceException e) {
rr = new ResponseResult<Void>(e);
} // 返回
return rr;
} @RequestMapping("/logout.do")
public String handleLogout(HttpSession session) {
// 清除session中的信息
session.invalidate();
// 重定向到首页
return "redirect:../main/index.do";
}
}
说明:
1.sumbit可以用来提交表单
<input type="sumbit">
2.button可以提交表单
<button ></button>
---------------------------------------------------------------------------------------------------------------------------------------------------------
###regist.jsp的显示的修改
首先用ctrl+f搜索"注册"等相关字样,找到对应的标签定义,再根据id找到对应的响应事件函数,并定义
引入jq包,用jq写法写函数,再然后判断是否length是否等于5(是否5个span是否都输入了相应的数字),
用jq的方式进行ajax提交,
引入jquery包, 再检查是否引入成功
<script src="../js/jquery-3.1.1.min.js"></script>
<script>
if(length==5){
//请求目标的路径
var url="handle_reg.do";//服务器里面的控制器来对handle_reg.do处理注册功能,写相对路径就可以了
//各个输入框中获取用户的输入
var username=$("#uname").val();
//从输入框中把值拿出来,用jq来取出值, 获取输入框的id值,这个看相对应的<input>中的id值,调用var函数
var password= ;
var phone= ;
var email= ;
//注册框中确定要提交的数据
var data="username="+username
+"&password="+password
+"&phone="+phone
+"&email="+email; $.ajax({ //提交ajax请求并处理
"url":url,//请求路径
"data":data,//请求数据
"type":"POST",//请求类型
"dataType":"json",//服务器的响应数据包的数据的返回格式 如文本格式.txt,或者是json格式
"success":function(obj){//服务器处理请求 obj表示给回来的json对象
if(obj.state==0){//json对象里面有个state表示响应码 用0表示失败 用1表示成功
alert(obj.message); //表示错误信息的
}else{
//注册成功
alert("注册成功!");//或者内嵌一个网页 当然肯定要再写一个网页
}
}
});
//在服务端的返回类类型ResponseResult封装了message 和 state 统一响应格式
控制层和ajax用法的详解的更多相关文章
- jQuery Ajax(load,post,get,ajax)用法与详解
今天看到群里面有网友们问到Jquery Ajax的(load,post,get,ajax)之间的区别,现在整理了一篇文章出来,希望可以帮到网友们,首先我们先来看一些简单的方法, 这些方法都是对jQue ...
- $.ajax()所有参数详解
原文:https://www.cnblogs.com/everest33Tong/p/6159700.html [一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前 ...
- MVC之Ajax.BeginForm使用详解之更新列表 mvc验证jquery.unobtrusive-ajax
MVC之Ajax.BeginForm使用详解之更新列表 1.首先,请在配置文件设置如下:(该项默认都存在且为true) <add key="UnobtrusiveJavaScrip ...
- ajax方法参数详解与$.each()和jquery里面each方法的区别
JQuery中$.ajax()方法参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为g ...
- Nmap在实战中的高级用法(详解)
@ 目录 Nmap在实战中的高级用法(详解) Nmap简单的扫描方式: 一.Nmap高级选项 1.查看本地路由与接口 2.指定网口与IP地址 3.定制探测包 二.Nmap扫描防火墙 1.SYN扫描 2 ...
- 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解
Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解 多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 图论中DFS与BFS的区别、用法、详解?
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 以太坊客户端Geth命令用法-参数详解
Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...
随机推荐
- Android使用SpannableString设置多样式文本
Android将一行文本设置为多种样式时,可以使用 SpannableString 来实现 private void setTips(){ String big = "大字深色"; ...
- 对接口(interface)的思考
接口,java中用关键字interface定义.今天学习java基础API时,发现一个特点:每个包中都定义了一堆的接口,感觉有马克思主义中提到的“上层建筑”的味道.接口就是为需要实现的功能定一个基调, ...
- [Guitar self-learning] 基本乐理知识1. 度,升降记号#/b
度:是音程上面的单位, 指每两个音程(音名)之前的音距.(就像我们说身高时的cm一样, 用来表明当时的音高.) 升记号:# , 表明在当前的音高下, 升半个音高. 如 #3 == 4 降记号: ...
- IntelliJ IDEA 配置tomcat 启动项目
1.打开file中setting中搜索Application Servers,如下图 2.添加服务器类型,例如tomcat,如下图,添加完成之后可以选定tomcat的目录,tomcat Home配置t ...
- Groovy动态解析
A:前面需要说些什么吗? B:不需要吗? A:需要吗? 解析方式一:通过指定的paths来初始化GroovyScriptEngine //通过指定的paths来初始化GroovyScriptEngin ...
- 用python.twisted.logfile每天记录日志,并用不记录stdout中的内容
#导入的头 from twisted.python import logfrom twisted.python.logfile import * #开始记录,输入日志名和存放的路径,setStdout ...
- 百度编辑器 Ueditor
针对与编辑器里面的图片的存储问题:\ueditor\1.4.3\php\conf.json 文件里面 /* 前后端通信相关的配置,注释只允许使用多行方式 */{/* 上传图片配置项 */“imageA ...
- jQuery-动画点击淡化消失
<!DOCTYPE html> <html> <head> <title> new document </title> <meta c ...
- Service Fabric下删除实例并注销应用
Service Fabric下删除实例并注销应用: 以应用名称:Application1为例 1.打开PowerShell 2.连接集群: Connect-ServiceFabricCluster - ...
- nat123学习笔记
1.NAT123内网映射端口 在无内网路由管理员权限的情况下,需要将内网web应用暴露到公网访问,此时需要用到花生壳或者nat123(两个应用都不是免费的,其中花生壳可以8元认证,以后免费使用,nat ...