今天在公司写测试代码,由于公司用的是ssh框架做的商城项目,我想先实现下简单的增删改查,奈何没有很好的后台页面(毕竟不能测试代码直接在他的项目里改啊)
所以想到了淘淘商城中有这个后台的管理页面,打算一试,奈何struts没学好,琢磨好几小时如何把json数据回传给easyui的页面,这里还是推荐大家用谷歌
后台页面使用的是easyui,直接放其中Customer添加页面和后台action的代码吧
customer-add.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <link 4 href="${fileUrlConfig.fileServiceUploadRoot}/zcg/js/kindeditor-4.1.10/themes/default/default.css" 5 type="text/css" rel="stylesheet"> 6 <script type="text/javascript" charset="utf-8" 7 src="${fileUrlConfig.fileServiceUploadRoot}/zcg/js/kindeditor-4.1.10/kindeditor-all-min.js"></script> 8 <script type="text/javascript" charset="utf-8" 9 src="${fileUrlConfig.fileServiceUploadRoot}/zcg/js/kindeditor-4.1.10/lang/zh_CN.js"></script> 10 <div style="padding:10px 10px 10px 10px"> 11 <!-- 这是个需要提交的表单,可以用来增加商品 --> 12 <form id="itemAddForm" class="itemForm" method="post"> 13 <table cellpadding="5"> 14 <!-- <tr> 15 <td>商品类目:</td> 16 <td> 17 <a href="javascript:void(0)" class="easyui-linkbutton selectItemCat">选择类目</a> 18 <input type="hidden" name="cid" style=" 280px;"></input> 19 </td> 20 </tr> --> 21 <tr> 22 <td>登录用户名:</td> 23 <td><input class="easyui-textbox" type="text" name="loginName" 24 data-options="required:true" style=" 280px;"></input></td> 25 </tr> 26 <tr> 27 <td>用户密码:</td> 28 <td><input class="easyui-textbox" type="password" 29 name="password" data-options="required:true" style=" 280px;"></input></td> 30 </tr> 31 <tr> 32 <td>昵称:</td> 33 <td><input class="easyui-textbox" type="text" name="nickName" 34 data-options="required:true" style=" 280px;"></input></td> 35 </tr> 36 <tr> 37 <td>手机号:</td> 38 <td><input class="easyui-textbox" type="text" name="phone" 39 data-options="required:true" style=" 280px;"></input></td> 40 </tr> 41 <tr> 42 <td>邮箱:</td> 43 <td><input class="easyui-textbox" type="text" name="email" 44 data-options="required:true" style=" 280px;"></input></td> 45 </tr> 46 <tr> 47 <td>头像地址:</td> 48 <td><input class="easyui-textbox" type="text" name="photoUrl" 49 data-options="required:true" style=" 280px;"></input></td> 50 </tr> 51 <!-- <tr> 52 <td>上传头像:</td> 53 <td><a href="javascript:void(0)" 54 class="easyui-linkbutton picFileUpload">上传图片</a> <input 55 type="hidden" name="image" /></td> 56 </tr> --> 57 <tr> 58 <td style="text-align:left;">会员类型:</td> 59 <td style="text-align:left"> 60 <span class="radioSpan"> 61 <input type="radio" name="type" value="1">采购商</input> 62 <input type="radio" name="type" value="2">供应商</input> 63 </span> 64 </td> 65 </tr> 66 <tr> 67 <td style="text-align:left;">分享类型:</td> 68 <td style="text-align:left"> 69 <span class="radioSpan"> 70 <input type="radio" name="shareType" value="1">普通会员</input> 71 <input type="radio" name="shareType" value="2">超级终端</input> 72 <input type="radio" name="shareType" value="3">个人分销商</input> 73 <input type="radio" name="shareType" value="4">县市分销商</input> 74 <input type="radio" name="shareType" value="5">省级分销商</input> 75 <input type="radio" name="shareType" value="6">操盘手(店铺代运营)</input> 76 77 </span> 78 </td> 79 </tr> 80 <tr> 81 <td style="text-align:left;">商品交易状态:</td> 82 <td style="text-align:left"> 83 <span class="radioSpan"> 84 <input type="radio" name="isCanBuy" value="1">可以采购</input> 85 <input type="radio" name="isCanBuy" value="2">不采购</input> 86 </span> 87 </td> 88 </tr> 89 <tr> 90 <td>支付密码:</td> 91 <td><input class="easyui-textbox" type="password" 92 name="payPassword" data-options="required:true" style=" 280px;"></input></td> 93 </tr> 94 <tr> 95 <td>微信公众号:</td> 96 <td><input class="easyui-textbox" type="text" name="openid" 97 data-options="required:true" style=" 280px;"></input></td> 98 </tr> 99 </table> 100 <input type="hidden" name="itemParams" /> 101 </form> 102 <div style="padding:5px"> 103 <a href="javascript:void(0)" class="easyui-linkbutton" 104 onclick="submitForm()">提交</a> <a href="javascript:void(0)" 105 class="easyui-linkbutton" onclick="clearForm()">重置</a> 106 107 </div> 108 </div> 109 <script type="text/javascript"> 110 //提交表单 111 function submitForm() { 112 debugger; 113 //有效性验证 114 if (!$('#itemAddForm').form('validate')) { 115 $.messager.alert('提示', '表单还未填写完成!'); 116 return; 117 } 118 $.post("/zcg/customersave.action", $("#itemAddForm").serialize(), function(data) { 119 if (data.status == 200) { 120 $.messager.alert('提示', '新增用户成功!'); 121 } 122 }); 123 } 124 125 function clearForm() { 126 $('#itemAddForm').form('reset'); 127 itemAddEditor.html(''); 128 } 129 </script>
如上述代码可见,我这里使用了ajax提交了表单之后等待后台回传个带有状态码的json数据,这样就能调用easyui页面中的ajax响应弹窗,从而完成交互
但是在网上查了好久都没找到几个靠谱的方法,要么讲的太乱……
action的代码
1 package shop.hellxz.action; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.HashMap; 6 import java.util.Map; 7 8 import javax.json.Json; 9 10 import org.apache.struts2.json.JSONUtil; 11 import org.springframework.web.bind.annotation.ResponseBody; 12 13 import com.alibaba.fastjson.JSON; 14 15 import cn.emay.slf4j.helpers.Util; 16 import shop.zhangchenguang.pojo.Customer2; 17 import shop.zhangchenguang.service.CustomerService; 18 import util.action.BaseAction; 19 import util.other.Utils; 20 21 /** 22 * 测试代码Action 23 * @author Hellxz 24 * 25 */ 26 public class CustomerAction extends BaseAction{ 27 28 //注入service层 29 private CustomerService customerServiceImpl; 30 //需要写get、set方法 31 public CustomerService getCustomerServiceImpl() { 32 return customerServiceImpl; 33 } 34 public void setCustomerServiceImpl(CustomerService customerServiceImpl) { 35 this.customerServiceImpl = customerServiceImpl; 36 } 37 //跳转到主页 38 public String index() throws IOException{ 39 return "success"; 40 } 41 //保存用户信息 42 public void customerSave() throws IOException{ 43 //获取输出流 44 response.setContentType("json/application;charset=UTF-8"); 45 PrintWriter out = response.getWriter(); 46 //获取传入数据对象 47 Customer2 customer = new Customer2(); 48 customer.setLoginName(request.getParameter("loginName")); 49 customer.setPassword(request.getParameter("password")); 50 customer.setNickName(request.getParameter("nickName")); 51 customer.setPhone(request.getParameter("phone")); 52 customer.setEmail(request.getParameter("email")); 53 customer.setPhotoUrl(request.getParameter("photoUrl")); 54 customer.setType(Integer.parseInt(request.getParameter("type"))); 55 customer.setShareType(Integer.parseInt(request.getParameter("shareType"))); 56 customer.setIsCanBuy(Integer.parseInt(request.getParameter("isCanBuy"))); 57 customer.setPayPassword(request.getParameter("payPassword")); 58 customer.setOpenId(request.getParameter("openid")); 59 //补全数据……还没写 60 //调用service保存对象 61 Object obj = customerServiceImpl.saveOrUpdateObject(customer); 62 /** 63 * 如果保存的对象是非空的,那么已经保存成功 64 * 如果为空,则保存失败 65 * 无论保存成功那个与否,都要把json对象写回给客户端,进行判断 66 */ 67 if(Utils.objectIsNotEmpty(obj)){ 68 out.println(JSON.toJSONString(checkOK())); 69 }else{ 70 out.println(JSON.toJSONString(checkFail())); 71 } 72 } 73 /** 74 * @return json对象状态200 75 */ 76 @SuppressWarnings({"unchecked","rawtypes"}) 77 public Object checkOK(){ 78 Map m = new HashMap<>(); 79 m.put("status", 200); 80 m.put("msg", "添加成功"); 81 m.put("data", null); 82 return m; 83 } 84 /** 85 * @return json对象状态500 86 */ 87 @SuppressWarnings({"unchecked","rawtypes"}) 88 public Object checkFail(){ 89 Map m = new HashMap<>(); 90 m.put("status", 500); 91 m.put("msg", "添加失败"); 92 m.put("data", null); 93 return m; 94 } 95 96 }
附上struts的配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="zcg" namespace="/zcg" extends="basePackage"> <action name="index" class="shop.hellxz.action.CustomerAction" method="index"> <interceptor-ref name="baseStack"/> <result name="success">/WEB-INF/hellxz/jsp/index.jsp</result> </action> <action name="*-*" class="shop.hellxz.action.SendAction"> <result name="send">/WEB-INF/hellxz/jsp/{1}-{2}.jsp</result> </action> <action name="customersave" class="shop.hellxz.action.CustomerAction" method="customerSave"> </action> </package> </struts>
到这里大家可能明白是怎么实现的了,老规矩捋一下流程:
1、在struts配置文件中让表单提交的请求响应到action中,不需要定义result,
2、响应进来之后,我们定义的方法需要设置void返回值,在方法体就可以通过老办法 request.getParameter()方法获取这些表单中的参数,然后放到pojo中持久化
3、持久化成功会返回一个新的对象,判断这个对象是否为空,然后通过这个结果来对应应该用到的检查方法,这里使用了alibaba的Fastjson中的JSON对象的toJsonString()方法来实现把对象转换成json串
4、通过response.getWriter()方法拿到的输出流,我们使用println()方法打印出来那个json串给浏览器端
5、浏览器端的ajax收到带有状态码200的json串,弹窗提示用户存储成功
说着简单,其实就是jsp和servlet时候常用的方法,springmvc用习惯了,反而忘了最基本的方法,罪过罪过。