要实现的效果:
添加用户:
用户账号(输入)、用户名称(输入)、用户密码(输入)、用户类型(下拉)、用户单位名称(输入)、用户状态(单选)
用户类型:
前置条件(操作约束):
用户账号不允许重复
根据用户类型,输入单位名称必须存在对应的单位表
后置条件(数据库操作):
向sysuser表插入一条记录
分析开发:
Dao层:
向sysuser表插入一条记录
使用逆向工程生成的mapper实现。
具体实现:
SysuserMapper.java代码:
package yycg.base.dao.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import yycg.base.pojo.po.Sysuser; import yycg.base.pojo.po.SysuserExample; public interface SysuserMapper { int countByExample(SysuserExample example); int deleteByExample(SysuserExample example); int deleteByPrimaryKey(String id); int insert(Sysuser record);//主要是这句代码 int insertSelective(Sysuser record); ListselectByExample(SysuserExample example); Sysuser selectByPrimaryKey(String id); int updateByExampleSelective(@Param("record") Sysuser record, @Param("example") SysuserExample example); int updateByExample(@Param("record") Sysuser record, @Param("example") SysuserExample example); int updateByPrimaryKeySelective(Sysuser record); int updateByPrimaryKey(Sysuser record); }
SysuserMapper.xm代码:
<insert id="insert" parameterType="yycg.base.pojo.po.Sysuser" > insert into SYSUSER (ID, USERID, USERNAME, GROUPID, PWD, CONTACT, ADDR, EMAIL, USERSTATE, REMARK, CREATETIME, SEX, PHONE, MOVEPHONE, FAX, LASTUPDATE, VCHAR1, VCHAR2, VCHAR3, VCHAR4, VCHAR5, SYSID) values (#{id,jdbcType=VARCHAR}, #{userid,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR}, #{groupid,jdbcType=CHAR}, #{pwd,jdbcType=VARCHAR}, #{contact,jdbcType=VARCHAR}, #{addr,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{userstate,jdbcType=CHAR}, #{remark,jdbcType=VARCHAR}, #{createtime,jdbcType=TIMESTAMP}, #{sex,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{movephone,jdbcType=VARCHAR}, #{fax,jdbcType=VARCHAR}, #{lastupdate,jdbcType=VARCHAR}, #{vchar1,jdbcType=VARCHAR}, #{vchar2,jdbcType=VARCHAR}, #{vchar3,jdbcType=VARCHAR}, #{vchar4,jdbcType=VARCHAR}, #{vchar5,jdbcType=VARCHAR}, #{sysid,jdbcType=VARCHAR}) insert>
上面的这两个文件都是由逆向工程实现的,在配置时只要让Spring整合时去扫描这个包。就会注册在bean容器中,就可以使用了。
接下来写Service层代码:
Service层是要实现一些业务逻辑的,因为,这里是增加用户进数据库的行为,我们要对操作进行各种验证,比如,用户的账号只能唯一,如果账号重复就不能插入数据,
根据用户的输入的单位名称来查找在单位表中有没有这个单位,没有的话就出错,有的话就通过等等。
用到的接口及其实现类:
UserService.java:
package yycg.base.service; import java.util.List; import yycg.base.pojo.po.Sysuser; import yycg.base.pojo.po.Usergys; import yycg.base.pojo.po.Userjd; import yycg.base.pojo.po.Useryy; import yycg.base.pojo.vo.SysuserCustom; import yycg.base.pojo.vo.SysuserQueryVo; public interface UserService { // 查找用户 public ListfindSysuserCustom(SysuserQueryVo sysuserQueryVo) throws Exception; // 查找用户的总个数 public int findSysuserCount(SysuserQueryVo sysuserQueryVo) throws Exception; public void insertSysuser(SysuserCustom sysuserCustom) throws Exception; // 根据用户的id来查找用户。 public Sysuser findSysuerByUserid(String userid) throws Exception; // 根据供货商的名字来查找供货商信息 public Usergys findUsergesByMc(String mc) throws Exception; // 根据医院的名字来查找医院信息 public Useryy findUseryyByMc(String mc) throws Exception; // 根据监督单位的名称查询单位的信息。 public Userjd findUserJdByMc(String mc) throws Exception; }
UserServiceimpl.java:
package yycg.bae.service.impl; import java.util.List; import jsx3.gui.IFrame; import org.springframework.aop.ThrowsAdvice; import org.springframework.beans.factory.annotation.Autowired; import yycg.base.dao.mapper.SysuserMapper; import yycg.base.dao.mapper.SysuserMapperCustom; import yycg.base.dao.mapper.UsergysMapper; import yycg.base.dao.mapper.UserjdMapper; import yycg.base.dao.mapper.UseryyMapper; import yycg.base.pojo.po.Sysuser; import yycg.base.pojo.po.SysuserExample; import yycg.base.pojo.po.Usergys; import yycg.base.pojo.po.UsergysExample; import yycg.base.pojo.po.Userjd; import yycg.base.pojo.po.UserjdExample; import yycg.base.pojo.po.Useryy; import yycg.base.pojo.po.UseryyExample; import yycg.base.pojo.vo.SysuserCustom; import yycg.base.pojo.vo.SysuserQueryVo; import yycg.base.service.UserService; import yycg.util.UUIDBuild; public class userServiceimpl implements UserService { // 注入自定义的Mapper() @Autowired SysuserMapperCustom sysuserMapperCustom; // 注入Mapper(逆向工程生成的),这里生成了用户表的一系列查询。 @Autowired SysuserMapper sysuserMapper; // 三个单位的Mapper注入。只有注册了才能用里面的单表查询 // 供货商单位表 @Autowired UsergysMapper usergysMapper; // 监督单位 @Autowired UserjdMapper userjdMapper; // 医院单位表 @Autowired UseryyMapper useryyMapper; // 查询数据库中的记录。 @Override public ListfindSysuserCustom(SysuserQueryVo sysuserQueryVo) throws Exception { return sysuserMapperCustom.findSysuserList(sysuserQueryVo); } // 查询数据库中有几条记录的 @Override public int findSysuserCount(SysuserQueryVo sysuserQueryVo) throws Exception { return sysuserMapperCustom.findSysuserCount(sysuserQueryVo); } // 根据账号来查找用户找到就返回用户,找不到就返回null. public Sysuser findSysuerByUserid(String userid) throws Exception { // 生成自定义条件需要的Criteria SysuserExample sysuserExample = new SysuserExample(); SysuserExample.Criteria criteria = sysuserExample.createCriteria(); // 设置查询条件 criteria.andUseridEqualTo(userid); // 根据自定义的条件来查询 List list = sysuserMapper.selectByExample(sysuserExample); if (list != null && list.size() == 1) { return list.get(0); } else { return null; } } //根据监督单位的名称查询单位的信息。 public Userjd findUserJdByMc(String mc) throws Exception { // 生成自定义条件需要的Criteria UserjdExample userjdExample = new UserjdExample(); UserjdExample.Criteria criteria=userjdExample.createCriteria(); // 设置查询条件 criteria.andMcEqualTo(mc); // 根据自定义的条件来查询 List list=userjdMapper.selectByExample(userjdExample); if (list != null && list.size() == 1) { return list.get(0); } else { return null; } } //根据医院的名字来查找医院信息 public Useryy findUseryyByMc(String mc) throws Exception { // 生成自定义条件需要的Criteria UseryyExample useryyExample = new UseryyExample(); UseryyExample.Criteria criteria=useryyExample.createCriteria(); // 设置查询条件 criteria.andMcEqualTo(mc); // 根据自定义的条件来查询 List list=useryyMapper.selectByExample(useryyExample); if (list != null && list.size() == 1) { return list.get(0); } else { return null; } } //根据供货商的名字来查找供货商信息 public Usergys findUsergesByMc(String mc) throws Exception { // 生成自定义条件需要的Criteria UsergysExample usergysExample = new UsergysExample(); UsergysExample.Criteria criteria=usergysExample.createCriteria(); // 设置查询条件 criteria.andMcEqualTo(mc); // 根据自定义的条件来查询 List list=usergysMapper.selectByExample(usergysExample); if (list != null && list.size() == 1) { return list.get(0); } else { return null; } } @Override public void insertSysuser(SysuserCustom sysuserCustom) throws Exception { //参数的校验 //通用的参数合法性校验 Sysuser sysuser=findSysuerByUserid(sysuserCustom.getUserid()); //如果不等于空,就是账号重复了。给出一个警告。 if(sysuser!=null) { //包警告告诉到Action,可以再Aciton中捕获这个异常。 throw new Exception("账号重复"); } //根据用户类型,输入单位名称必须存在对应的单位表中 String groupid=sysuserCustom.getGroupid();//用户类型 String sysmc=sysuserCustom.getSysmc();//单位名称
//String userid=null;这里加上这么一句,下面的BUG就解决了。 if(groupid.equals("1")||groupid.equals("2")) { //监督单位 //根据单位名称查询单位的信息。 Userjd userjd=this.findUserJdByMc(sysmc); if(userjd==null) { throw new Exception("单位名称输入错误"); } //userid=userjd.getId(); 这里加上这么一句,下面的BUG就解决了。 } //卫生室 else if(groupid.equals("3")) { //根据单位名称查询单位的信息,查不到就报错 Useryy useryy=this.findUseryyByMc(sysmc); if(useryy==null) { throw new Exception("单位名称输入错误"); }
//userid=useryy.getId();这里加上这么一句,下面的BUG就解决了。 } else if(groupid.equals("4")){ Usergys usergys=this.findUsergesByMc(sysmc); if(usergys==null) { throw new Exception("单位名称错误"); }
//userid=usergys.getId();这里加上这么一句,下面的BUG就解决了。
} sysuserCustom.setId(UUIDBuild.getUUID());
/******************
sysuserCustom.setSysid(userid);//这里加上这么一句,下面的BUG就解决了。
*****************************/ //把数据插入到数据库 //刚开始的时候感到很奇怪,就是在SysuserMapper.xml中写着输入的参数是yycg.base.pojo.po.Sysuser //但是我这里输入的是sysuserCustom,明显不是Sysuser类型啊,其实是没有关系的,因为,这里的sysuserCustom //继承了Sysuser.所以Sysuser里面有的,在SysuserCustom里面都是有的的。
//上面的检验都通过后就把数据插入到数据库。 sysuserMapper.insert(sysuserCustom); } }
接下写Action层:
在这个层里面还要做的是捕获Servicec层里面的异常。这一点很重要。
Action主要做的调用Service层得到数据,然后转发数据。
这一层不能写业务逻辑代码,业务逻辑代码要写在Service层中。
这一层主要写两个函数,第一个是:添加用户界面。第二个是添加用户提交。
添加用户界面是当用户进来时,跳转到用户界面。
输入好用户信息后进入到添加用户提交函数,在这个函数里面调用Service层代码,把数据插入到数据库中。
具体代码如下:
//添加用户页面 @RequestMapping("/addsysuser") public String addsysuser(Model model) throws Exception { return "/base/user/addsysuser"; }
//添加用户提交 //提交的结果要转json到页面 //提交表单的数据一律使用包装类,这里我们用的是SysuserQueryVo //在SysuserQueryVo中包装了SysuserCustom @RequestMapping("/addsysusersubmit") public @ResponseBody Mapaddsysusersubmit(SysuserQueryVo sysuserQueryVo) throws Exception { //提示用户的信息。 String message="操作成功"; int type=0;//0表示成功,1表示失败。默认是成功的 try { //调用Service执行用户的添加。如果在Service层里面出现了异常,在这里进行捕获异常 userService.insertSysuser(sysuserQueryVo.getSysuserCustom()); } catch (Exception e) { e.printStackTrace(); message=e.getMessage(); type=1;//表示失败。 } //将执行结果返回到页面 Map result_map=new HashMap (); result_map.put("type", type); result_map.put("message", message); return result_map; }
调试增加页面:
在用户列表页面中,点击“添加”,打开添加页面。
来到添加页面:
在这里输入信息。
具体的实现如下:
在之前的queryuser.jsp页面中,有这么一段代码:
//定义 datagird工具
var toolbar_v = [ {//工具栏
id : 'btnadd',
text : '添加',
iconCls : 'icon-add',
handler : function() {
//打开一个窗口,用户添加页面
//参数:窗口的title、宽、高、url地址
createmodalwindow("添加用户信息", 800, 250, '${baseurl}user/addsysuser.action');
}
} ];
由 createmodalwindow("添加用户信息", 800, 250, '${baseurl}user/addsysuser.action');知道点击“添加”按钮,我们进入到这个Action中。然后来到了UserAction中的下的
//添加用户页面addsysuser @RequestMapping("/addsysuser") public String addsysuser(Model model) throws Exception { return "/base/user/addsysuser"; }
然后根据 return "/base/user/addsysuser";来到了addsysuser.jsp页面,就会出现
这个页面。
我们来研究一下addsysuser.jsp代码。
addsysuser.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ include file="/WEB-INF/jsp/base/tag.jsp"%> DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <LINK rel="stylesheet" type="text/css" href="${baseurl}js/easyui/styles/default.css"> <%@ include file="/WEB-INF/jsp/base/common_css.jsp"%> <%@ include file="/WEB-INF/jsp/base/common_js.jsp"%> <title>添加用户title> <script type="text/javascript"> function sysusersave(){ //准备使用jquery 提供的ajax Form提交方式 //将form的id传入,方法自动将form中的数据组成成key/value数据,通过ajax提交,提交方法类型为form中定义的method, //使用ajax form提交时,不用指定url,url就是form中定义的action //此种方式和原始的post方式差不多,只不过使用了ajax方式 //第一个参数:form的id //第二个参数:sysusersave_callback是回调函数,sysusersave_callback当成一个方法的指针 //第三个参数:传入的参数, 可以为空 //第四个参数:dataType预期服务器返回的数据类型,这里action返回json //根据form的id找到该form的action地址,按这个网址进行提交。 jquerySubByFId('userform',sysusersave_callback,null,"json"); } //ajax调用的回调函数,ajax请求完成调用此函数,传入的参数是action返回的结果 function sysusersave_callback(data){ //message_alert(data); alert(data.message); /* if(data.type=='0'){ $.messager.alert('提示信息',data.message,'success'); }else{ $.messager.alert('提示信息',data.message,'error'); } */ //action返回的是json数据 //如果是成功显示一个对号 //如果是错误信息 //提交结果类型 //data中存放的是action返回Resultinfo,有一个type /* var type=data.resultInfo.type; //结果提示信息 var message=data.resultInfo.message; //alert(message); if(type==0){ //如果type等于0表示失败,调用 jquery easyui的信息提示组件 $.messager.alert('提示信息',message,'error'); }else if(type==1){ $.messager.alert('提示信息',message,'success'); }else if(type==2){ $.messager.alert('提示信息',message,'warning'); }else if(type==3){ $.messager.alert('提示信息',message,'info'); } */ } script> head> <body> <form id="userform" action="${baseurl}user/addsysusersubmit.action" method="post"> <TABLE border=0 cellSpacing=0 cellPadding=0 width="100%" bgColor=#c4d8ed> <TBODY> <TR> <TD background=images/r_0.gif width="100%"> <TABLE cellSpacing=0 cellPadding=0 width="100%"> <TBODY> <TR> <TD> 系统用户信息TD> <TD align=right> TD> TR> TBODY> TABLE> TD> TR> <TR> <TD> <TABLE class="toptable grid" border=1 cellSpacing=1 cellPadding=4 align=center> <TBODY> <TR> <TD height=30 width="15%" align=right >用户账号:TD> <TD class=category width="35%"> <div> <input type="text" id="sysuser_userid" name="sysuserCustom.userid" /> div> <div id="sysuser_useridTip">div> TD> <TD height=30 width="15%" align=right >用户名称:TD> <TD class=category width="35%"> <div> <input type="text" id="sysuser_username" name="sysuserCustom.username" /> div> <div id="sysuser_usernameTip">div> TD> TR> <TR> <TD height=30 width="15%" align=right >用户密码:TD> <TD class=category width="35%"> <div> <input type="password" id="sysuser_password" name="sysuserCustom.pwd" /> div> <div id="sysuser_passwordTip">div> TD> <TD height=30 width="15%" align=right >用户类型:TD> <TD class=category width="35%"> <div> <select name="sysuserCustom.groupid" id="sysuser_groupid"> <option value="">请选择option> <option value="1">卫生局option> <option value="2">卫生院option> <option value="3">卫生室option> <option value="4">供货商option> <option value="0">系统管理员option> select> div> <div id="sysuser_groupidTip">div> TD> TR> <TR> <TD height=30 width="15%" align=right >用户单位名称:TD> <TD class=category width="35%"> <input type="text" name="sysuserCustom.sysmc" /> TD> <TD height=30 width="15%" align=right>用户状态:TD> <TD class=category width="35%"> <input type="radio" name="sysuserCustom.userstate" value="1" />正常 <input type="radio" name="sysuserCustom.userstate" value="0" />暂停 TD> TR> <tr> <td colspan=4 align=center class=category> <a id="submitbtn" class="easyui-linkbutton" iconCls="icon-ok" href="#" onclick="sysusersave()">提交a> <a id="closebtn" class="easyui-linkbutton" iconCls="icon-cancel" href="#" onclick="parent.closemodalwindow()">关闭a> td> tr> TBODY> TABLE> TD> TR> TBODY> TABLE> form> body> html>
输入数据后点击提交就可以执行。
流程如下:
点击提交,进入到sysusersave()函数。这个函数的解释如下:
jquerySubByFId('userform',sysusersave_callback,null,"json");
“userform”是表单的id,
sysusersave_callback是回调函数,执行完后会执行这个函数。
“json”表示返回的类型是从服务器返回到页面的数据类型是json格式。
上面做好后调试,出现了一个BUG。那就是
按照上面的页面输入数据,提交后,在查询adsasda之后出现所属单位是空。
原因分析:
在我们上面的userServiceimpl.java中
insertSysuser函数里面:
只设置了sysuer的主键id.并没有设置工作单位的id.所有应该加上sysuserCustom.setSysid(userid);这里的userid是单位的id,他是怎么来的呢?我们之前不是在if里面把
单位都查出来了吗?那么查他的主键id还难吗?具体修改方法上面已写。