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久,最后才发现,本来返回的

 

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” onchange=”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 onclick=’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 onclick=’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”;

 

}

}