控制层和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的翻译 ...
随机推荐
- [js]js中回调函数
//回调函数: 把一个函数当参数传给另个函数 /* function f1() { console.log('f1'); } function f2(f) { f(); console.log(1); ...
- 【Android】adb connect 手机的两种方式
adb支持两种连接Android系统的方式,USB方式及网络方式.一般android手机及android平板默认会设置为USB方式(直接插数据线的方式). 下边介绍两种方式的切换方式. 1. 背景知识 ...
- [ Linux运维学习 ] 路径及实战项目合集
我们知道运维工程师(Operations)最基本的职责就是负责服务的稳定性并确保整个服务的高可用性,同时不断优化系统架构.提升部署效率.优化资源利用率,确保服务可以7*24H不间断地为用户提供服务. ...
- jenkins 实现多用户同时触发任务 + 修改job的config.xml 不重启服务生效
(后期添加: 这篇博客是在刚研究并发构建时写的,所以方法比较老套,采用的时流水线(pipeline)的方式,实现时通过如果job的用户配置来创建多个新的执行任务的job,并且将执行日志回收到入口job ...
- 新手详解JAVA+数据库+JSP完成简单页面
本篇以数据库添加为例(本例中数据库名为“xinxi”表单名字为“stud”) 准备---实体层: package entity; public class Student { private Stri ...
- MVC爬取网页指定内容到数据库
控制器 //获取并插入 //XPath获取 public JsonResult Add(string url) { HtmlWeb web = new HtmlWeb(); HtmlDocument ...
- jmeter压测之 监控--nmon
压测方法整理: 1. 写jmx脚本,整理csv数据文件: 2. 部署测试环境,把jmx和csv放在压测机,把监控脚本nmon放被压测机: 3. 安装nmon: a. w ...
- Python底层库的函数中from __future__ import absolute_import的作用
在查看TensorFlow的底层优化器时候看到from __future__ import absolute_import 查找相关资料后发现 这个语句的意思是加入绝对引用的特征 直白的意思是,比如: ...
- [3]windows内核情景分析--内存管理
32位系统中有4GB的虚拟地址空间 每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全 ...
- Rpgmakermv(33) Mog_PictureGallery
============================================================================= +++ MOG - Picture Gall ...