【Java框架型项目从入门到装逼】第十三节 用户新增功能完结篇
这一节,我们把用户新增的功能继续做一个完善。首先,新增成功后,需要给前台返回一个信息,就是告诉浏览器,这次用户新增的操作到底是成功了呢,还是失败了呢?为此,我们需要专门引入一个结果类,里面只有两个属性,分别为错误码和错误信息,这个类在之前的章节中有提到过。

package com.app.bean;
public class ResultData {
private int errCode = 0;
private String errMsg;
public int getErrCode() {
return errCode;
}
public void setErrCode(int errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
}
然后,改写UserController类:
package com.app.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.app.bean.ResultData;
import com.app.bean.Student;
import com.app.service.UserService;
import com.app.service.impl.UserServiceImpl;
@Controller
public class UserController {
//用户业务类的引用
private UserService userService = new UserServiceImpl();
@RequestMapping("/addUser")
@ResponseBody
public ResultData addUser(HttpServletRequest request , HttpServletResponse response,Student student){
ResultData data = new ResultData();
try{
userService.addUser(student);
}catch(Exception e){
data.setErrCode(-1);
data.setErrMsg(e.getMessage());
}
return data;
}
}
如果保存操作出现异常,我们就捕获一下异常,并且记录下异常信息,返回给浏览器。注意,这边我们还给addUser方法加了一个@ResponseBody注解。这样一来,当我们return数据的时候,就会自动转换成json对象,然后用IO流的方式写出到浏览器。
后台控制器解决了之后,我们再来修改前台的ajax方法:
//使用ajax传递到后台
$.post("addUser.do",json,function(data){
//这里是处理返回数据的回调函数
if(data.errCode < 0){
alert('操作发生错误,原因是:' + data.errMsg);
}else{
alert('保存成功');
}
},"json");
效果:

现在,我们故意制造一个异常:
@Controller
public class UserController {
//用户业务类的引用
private UserService userService = new UserServiceImpl();
@RequestMapping("/addUser")
@ResponseBody
public ResultData addUser(HttpServletRequest request , HttpServletResponse response,Student student){
ResultData data = new ResultData();
try{
userService.addUser(student);
int i = 1 / 0; //故意写一句错误代码
}catch(Exception e){
data.setErrCode(-1);
data.setErrMsg(e.getMessage());
}
return data;
}
}
结果

这样一来,浏览器就能清楚地知道后台报了什么错误了。
但是这样有一个问题,虽然后台报错了,但是数据依然进了数据库。这里我们就需要规定,所有的业务操作不应该放在controller类中,都应该放到service类中。而且,这边还涉及到一个事务回滚的问题。这些知识点会在以后讲到。
现在,我们来看一下数据库:

发现一个问题,两条数据的用户名是重复的,在实际情况下,用户名和ID一样,是唯一的。所以,我们需要判断一下用户名是否重复?
package com.app.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.app.bean.ResultData;
import com.app.bean.Student;
import com.app.service.UserService;
import com.app.service.impl.UserServiceImpl;
UserController
@Controller
public class UserController {
//用户业务类的引用
private UserService userService = new UserServiceImpl();
@RequestMapping("/addUser")
@ResponseBody
public ResultData addUser(HttpServletRequest request , HttpServletResponse response,Student student){
ResultData data = new ResultData();
try{
//先判断用户名是否重复
int count = userService.getByUserName(student);
if(count > 0){
data.setErrCode(-1);
data.setErrMsg("用户名已经存在啦,换一个吧。。。");
}
userService.addUser(student);
}catch(Exception e){
data.setErrCode(-1);
data.setErrMsg(e.getMessage());
}
return data;
}
}
UserServiceImpl
package com.app.service.impl;
import com.app.bean.Student;
import com.app.dao.UserDao;
import com.app.dao.impl.UserDaoImpl;
import com.app.service.UserService;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
@Override
public void addUser(Student student) {
userDao.addUser(student);
}
@Override
public int getByUserName(Student student) {
return userDao.getByUserName(student);
}
}
UserDaoImpl
package com.app.dao.impl;
import java.util.HashMap;
import java.util.Map;
import com.app.bean.Student;
import com.app.dao.UserDao;
import com.simple.dao.SimpleDao;
public class UserDaoImpl implements UserDao {
@Override
public void addUser(Student student) {
SimpleDao dao = new SimpleDao();
Map map = new HashMap();
map.put("id", null);
map.put("username", student.getUsername());
map.put("password", student.getPassword());
map.put("name", student.getName());
map.put("sex", student.getSex());
dao.save("db_student", "t_student", map);
}
@Override
public int getByUserName(Student student) {
String sql = "select count(1) from t_student where username = ?";
SimpleDao dao = new SimpleDao();
return dao.queryForInt(sql, student.getUsername());
}
}
效果:

在保存操作之前,我们先判断一下用户名在表里是否存在,只要存在了,就给他返回一个错误。OK,让我们看一下数据库:


我去,怎么还是保存进去啦,喵喵喵?
让我们再回过去看一下controller的方法:
@Controller
public class UserController {
//用户业务类的引用
private UserService userService = new UserServiceImpl();
@RequestMapping("/addUser")
@ResponseBody
public ResultData addUser(HttpServletRequest request , HttpServletResponse response,Student student){
ResultData data = new ResultData();
try{
//先判断用户名是否重复
int count = userService.getByUserName(student);
if(count > 0){
data.setErrCode(-1);
data.setErrMsg("用户名已经存在啦,换一个吧。。。");
}
userService.addUser(student);
}catch(Exception e){
data.setErrCode(-1);
data.setErrMsg(e.getMessage());
}
return data;
}
}
发现问题了,我们只是给data对象设置了错误码和错误信息,但是保存方法依然执行了,所以,我们需要及时return:

再来一次,就好了。
【Java框架型项目从入门到装逼】第十三节 用户新增功能完结篇的更多相关文章
- 【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?
啥叫Tomcat?有道词典是这么说的. 这个我们姑且不管,实际上呢,Tomcat是一种Web服务器,我们自己做好了一个Web项目,就可以通过Tomcat来发布.服务器呢,又分为硬件服务器和软件服务器. ...
- 【Java框架型项目从入门到装逼】第七节 - 学生管理系统项目搭建
本次的教程是打算用Spring,SpringMVC以及传统的jdbc技术来制作一个简单的增删改查项目,对用户信息进行增删改查,就这么简单. 1.新建项目 首先,打开eclipse,新建一个web项目. ...
- 【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说
大家好,好久不见,今天我们来一起学习一下关于Spring框架的IOC技术. 控制反转--Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的 ...
- 【Java框架型项目从入门到装逼】第五节 - 在Servlet中接收和返回数据
在上一节的程序中,我们可以看到HttpServletRequest, HttpServletResponse这两个对象.可以说,这是JavaWeb中至关重要的两个对象.接下来,我们来做一个简短的说明: ...
- 【Java框架型项目从入门到装逼】第十二节 项目分层
这一节我们开始对项目进行分层,一般来说,一个web项目的层次结构如下图所示: controller层为我们的控制层,用来接收用户的请求,比如新增一个学生的信息,新增的请求最先就是走到这一层.contr ...
- 【Java框架型项目从入门到装逼】第四节 - 编写第一个Servlet程序
在开始这一节之前呢,我们还需要把Tomcat配置到Eclipse中,配置的方式很简单,打开Eclipse,Window,Preferences,进入到这个页面: 将Tomcat的安装目录配置到Ecli ...
- 【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作
1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...
- 【Java框架型项目从入门到装逼】第十四节 查询用户列表展现到页面
这一节,我们来实现一下用户列表搜索,最终的效果如下: 这边我们要使用easyUI给我们提供的datagrid组件. HTML结构如下 <!-- 数据列表 --> <table id= ...
- 【Java框架型项目从入门到装逼】第八节 - 用EasyUI绘制主界面
1.引入资源包 在上一节中,我们把基本的框架都搭好了,用了Spring,SPringMVC.这一节,我们先来画页面,前端框架采用EasyUI来实现. easyui是一种基于jQuery的用户界面插件集 ...
随机推荐
- Vue -- vue-cli(vue脚手架) npm run build打包优化
这段时间公司新项目立项,开发组选用 Vue2.0 进行开发.当然也就一并用到 vue cli 进行自动化构建.结果在基础版本开发完成后,用 npm run build 命令打包上线时,发现以下几个问题 ...
- 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...
- SQL Server复制入门(一)----复制简介 (转载)
简介SQL Server中的复制(Replication)是SQL Server高可用性的核心功能之一,在我看来,复制指的并不仅仅是一项技术,而是一些列技术的集合,包括从存储转发数据到同步数据到维护数 ...
- 注意Sqlserver中使用with(nolock)后实际上还是会加架构锁,只是不对要查询的数据加S锁而已(转载)
开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如下所示(摘 ...
- 在Eclipse中运行Jboss时出现java.lang.OutOfMemoryError:PermGen space及其解决方法
在Eclipse中运行Jboss时出现java.lang.OutOfMemoryError:PermGen space及其解决方法 在Eclipse中运行Jboss时,时间太长可能有时候会出现java ...
- gitlab配置push -f 关闭
默认路径是/var/opt/gitlab/git-data/repositories/组/库 修改conf 文件 [core] repositoryformatversion = 0 filemode ...
- kettle性能优化
普通开发电脑,如果没有网络查询步骤,kettle正常的速度应该在3000~20000条/秒.如果速度在2000条/秒一下,就可能需要调优. 性能优化的方式包括如下几种: 1.通过改变开始复制的数量(针 ...
- Java-Swing常用布局管理器
http://www.cnblogs.com/hthuang/p/3460234.html 5.Java-Swing常用布局管理器 应用布局管理器都属于相对布局,各组件位置可随界面大小 ...
- 【爬坑】Python 3.6 在 Socket 编程时出现类型错误 TypeError: a bytes-like object is required, not 'str'
1. 问题描述 Python 3.6 在 Socket 编程时出现错误如下 Traceback (most recent call last): File "F:/share/IdeaPro ...
- 1.2环境的准备(二)之Pycharm的安装和使用
目录: 1.Pycharm的安装 2.Pycharm的使用 (一)pycharm的安装: (1)官网下载:(分为两个版本,专业版和社区版,社区版就足够我们学习用的)https://www.jetbra ...