• 控制层和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 统一响应格式

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    IIS6.0中,使用其它用户运行IIS
    c++构造函数详解
    Java创建文件夹及文件
    三大范式及存储方式
    对新型软件程序语言及架构的一点讨论
    C++虚函数解析
    验收测试驱动开发:ATDD实例详解
    什么是父路径及开启的方法
    note:全局配置visual studio 2010 头文件目录
    怎么把二级域名重定向到主域名
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/9664938.html
Copyright © 2020-2023  润新知