控制层和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的翻译 ...
随机推荐
- emq共享订阅
emqtt 试用(二)验证 emq 和 mosquito 的共享订阅 1. 多个订阅者都订阅以下主题形式 clientA 订阅 $queue/topic 发布主题名称为 topic1 clien ...
- Oracle SQL常用语句
1,查询插入 insert into user_role(account_id, role_id, create_user) select t.employee_id, 'BC8FBF8B1D9843 ...
- Python 命名笔记
类名开头大写,驼峰命名 函数名,变量名都小写, 全局常量 如COUNT, 使用全部大写 https://www.cnblogs.com/lytwajue/p/7324724.html 这个是全局变量关 ...
- vue的分页组件
<template> <div class="page-nav"> <div class="page-btn-wrap"> ...
- python SMTP other
HTML 正文,带链接和图片 //test.py import smtplib from email.mime.image import MIMEImage from email.mime.text ...
- shell编程:case语句
- react native 使用TabNavigator编写APP底部导航
第一步,下载依赖 npm install react-native-tab-navigator --save 第二步,引入 import TabNavigator from 'react-native ...
- border的特殊用法
大家很容易在一些网页上看到二级菜单上有一个小的三角形,这个小三角型 除了可以使用图片或者使用iconfont写出来,还可以使用border写出来 这边简单的为大家举一个例子,希望对大家有用吧! css ...
- HTTP请求解析过程 (简单概括)
1.域名解析 用户输入网址,由域名系统DNS解析输入的网址: 2.TCP的3次握手 通过域名解析出的IP地址来向web服务器发起TCP连接请求,如果3次握手通过,则与web服务端建立了可靠的连接: 3 ...
- 01JAVA语言基础课后作业
1.问题 一个Java类文件中真的只能有一个公有类吗? 请使用Eclipse或javac检测一下以下代码,有错吗? 回答 真的只能有一个公有类 一个Java源文件中最多只能有一个public类,当有 ...