本周做Jquery Ajax+json+strut2实现二级级联查询总结心得

本周应组长要求做Jquery Ajax+json+strut2实现二级级联查询

中间走了不少弯路,一度“卡壳”,好几次纠结被批评,但是没办法啊,做的不熟练,好多技术第一次使用,唉,失败是成功之母,失败了百儿八十遍,总算任务做好了。

下面总结一下本周的心得。

首先,需求是,要实现  cms新改版需求,要 查询一个二级目录,根据登录用户的操作权限,来加载这个二级目录结构。 得到二级目录结构后,再用选中的菜单ID

用ajax去后台查询出该菜单的子节点。获取了子节点也是要根据登录用户的操作的范围确定的,这里面牵涉到一个权限判断问题。

我首先是先做ajax的准备,网上是有好多的ajax示例,但是真正写的完美的实在不多,没有几个,而且大部分人的java运行环境千差万别。别人用的好的,自己不一定用着

好用,所以,我只好慢慢的筛选适合自己的。最后选择了几个Struts2+Jquery+ajax+json方法实现

网上有好多说让配置 struts.xml,我们的项目是用struts.xml include单独子配置做的,所以,我在子xml里面写个 cascadeManager.xml然后在里面写个包名

包继承 json-default,然后在action 里配置个result 让它type="json",然后在后台写接收处理请求,最后用json、封装一下,输出。return SUCCESS

额,最后试验结果,不好用。看来,网上的例子也不是 “万能钥匙”,照搬照抄也不一定管用啊。

想来想去,配置来配置去,一直找不到,反正就是无法 用struts配置文件配置json

网上好多说它继承什么什么,其实查查资料才知道  json-default.xml其实也是继承自 struts-default.xml的,唉,我竟然还在package里面继承了两个都继承了。

只是json-default.xml里面做了一些微量的修改操作。唉,反正不好用,就不研究它了,后来换了一种思路,既然 ajax请求是无刷新,我只要在 action里面返回就行了,不一定

在配置里面配置,于是,我就把struts.xml搁置了,直接去action里面用json封装后直接  response.getWrite().print()出来了。

这个方法还算给力,总算是取到值了,后来在前台用alert 显示一下,全是Object,object对象,额,当时傻眼了,感觉在其他地方遇到过,又修改了N久,最后才发现,本来返回的

json到了接收页就是显示的Object,好吧,用 struts标签 迭代器迭代出来,数据。总算显示了。

ajax请求是没问题了,但是后台业务处理还不行啊,什么权限什么的都没有配置呢,于是又攻后台。

后台业务处理无怪乎,if else权限判断什么的

最麻烦的是那个 Hashtable  ,枚举类型, 迭代器等,这些技术以前都用的少啊,没办法,研究着做吧,又是花了N久时间,老大都气的不得了了,这辈子也很少见

做事这么磨蹭的啊,公司耗不起啊,唉,批评来批评去的,但是还是慢慢的做,做了好几次感觉自己做好了,可是检查后发现又有问题,哎,我去,烦啊

下午是又困又乏,没办法,赶时间中午都没有睡,还是最后咬牙弄好了,当然了,中间又好几次给组长请教。

这周又过去了,仔细回味一下,这周做的东西真不多,而且还浪费了好多时间,这让我实在是汗颜,技术不行可以自己去提高,最怕的是我这天生的懒惰,又怕思考又

贪玩的人,唉,自我勉励下吧,希望从此以后慢慢改变自己的不好的习惯,不要老是钻牛角尖,做一个高效益的程序开发人员。

今天想到一个司马迁的话。作为我以后处理事情的座右铭:“穷则变,变则通,通则久。”

 

 

jsp ajax代码

 

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
    <%@ page import="com.ow.cms.web.commons.Constance"%>
<%@ page import="com.ow.cms.web.operationmanager.Permissions"%>
<%@ page import="com.ow.cms.datamodel.CmsUser"%>
<%@ page import="java.util.Hashtable" %>
<%@ page import="java.util.Iterator" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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=GBK">
<title>cascadeTest</title>
<script src="/cms/js/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
function loadCategoryChild(val) //带参的方法   
{  
 //检测是否该方法可用 


 var url="executeAjax.action";
 var parentId=val;
 if (parentId==0)
return false;
 var params = {'parentId':parentId};
 $.post(url ,params, function(result){
//console.log(result);
 
var objs=eval("("+result+")"); //解析json对象  
var child=$("#child_id");   

child.empty(); //初始化否则会追加   
child.append("<option>子栏目</option>"); 
for(var i=0;i<objs.length;i++){        
child.append("<option value='"+objs[i].id+"'>"+objs[i].nodeName+"</option>"); 
   }    
}
 
 ); 
 

</script>
</head>
<body>
<div>
&nbsp;&nbsp;
</div>
<div style="height: 100;color: green;background-color: lightblue" >
  &nbsp;
</div>
<p>
 <hr/>
</p>
<div>
&nbsp;
</div>


<div class="bodytitle">
<div class="bodytitleleft"></div>
<div style="color: red;" >
栏目管理
</div>
   <div>
   <!-- 下拉列表实现级联,选择其中一个栏目,动态加载实现其子栏目 -->
<select name="node_name" id="node_id" οnchange="loadCategoryChild(this.options[this.options.selectedIndex].value)">
<option value="0">请选择</option>
<s:iterator value="#request.list" status="statu" id="item">  
  <option value="<s:property value="id"/>"><s:property value="nodeName"/></option>       
</s:iterator>
</select>


<select name="child_name" id="child_id">      
<option value="0">请选择</option>
</select>   
</div>
</div>


<div>
&nbsp;&nbsp;
</div>
<div style="height: 100;color: green;background-color: lightblue" >
  &nbsp;
</div>


 <hr/>


<div>
&nbsp;
</div>
<form name="f">
<table width="96%" border="0" cellpadding="5" cellspacing="1" align="center" class="tbtitle" style="background:#C4E7FB;">
<tr>
<td colspan="6" bgcolor="#E8F7FF">
底部内容
</td>
</tr>
</table>
</form>


</body>
</html>

 

后台action代码:

 

package com.cascadetest.action;


import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONObject;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;


import com.cascadetest.service.ICascadeService;
import com.opensymphony.xwork2.ActionSupport;
import com.ow.cms.datamodel.CmsNode;
import com.ow.cms.datamodel.CmsUser;
import com.ow.cms.datamodel.GoodsCategory;
import com.ow.cms.exception.AppException;
import com.ow.cms.exception.DAOException;
import com.ow.cms.util.spring.SpringBeanUtil;
import com.ow.cms.web.commons.Constance;
import com.ow.cms.web.goodsmanager.service.IGoodsCategoryManagerService;
import com.ow.cms.web.nodemanager.service.INodeManagerService;
import com.ow.cms.web.nodemanager.service.NodeManagerServiceImpl;
import com.ow.cms.web.operationmanager.Permissions;


public class CascadeAction extends ActionSupport{


private static final long serialVersionUID = 1L;
private String result;


public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}

public String executeAjax() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
CmsUser cmsUser = (CmsUser) session.getAttribute(Constance.SYS_CMS_USER);
if (cmsUser == null) {
this.addActionMessage("<a οnclick='window.parent.opener=null;window.top.close();' href='../loginAction.action?action=logout' target='_blank'>您还没有登陆请先登陆</a>!");
return "sysmessage";
}
Permissions per = new Permissions();
boolean flag = per.hasPermissions(cmsUser, "OP_CMS_CascadeTest");
if (!flag) {
request.setAttribute("error", Constance.NO_PERMISSIONS);
return INPUT;
}
try {
Integer id =Integer.parseInt( request.getParameter("parentId"));
//ICascadeService service1 = (ICascadeService) SpringBeanUtil.getBean("");
INodeManagerService service = (INodeManagerService) SpringBeanUtil.getBean("nodeManagerService");
Permissions dao = new Permissions();
//Hashtable<Object, Object> hs = service.getUserNode(cmsUser.getId().toString());
List lists =new ArrayList();
//判断是否是管理员 
if (dao.checkIsSysAdmin(cmsUser.getId().toString())){

//获取根目录下对应的子栏目
lists = service.getChild(id);
}
else{
//根据栏目ID查找子栏目 
lists = service.getChildNodeByUserId(id, cmsUser.getId());
}
//根据栏目ID查找子栏目

if(lists!=null&&lists.size()>0){
StringBuffer json = new StringBuffer();      
          json.append("["); 
       for(int i=0;i<lists.size();i++){
       CmsNode cmsNode = new CmsNode();
       cmsNode = (CmsNode) lists.get(i);       


       json.append('{');             
      json.append("id:").append(cmsNode.getId()).append(",");      
      json.append("nodeName:").append("'").append(cmsNode.getNodeName().trim()).append("'");      
      json.append("},");           
      }           
      json.deleteCharAt(json.length() - 1);     
      json.append("]");    
      result = json.toString();//给result赋值,传递给页面
       }
 response.getWriter().print(result);
 
 response.getWriter().close();

    
/*String json="[";
     for(Object obj:lists){
       json=json+"{"+obj+"}";
     }
     json=json+"]";
    
    // JSONObject json = JSONObject.fromObject(list);//将list对象转换成json类型数据
    System.out.println(json);
    result=json;
   response.getWriter().print(result);    */



} catch (Exception e) {
// TODO: handle exception
}
       
       return null;
}

public String cascadeTestList() throws AppException{
//用户操作权限控制
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
CmsUser cmsUser = (CmsUser) session
.getAttribute(Constance.SYS_CMS_USER);


if (cmsUser == null) {
this.addActionMessage("<a οnclick='window.parent.opener=null;window.top.close();' href='../loginAction.action?action=logout' target='_blank'>您还没有登陆请先登陆</a>!");
return "sysmessage";
}
Permissions per = new Permissions();
boolean flag = per.hasPermissions(cmsUser, "OP_CMS_CascadeTest");
if (!flag) {
request.setAttribute("error", Constance.NO_PERMISSIONS);
return INPUT;
}

//加载时候赋初始值
INodeManagerService service = (INodeManagerService)  SpringBeanUtil.getBean("nodeManagerService");
//ICascadeService service = (ICascadeService) SpringBeanUtil.getBean("cascadeManagerService");
List list =new ArrayList();
Permissions dao = new Permissions();
StringBuffer sb = new StringBuffer();
String path=request.getContextPath();
//判断是不是超级管理员权限
try {
if (dao.checkIsSysAdmin(cmsUser.getId().toString())){
Integer id = 2001;
//获取根目录下对应的子栏目
list = service.getChild(id);
request.setAttribute("list",list);
}
else{
Integer userId = cmsUser.getId();
//Integer id =2001;
List listLevel3 = service.getNodeLevel3ByuserID(userId);

Hashtable uht =   service.getUserNode(userId.toString());
// 加上没有权限的父结点
Enumeration en = uht.keys();
while (en.hasMoreElements()) {
CmsNode cn1 = (CmsNode) uht.get(en.nextElement());
CmsNode cn2 = service.getCmsNodeByID(cn1.getParentId());
if (cn2 != null) {
uht.put(cn2.getId(), cn2);
}
}
//uht现在是所有需要显示的节点了
Iterator it = listLevel3.iterator();
while (it.hasNext()) {
Map map = (Map) it.next();
Integer id = (Integer) map.get("id");
if (!id.equals(0)) {
CmsNode cn = service.getCmsNodeByID(id);
//this.getNodeString2(sb,"", cn, rootPath, uht, user);
list.add(cn); 
}
}
request.setAttribute("list", list);
/*for(int i=0;i<listLevel2.size();i++){
Map idMap = (Map) listLevel2.get(i);

//Integer id = (Integer) idMap.get("id");

//CmsNode node = service.getCmsNodeByID(id);
//list.add(node);
}*/


}

} catch (DAOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return "cascadeTestList";

}
}

 

转载于:https://www.cnblogs.com/qianmo/p/3473693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值