在工作主页中的“我要投诉”,点击后弹出,投诉的新增页面,保存后到投诉受理后台管理进行处理。在这边添加时候需要使用到Ajax根据部门名称级联查询部门人员;查询到部门对应的人员列表后,需要将这些人员信息转换为json字符串。


1、HomeAction


(1)按照讲义中写的应该是引入3个jar,分别是:

commons-beanutils-1.8.0.jar

ezmorph-1.0.6.jar

json-lib-2.3-jdk15.jar

我猜测,是为了进行JSON转换,但我写代码并没有成功

publicvoidgetUserJson(){try{//1、获取部门Stringdept=ServletActionContext.getRequest().getParameter("dept");if(StringUtils.isNotBlank(dept)){QueryHelperqueryHelper=newQueryHelper(User.class,"u");queryHelper.addCondition("u.deptlike?","%"+dept);//2、根据部门查询用户列表List<User>userList=userService.findObjects(queryHelper);//创建Json对象JSONObjectjso=newJSONObject();jso.put("msg","success");jso.accumulate("userList",userList);//3、输出用户列表以json格式字符串形式输出HttpServletResponseresponse=ServletActionContext.getResponse();response.setContentType("text/html");ServletOutputStreamoutputStream=response.getOutputStream();outputStream.write(jso.toString().getBytes("utf-8"));outputStream.close();}}catch(Exceptione){e.printStackTrace();}}

之后,我只能用gson来完成,当我想删除添加之前添加的jar包时,却无法删除,因此也没有办法判断这几个jar包对JSON字符串的功能


(2)使用struts2-json-plugin-2.x.jar 包,由struts将action中的变量组装成Json对象。


HomeAction.java

packagecom.rk.home.action;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.sql.Timestamp;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.annotation.Resource;importjavax.servlet.ServletOutputStream;importjavax.servlet.http.HttpServletResponse;importnet.sf.json.JSONObject;importorg.apache.commons.lang3.StringUtils;importorg.apache.struts2.ServletActionContext;importcom.google.gson.Gson;importcom.google.gson.GsonBuilder;importcom.opensymphony.xwork2.Action;importcom.opensymphony.xwork2.ActionSupport;importcom.rk.core.entity.JsonResult;importcom.rk.core.utils.QueryHelper;importcom.rk.tax.entity.Complain;importcom.rk.tax.entity.User;importcom.rk.tax.service.ComplainService;importcom.rk.tax.service.UserService;publicclassHomeActionextendsActionSupport{privateMap<String,Object>return_map;privateComplaincomp;@ResourceprivateUserServiceuserService;@ResourceprivateComplainServicecomplainService;//跳转到首页@OverridepublicStringexecute()throwsException{return"home";}//跳转到我要投诉publicStringcomplainAddUI(){return"complainAddUI";}publicvoidgetUserJson(){try{//1、获取部门Stringdept=ServletActionContext.getRequest().getParameter("dept");if(StringUtils.isNotBlank(dept)){QueryHelperqueryHelper=newQueryHelper(User.class,"u");queryHelper.addCondition("u.deptlike?","%"+dept);//FIXME这里为什么是%+dept呢?//2、根据部门查询用户列表List<User>userList=userService.findList(queryHelper);//创建Json对象JsonResultresult=newJsonResult();result.setStatus(JsonResult.SUCCESS);result.setData(userList);Gsongson=newGsonBuilder().setDateFormat("yyyy-MM-dd").create();StringstrJson=gson.toJson(result);//3、输出用户列表,以JSON格式字符串形式输出HttpServletResponseresponse=ServletActionContext.getResponse();response.setContentType("text/html");ServletOutputStreamoutputStream=response.getOutputStream();outputStream.write(strJson.getBytes("utf-8"));outputStream.close();}}catch(Exceptione){e.printStackTrace();}}publicStringgetUserJson2(){//1、获取部门Stringdept=ServletActionContext.getRequest().getParameter("dept");if(StringUtils.isNotBlank(dept)){QueryHelperqueryHelper=newQueryHelper(User.class,"u");queryHelper.addCondition("u.deptlike?","%"+dept);//2、根据部门查询用户列表return_map=newHashMap<String,Object>();return_map.put("status","success");return_map.put("data",userService.findList(queryHelper));}returnAction.SUCCESS;}//保存投诉publicvoidcomplainAdd(){try{if(comp!=null){//设置默写投诉状态为待受理comp.setState(Complain.COMPLAIN_STATE_UNDONE);comp.setCompTime(newTimestamp(newDate().getTime()));complainService.save(comp);//输出投诉结果HttpServletResponseresponse=ServletActionContext.getResponse();response.setContentType("text/html");ServletOutputStreamoutputStream=response.getOutputStream();outputStream.write("success".getBytes("utf-8"));outputStream.close();}}catch(Exceptione){e.printStackTrace();}}publicMap<String,Object>getReturn_map(){returnreturn_map;}publicvoidsetReturn_map(Map<String,Object>return_map){this.return_map=return_map;}publicComplaingetComp(){returncomp;}publicvoidsetComp(Complaincomp){this.comp=comp;}}


JsonResult.java

packagecom.rk.core.entity;importcom.google.gson.Gson;importcom.google.gson.GsonBuilder;publicclassJsonResult{privateStringstatus;privateObjectdata;publicstaticfinalStringOK="ok";publicstaticfinalStringSUCCESS="success";publicstaticfinalStringERROR="error";publicStringgetStatus(){returnstatus;}publicvoidsetStatus(Stringstatus){this.status=status;}publicObjectgetData(){returndata;}publicvoidsetData(Objectdata){this.data=data;}@OverridepublicStringtoString(){//Gsongson=newGsonBuilder().setDateFormat("yyyy-MM-ddHH:mm:ss").create();Gsongson=newGsonBuilder().setDateFormat("yyyy-MM-dd").create();returngson.toJson(this);}}


struts-home.xml

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><packagename="home_package"namespace="/sys"extends="base-default"><actionname="home_*"class="com.rk.home.action.HomeAction"method="{1}"><resultname="home">/WEB-INF/jsp/home/home.jsp</result><resultname="{1}">/WEB-INF/jsp/home/{1}.jsp</result></action><actionname="login_*"class="loginAction"method="{1}"><resultname="{1}">/WEB-INF/jsp/{1}.jsp</result><resultname="loginUI">/WEB-INF/jsp/loginUI.jsp</result><resultname="noPermissionUI">/WEB-INF/jsp/noPermissionUI.jsp</result><resultname="home"type="redirectAction"><paramname="actionName">home</param></result><resultname="toLoginUI"type="redirectAction"><paramname="actionName">toLoginUI</param></result></action></package><packagename="sysHomeJson-action"namespace="/sys"extends="json-default"><actionname="home_getUserJson2"class="com.rk.home.action.HomeAction"method="getUserJson2"><resulttype="json"><paramname="root">return_map</param></result></action></package></struts>


知识点(1):json-default

struts2-json-plugin-2.3.29.jar内有一个struts-plugin.xml文件

在struts-plugin.xml文件中定义了json-default,而它继承自struts-default包。struts-plugin.xml文件内容如下:

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><packagename="json-default"extends="struts-default"><result-types><result-typename="json"class="org.apache.struts2.json.JSONResult"/><result-typename="jsonActionRedirect"class="org.apache.struts2.json.JSONActionRedirectResult"/></result-types><interceptors><interceptorname="json"class="org.apache.struts2.json.JSONInterceptor"/><interceptorname="jsonValidation"class="org.apache.struts2.json.JSONValidationInterceptor"/><!--SampleJSONvalidationstack--><interceptor-stackname="jsonValidationWorkflowStack"><interceptor-refname="basicStack"/><interceptor-refname="validation"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-refname="jsonValidation"/><interceptor-refname="workflow"/></interceptor-stack></interceptors></package></struts>


注意:<pagekage>中的extends="base-default",如果有多个,中间可以用“,”分隔。

<package name="" extends="json-default,struts-default">

这样的继承,要确保父包里面不能有重复的 action名,要不然,子包不知道 调用那个。


2、JSP页面


在主页面home.jsp中添加链接,会在空白页面打开

<s:aaction="home_complainAddUI"namespace="/sys"target="_blank">我要投诉</s:a>


complainAddUI.jsp

<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><%@includefile="/common/header.jsp"%><title>我要投诉</title><scripttype="text/javascript"src="${basePath}/js/ueditor/ueditor.config.js"></script><scripttype="text/javascript"src="${basePath}/js/ueditor/ueditor.all.js"></script><scripttype="text/javascript"src="${basePath}/js/ueditor/lang/zh-cn/zh-cn.js"></script><scripttype="text/javascript">window.UEDITOR_HOME_URL="${basePath}/js/ueditor";window.onload=function(){varue=UE.getEditor("editor");}//根据部门查询该部门下的用户列表functiondoSelectDept(){//1、获取部门vardept=$('#toCompDeptoption:selected').val();if(dept!=""){//2、根据部门查询列表$.ajax({url:"${basePath}/sys/home_getUserJson2.action",data:{"dept":dept},type:"post",dataType:"json",//返回数据类型success:function(result){//2.1、将用户列表设置到被投诉人下拉框中if(result!=null&&result!=""&&result!=undefined){if("success"==result.status){vartoCompName=$('#toCompName');toCompName.empty();$.each(result.data,function(index,user){toCompName.append("<optionvalue='"+user.name+"'>"+user.name+"</option>");});}else{alert("获取被投诉人列表失败");}}else{alert("被投诉人列表似乎不存在");}},error:function(){alert("获取被投诉人列表:AJAX请求失败!");}});}else{//清空被投诉人列表下拉框$('#toCompName').empty();}}//提交表单functiondoSubmit(){//1、提交表单并保存$.ajax({url:"${basePath}/sys/home_complainAdd.action",data:$('#form').serialize(),type:"post",ansy:false,success:function(result){if(result=="success"){//2、提示用户投诉成功alert("投诉成功!");//3、刷新父窗口window.opener.parent.location.reload(true);//4、关闭当前窗口window.close();}else{alert("投诉失败!");}},error:function(){alert("投诉:AJAX请求失败");}});}</script></head><body><formid="form"name="form"action=""method="post"enctype="multipart/form-data"><divclass="vp_d_1"><div>&nbsp;&nbsp;&nbsp;&nbsp;</div><divclass="vp_d_1_1"><divclass="content_info"><divclass="c_crumbs"><div><b></b><strong>工作主页</strong>&nbsp;-&nbsp;我要投诉</div></div><divclass="tableH2">我要投诉</div><tableid="baseInfo"width="100%"align="center"class="list"border="0"cellpadding="0"cellspacing="0"><tr><tdclass="tdBg"width="250px">投诉标题:</td><td><s:textfieldname="comp.compTitle"/></td></tr><tr><tdclass="tdBg">被投诉人部门:</td><td><s:selectid="toCompDept"name="user.dept"list="#{'':'请选择','部门A':'部门A','部门B':'部门B'}"onchange="doSelectDept()"></s:select></td></tr><tr><tdclass="tdBg">被投诉人姓名:</td><td><selectid="toCompName"name="comp.toCompName"></select></td></tr><tr><tdclass="tdBg">投诉内容:</td><td><s:textareaid="editor"name="comp.compContent"cssStyle="width:90%;height:160px;"/></td></tr><tr><tdclass="tdBg">是否匿名投诉:</td><td><s:radioname="comp.isAnonymous"list="#{'false':'非匿名投诉','true':'匿名投诉'}"value="true"/></td></tr></table><s:hiddenname="comp.compCompany"value="%{#session.SYS_USER.dept}"/><s:hiddenname="comp.compName"value="%{#session.SYS_USER.name}"/><s:hiddenname="comp.compMobile"value="%{#session.SYS_USER.mobile}"/><divclass="tcmt20"><inputtype="button"class="btnB2"value="保存"onclick="doSubmit()"/>&nbsp;&nbsp;&nbsp;&nbsp;<inputtype="button"onclick="javascript:window.close()"class="btnB2"value="关闭"/></div></div></div><div>&nbsp;&nbsp;&nbsp;&nbsp;</div></div></form></body></html>


知识点(1):获取select的值

vardept=$('#toCompDeptoption:selected').val();


知识点(2):清空、迭代

vartoCompName=$('#toCompName');toCompName.empty();$.each(result.data,function(index,user){toCompName.append("<optionvalue='"+user.name+"'>"+user.name+"</option>");});


知识点(3):原窗口的刷新

window.opener.parent.location.reload(true);

知识点(4):表单元素的序列化

$('#form').serialize()