struts2+json+jquery 二级联动 例子

 struts2.1.X 版本中已经把ajax 主题移到了dojo-plugin 插件中,用法也有所改变,据网上评论struts2 中的ajax 主题效率有点低,不建议使用,在项目中刚好要使用,记录下。。 

 说明下 <#list> 是FreeMarker 的循环标签,项目中用到了FreeMarker  不过在这不影响理解。

 

在加option 节点的时候有几个问题:

现象一,用方法objSelect.appendChild(objOpiton)给select添加option时,添加有出现列表项,但是显示空白,IE下的现象。        

 现象二,用objSelect.add(objOpiton)添加option,FF下不支持。

 

这里也有几种方法介绍:

createElement(name) 方法可创建元素节点。此方法可返回一个 Element 对象。
参数name 字符串值,这个字符串可为此元素节点规定名称。如果 name 参数中含有不合法的字符,该方法将
抛出代码为 INVALID_CHARACTER_ERR 的 DOMException 异常。
appendChild(newchild) 方法可向节点的子节点列表的末尾添加新的子节点。
Internet Explorer 会忽略节点间生成的空白文本节点(例如,换行符号),而 Mozilla 不会这样做。
例子:
// 生成一下拉框
var new_select = document.createElement('SELECT');
new_select.onchange = function() { itemtree_cats_change(this); };
// 生成选取项
1) 用createElement方法
var opt = document.createElement('OPTION');
new_select.appendChild(opt);
2) 用 new 的方法
new_select.options[new_select.options.length] = new Option('', '');
在iE7下, 第一种方法可以成功,没什么意外,在ie6和firefox下,不行,没有option出现在select中
在ie7,ie6,firefox下, 第二种方法都能正常显示.

 

 

input.jsp

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jeecms-main</title>
<script type="text/javascript" src="../banner/js/jquery-1.2.6.js"></script>
<script type="text/javascript">
$(getsort);
function getsort(){
	var pid=$("#bpid").val();
	var time=new Date();
	$.ajax({
		cache:false,
		url:'ajax_findSort.action',
		type:'post',
		dataType:'json',
		data:{pid:pid,t:time},
		success:update_c
	});
}
function update_c(json){
	var sort=json.sort;
	var cbanner=json.cbanner;
	var s_root=document.getElementById('bannerid');
	s_root.options.length=0;
	for(var i in sort){
		var option = document.createElement("option");
		var value=sort[i].id;	
		var text=sort[i].name;
			option.text=text;
			option.value=value;
			s_root.options[s_root.options.length] =option;
	}

}
</script>
</head>
<body>
当前位置 添加文章
<@s.form action="article_addArticle.action">

文章栏目:<select id="bpid" name="bpid" οnchange="getsort()" >
	<#list Request.pbanner as p>
		<option value="${p.id}">${p.name}</option>
	</#list>
</select>
栏目分类:<select id="bannerid" name="bannerid"/>
</body>
</html>

 

 

AjaxAction.java

在getXxx()方法前使用@JSON(name="XXX") 注解可以重命名json传输的名,

官方的说法是:如果有些属性不希望被json 串行化,可以在属性前加 transient 修饰符,或者不要加get 方法,都可以达到此目的。

 但在我的测试中,带了transient 修饰符 但还是被串行化了,这个不知道是不是bug 。。

package action;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import action.bean.SortBean;

import entity.Banner;

import service.BannerService;

public class AjaxAction {
	private BannerService bannerService;
	private transient int pid;
	
	private Set sort;
	
	public String findSort(){
		Banner banner=bannerService.findBanner(pid);
		sort=new HashSet();
		if(banner!=null){
			if(banner.getBanners()!=null&&banner.getBanners().size()!=0){
				Set s=banner.getBanners();
				Iterator it=s.iterator();
				while(it.hasNext()){
					Banner c=(Banner)it.next();
					SortBean sb=new SortBean();
					sb.setId(c.getId());
					sb.setName(c.getName());
					sort.add(sb);
				}
			}
		}
		
		return "success";
	}
		
	public void setBannerService(BannerService bannerService) {
		this.bannerService = bannerService;
	}

	public Set getSort() {
		return sort;
	}

	public void setSort(Set sort) {
		this.sort = sort;
	}

	public int getPid() {
		return pid;
	}

	public void setPid(int pid) {
		this.pid = pid;
	}

}

 

 

struts.xml

 

	<package name="aticle_ajax" extends="json-default" >
		<action name="ajax_*" class="ajaxAction" method="{1}">
			<result type="json"></result>
		</action>
	</package>

 

 

官方json-plugin 网站:http://cwiki.apache.org/S2PLUGINS/json-plugin.html

另json 数据格式可参照本博客其他文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值