商城项目第二天复习的内容

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用法的详解的更多相关文章

  1. jQuery Ajax(load,post,get,ajax)用法与详解

    今天看到群里面有网友们问到Jquery Ajax的(load,post,get,ajax)之间的区别,现在整理了一篇文章出来,希望可以帮到网友们,首先我们先来看一些简单的方法, 这些方法都是对jQue ...

  2. $.ajax()所有参数详解

    原文:https://www.cnblogs.com/everest33Tong/p/6159700.html [一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前 ...

  3. MVC之Ajax.BeginForm使用详解之更新列表 mvc验证jquery.unobtrusive-ajax

    MVC之Ajax.BeginForm使用详解之更新列表   1.首先,请在配置文件设置如下:(该项默认都存在且为true) <add key="UnobtrusiveJavaScrip ...

  4. ajax方法参数详解与$.each()和jquery里面each方法的区别

    JQuery中$.ajax()方法参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为g ...

  5. Nmap在实战中的高级用法(详解)

    @ 目录 Nmap在实战中的高级用法(详解) Nmap简单的扫描方式: 一.Nmap高级选项 1.查看本地路由与接口 2.指定网口与IP地址 3.定制探测包 二.Nmap扫描防火墙 1.SYN扫描 2 ...

  6. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  7. 图论中DFS与BFS的区别、用法、详解…

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  8. 图论中DFS与BFS的区别、用法、详解?

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  9. 以太坊客户端Geth命令用法-参数详解

    Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...

随机推荐

  1. Django 框架 数据库操作2

    一.ORM的操作方法总结 get(self, *args, **kwargs): # 获取单个对象 def one_get(request): #直接得到一个表对象,也就是表记录 如果得到多个会报错 ...

  2. 5个Spark应用实例

    Spark简介: Spark是UC Berkeley AMP lab开发的一个集群计算的框架,类似于Hadoop,但有很多的区别.最大的优化是让计算任务的中间结果可以存储在内存中,不需要每次都写入HD ...

  3. xcodebuild 打包

    我的xcode版本比较高,查找的一些低版本的构建都不可用,所以在此记录我的打包过程. 1.app代码仓需要发布的ipa的打包:采用achieve的方式 (1)前期工作 mkdir arch archi ...

  4. php 实现php代码的加密解密

    php 代码加密类,大家可以根据自己的需求进行修改,原类如下,是对之前的加密解密类的有一次修改,希望能分享给大家.本次在ubuntu下测试没有问题,与之前的版本的区别在于,这次的版本更加的通用性. & ...

  5. python class 1

    //test.py class Employee: 'all employee' empCount = 0 def __init__(self, name, salary): self.name = ...

  6. QT linux

    一. 如果你是服务器版的CentOS,我建议你安装一下图形界面 1. 首先安装X window: yum groupinstall 'X WindowSystem'2. 然后安装GNOME: yum ...

  7. 2017/6Summary

    字符串转换为JSON 1.var json = eval('(' + str + ')'); 2.var json = (new Function("return " + str) ...

  8. python入门之列表

    1.列表基本格式# list 类 列表li = [1, 2, 3, "sb", ["时间",[9, 10], "huang"], 6, 7, ...

  9. Php 通过curl提交post内容为 Json的请求

    <?php $data = array("cNos" => array("1064917432615","1064917432615&qu ...

  10. Python底层库的函数中from __future__ import absolute_import的作用

    在查看TensorFlow的底层优化器时候看到from __future__ import absolute_import 查找相关资料后发现 这个语句的意思是加入绝对引用的特征 直白的意思是,比如: ...