一、ComboGrid

扩展自$.fn.combo.defaults和$.fn.datagrid.defaults。使用$.fn.combogrid.defaults重写默认值对象。数据表格下拉框结合了可编辑文本框控件和下拉数据表格面板控件,该控件允许用户快速查找和选择,并且该控件提供了键盘导航支持,对行进行筛选。

这东西其实就是下拉框中出现一个datagrid

依赖关系

combo

datagrid

所谓的键盘导航支持。

//例一 html 方式直接配置
<select id="cc" class="easyui-combogrid" name="dept" style="width:250px;"
data-options="
panelWidth:450,
value:'006',
idField:'id',
textField:'userName', url:'UserServlet6',
columns:[[
{field:'userName',title:'用户名',width:60},
{field:'password',title:'密码',width:100},
{field:'note',title:'备注',width:120},
{field:'userId',title:'用户账号',width:100}
]]
">
</select>
//例二  使用Javascript通过已经定义的<select>或<input>标签来创建数据表格下拉框。
<input id="cc" name="dept" value="01" /> $(function(){
$('#cc').combogrid({
panelWidth:450,
value:'006',
idField:'userId',
textField:'userName',
url:'UserServlet6',
columns:[[
{field:'userName',title:'用户名',width:60},
{field:'password',title:'密码',width:100},
{field:'note',title:'备注',width:120},
{field:'userId',title:'用户账号',width:100}
]]
}); });
//例三 自动完成功能
<input id="cc" name="dept" value="01" /> $(function(){
$('#cc').combogrid({
delay: 500,
mode: 'remote',
url: 'UserServlet6', //注意,在服务端,要接收q这个参数,再根据q进行模糊查询
idField: 'id',
textField: 'userName',
columns: [[
{field:'userName',title:'用户名',width:60},
{field:'password',title:'密码',width:100},
{field:'note',title:'备注',width:120},
{field:'userId',title:'用户账号',width:100}
]]
});
});

二、 Tree

使用$.fn.tree.defaults重写默认值对象。

依赖关系

draggable

droppable

树控件使用<ul>元素定义。标签能够定义分支和子节点。节点都定义在<ul>列表内的<li>元素中。

以下显示的元素将被用作树节点嵌套在<ul>元素中。

在给tree加图标的时候,遇到了加不上的问题,实测发现,这两句的顺序必须按下面这样, 反了不行。

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/js/jquery-easyui-1.4/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/js/jquery-easyui-1.4/themes/icon.css">
//例一
<ul id="tt" class="easyui-tree">
<li>
<span>Folder</span>
<ul>
<li>
<span>Sub Folder 1</span>
<ul>
<li>
<span><a href="#">File 11</a></span>
</li>
<li>
<span>File 12</span>
</li>
<li>
<span>File 13</span>
</li>
</ul>
</li>
<li>
<span>File 2</span>
</li>
<li>
<span>File 3</span>
</li>
</ul>
</li>
<li>
<span>File21</span>
</li>
</ul>
//例二
<ul id="tt" class="easyui-tree">
<li>
<span>用户管理</span>
<ul>
<li><span>用户添加</span></li>
<li><span>用户维护</span></li>
</ul>
</li>
<li>
<span>商品管理</span>
<ul>
<li><span>商品添加</span></li>
<li><span>商品维护</span></li>
</ul>
</li>
<li>
<span>订单管理</span>
</li>
</ul>
//例三 使用javascript方式加载
<ul id="tt"></ul> $('#tt').tree({
animate:true,
checkbox:true,
cascadeCheck:false,
onlyLeafCheck:true,
lines:true,
dnd:true,
url:'tree_data1.json'
}); [
{
"id":1,
"text":"用户管理",
"children":
[
{"id":"11","text":"用户添加"},{"id":"12","text":"用户维护"},{"id":"13","text":"用户删除"}
]
}, {
"id":2,
"text":"商品管理",
"children":
[
{"id":"21","text":"商品添加"},{"id":"22","text":"商品维护"},{"id":"23","text":"商品删除"}
]
}
]
//例四 使用javascript方式加载
<ul id="tt"></ul> $('#tt').tree({
animate:true, //加一个上渐渐收起或滑出的效果
checkbox:true,
//cascadeCheck:false, //级联选择
onlyLeafCheck:true, //只在叶子结点显示勾选框
lines:true,
dnd:true, //可移动
url:'tree_data1.json'
}); [
{
"id":0,
"text":"全部功能",
"children":
[
{
"id":1,
"text":"用户管理",
"iconCls":"icon-save", //图标
"state":"closed", //关闭
"attributes":{ //给它加一些附加属性
"url":"/demo/book/abc",
"price":100
},
"children":
[
{"id":"11","text":"用户添加"},{"id":"12","text":"用户维护"},{"id":"13","text":"用户删除"}
]
}, {
"id":2,
"text":"商品管理",
"iconCls":"icon-remove",
"state":"closed", "children":
[ //勾选
{"id":"21","text":"商品添加","checked":true},{"id":"22","text":"商品维护"},{"id":"23","text":"商品删除"}
]
}
]
}
]

三、Tree 的常用方法

== getRoot

$("button").click(function(){
var rootNode=$("#tt").tree("getRoot");
alert(rootNode.text); //得到"全部功能" 四个字
console.info(rootNode);
});

== getChecked (state) //获取所有选中的节点。'state'可用值:'checked','unchecked','indeterminate'。如果'state'未指定,将返回'checked'节点

var nodes = $('#tt').tree('getChecked');    // get checked nodes
var nodes = $('#tt').tree('getChecked', 'unchecked'); // 获取未选择节点
var nodes = $('#tt').tree('getChecked', 'indeterminate'); // 获取不确定的节点
//例子 取出所有选中节点的 id 和 text
$("button").click(function(){
var nodes = $('#tt').tree('getChecked'); //只取选中节点
$.each(nodes,function(){
alert(this.text);
alert(this.id);
if(this.attributes){
alert(this.attributes.url); //demo/book/abc //注意,对于没有这些属性的结果,将报错
alert(this.attributes.price); //
alert(this.attributes.jiangyou);
}
})
})

四、异步树控件

树控件内建异步加载模式的支持,用户先创建一个空的树,然后指定一个服务器端,执行检索后动态返回JSON数据来填充树并完成异步请求。

<ul class="easyui-tree" data-options="url:'get_data.php'"></ul> 

树控件读取URL。子节点的加载依赖于父节点的状态。当展开一个封闭的节点,如果节点没有加载子节点,它将会把节点id的值作为http请求参数并命名为'id',通过URL发送到服务器上面检索子节点。

下面是从服务器端返回的数据。

[{
"id": 1,
"text": "Node 1",
"state": "closed",
"children": [{
"id": 11,
"text": "Node 11"
},{
"id": 12,
"text": "Node 12"
}]
},{
"id": 2,
"text": "Node 2",
"state": "closed"
}]

重点:

每个节点都有如下属性

id:  //节点ID,对加载远程数据很重要

text:显示的节点文本。

iconCls:显示的节点图标CSS类ID。

checked:该节点是否被选中。

state:节点状态,'open' 或 'closed'。

attributes:绑定该节点的自定义属性。

target:目标DOM对象

===对应的 MenuInfo 类

class MenuInfo{
id
menuName
url
target
pic
parentId
...
}
class MenuInfo {
id,
text, //menuName
iconCls //pic
checked
state,
Map<String,Object>attributes
parentId
}

easyui 的 tree + struts 见视频

1) 页面

$(function(){
$("#menuTree").tree({
//animate:true, //加一个上渐渐收起或滑出的效果
//checkbox:true,
//cascadeCheck:false, //级联选择
//onlyLeafCheck:true, //只在叶子结点显示勾选框
lines:true,
//dnd:true, //可移动
url:"menuAction_getMenuTree.action",
onLoadSuccess:function(){
//$("#menuTree").tree("expandAll"); 展开全部结点
//指定展开第二个节点
var nodeList=$("#menuTree").tree("getRoots");
$("#menuTree").tree("expand",nodeList[1].target); //处理点击以后,显示选项卡
$("#menuTree a").click(function() {
var href=$(this).attr("href");
var tabTitle =$(this).text(); //超链上的文本
var iconCls= $(this).attr("iconCls"); if($("#centerDiv").tabs("exists",tabTitle)){
$("#centerDiv").tabs("select",tabTitle);
}
else{
$("#centerDiv").tabs("add",{
title:tabTitle,
closable:true,
iconCls:iconCls,
content:"<iframe style='border:0;width:100%;height:100%' src='"+href+"'> </iframe>"
});
} return false; //防止超链接提交 });
}
}); });

2) MenuAction

public class MenuAction extends BaseAction {  //继承自  BaseAction (对request 进行了封装)
private MenuDao _menuDao=new MenuDao();
private List<MenuInfo> menuList; //它是以json方式返回的(需要在strtus.xml中进行配置) //查询树菜单
public String getMenuTree(){
String menuId =request.getParameter("id"); //这个id是 树控件自动传过来的
if(StrUtil.isNullOrEmpty(menuId)){
menuId="0";
} int parentId=Integer.parseInt(menuId);
menuList= _menuDao.getMenuTree(parentId); System.out.println("menuList"+menuList.size()); return "menutree_success";
}

3) MenuDao

public class MenuDao {
//根据菜单id查询子菜单
public List<MenuInfo> getMenuTree(int parentId) {
List<MenuInfo> menuList=new ArrayList<MenuInfo>();
Connection conn =null;
PreparedStatement stm=null;
ResultSet rs=null;
try {
conn=DBUtil.getConn();
String sql="select * from menuInfo where parentid =?";
stm=conn.prepareStatement(sql);
stm.setInt(1, parentId);
rs=stm.executeQuery();
while(rs.next()){
MenuInfo m=new MenuInfo();
m.setId(rs.getInt("id"));
m.setIconCls(rs.getString("iconCls"));
m.setParentId(rs.getInt("parentId")); //做重点处理
if(getSubMenuCount(m.getId())>0){
m.setText(rs.getString("menuName"));
m.setState("closed"); //重要
}
else{
m.setState("open"); //重要
String menuContent=
"<a iconCls='"+m.getIconCls()+"' href='"+rs.getString("url")+"' >"+rs.getString("menuName")+"</a>";
m.setText(menuContent);
} Map<String ,Object> arrtibutes =new HashMap<String, Object>();
arrtibutes.put("url", rs.getString("url"));
arrtibutes.put("jiangyou", "aaabbbbcccc");
arrtibutes.put("wushu", "无数"); m.setAttributes(arrtibutes); menuList.add(m);
} } catch (Exception e) {
e.printStackTrace();
}finally{
DBUtil.close(rs, stm, conn);
} return menuList;
} //查询子菜单的个数
private int getSubMenuCount(int parentId) {
int result=0;
Connection conn=null;
PreparedStatement stm=null;
ResultSet rs=null;
try {
conn=DBUtil.getConn();
String sql="select count(*) from menuInfo where parentId=?";
stm=conn.prepareStatement(sql);
stm.setInt(1, parentId);
rs=stm.executeQuery();
if(rs.next()){
result=rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtil.close(rs, stm, conn);
} return result;
} }

4) 配置文件 tree_conf.xml

<package name="p_tree" namespace="" extends="json-default">  //关键,要继承  json-default ,要引  struts2-json-plugin-2.3.16.1.jar
<action name="menuAction_*" class="cat.action.MenuAction" method="{1}">
<result name="menutree_success" type="json" >
<param name="root">menuList</param> //root 是固定写法 ,menuList 是要返回的数据.它会自动的转成json类型(不用我们手工处理)
</result>
</action>
</package>

五、datagrid 在struts 中的应用 (ajax)

导入 struts2-json-plugin-2.3.16.1.jar

 //1) user_manage.jsp
$(function(){
$('#table1').datagrid({
url:'userAction_manage',
columns:[[
{field:'userName',title:'用户名',width:100},
{field:'password',title:'密码',width:100},
{field:'note',title:'备注',width:100,align:'right'}
]]
,
pagination:true,
pageSize:5,
pageList:[5,10,15]
});
}); <table id="table1"> </table>
//2) UserAction
public class UserAction extends BaseAction{
private UserDao _userDao=new UserDao();
private Map<String,Object> jsonMap; //这个map ,是要返回的数据(会被自动转成json格式) //..对生应的 get set 方法 //分页查询用户列表
public String manage(){
int pageSize= Integer.parseInt(request.getParameter("rows"));
int pageIndex=Integer.parseInt(request.getParameter("page"));
int rowCount=_userDao.getUserCount(); PageInfo pageInfo =PageUtil.getPageInfo(pageSize, rowCount, pageIndex); List<UserInfo> userList=_userDao.getUserList(pageInfo); jsonMap=new HashMap<String,Object>(); jsonMap.put("total", rowCount); //要这样处理
jsonMap.put("rows", userList); //要这样处理 return "manage_success";
}
...
}
//3) 配置文件 user-conf.xml
<package name="p_user" namespace="" extends="json-default">
<action name="userAction_*" class="cat.action.UserAction" method="{1}">
<result name="manage_success" type="json" >
<param name="root">jsonMap</param> //注意,这里返回的是 map,不是那个userList
</result>
</action>
</package>

Java框架之Struts2(四)的更多相关文章

  1. Java框架之Struts2(一)

    在学习Struts2之前,我们要知道Java为什么要有反射机制呢?反射机制可以说是填补Java不能动态访问某一个类的空白.利用反射机制,动态的创建一个对象.动态的访问类的某个属性,而且访问哪一个属性自 ...

  2. Java框架之Struts2(六)

    一.OGNL表达式语言 Ognl Object Graphic Navigation Language(对象图导航语言),它是一种功能强大的表达式语言(Expression Language,简称为E ...

  3. Java框架之Struts2(二)

    一.Action 配置说明 //请求的直接转发 <package name="packageUser" namespace="" extends=&quo ...

  4. Java - 框架之 Struts2

    一. Package 标签 1. 标签属性:name        : 包的名称,只有在一个项目中不重名即可.extends       : 继承哪个包,默认为 struts-default.name ...

  5. java框架之struts2简介

    一.Struts2简介 1.Struts2概述                    Struts2是Apache发行的MVC开源框架.注意:它只是表现层(MVC)框架. M:model-----数据 ...

  6. java框架之Struts2(1)-简介及入门

    简介 Struts2 是一个基于 MVC 设计模式的 Web 应用框架,它本质上相当于一个 servlet,在 MVC 设计模式中,Struts2 作为控制器 (Controller) 来建立模型与视 ...

  7. java框架之Struts2(2)-访问Servlet API及请求数据封装

    准备 为后面测试示例编写代码及配置如下: package com.zze.bean; import java.util.Date; public class User { private String ...

  8. java框架之Struts2(4)-拦截器&标签库

    拦截器 概述 Interceptor (拦截器):起到拦截客户端对 Action 请求的作用. Filter:过滤器,过滤客户端向服务器发送的请求. Interceptor:拦截器,拦截的是客户端对 ...

  9. java框架篇---Struts2的处理流程

    一.Struts2的处理流程: 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是 ...

随机推荐

  1. virtual关键字

    出于多态的考虑,为了覆盖, 子类同名覆盖函数(函数名.参数.返回值都相同) virtual void print(): 这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:(1)重载的几 ...

  2. Catalan数与出栈顺序个数,Java编程模拟

    问题描述: 队列中有从1到7(由小到大排列)的7个整数,问经过一个整数栈后,出栈的所有排列数有多少?如果整数栈的容量是4(栈最多能容纳4个整数),那么出栈的排列数又是多少? 分析:对于每一个数字i, ...

  3. Dynamic Programming | Set 3 (Longest Increasing Subsequence)

    在 Dynamic Programming | Set 1 (Overlapping Subproblems Property) 和 Dynamic Programming | Set 2 (Opti ...

  4. Android 实现手写板技术

    Android手写板和涂鸦的功能,代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro ...

  5. C#6.0语言规范(四) 类型

    C#语言的类型分为两大类:值类型和引用类型.值类型和引用类型都可以是泛型类型,它们采用一个或多个类型参数.类型参数可以指定值类型和引用类型. type : value_type | reference ...

  6. Nginx---(main block)

    正常运行必备配置 1,user USERNAME [GROUPAME] ; 指定用于运行worker进程的用户和组:   user nginx nginx; 2, pid /PATH/TO/PID_F ...

  7. php函数式编程

    // 函数式编程 $users = array( array('id' => 1, 'name' => 'abc1', 'age' => 29, '性别' => '男'), a ...

  8. JAVA实现调用微信js-sdk扫一扫

    喜欢的朋友可以关注下. 已经很久没有给大家分享一片技术文章了,今天抽了点时间来,给大家说一说如何调用微信提供的扫一扫接口. 前提: 需要申请一个公众号:申请公众号需要的资料我就不说了,去申请微信会提示 ...

  9. ArrayList的实现原理

    ArrayList的线性复杂度是1.想确定一个数据,直接通过索引进行访问.实际上这个过程和数组是非常相似的.ArrayList在整个使用过程中,如果想要高效操作,最好设置一个数组的大小.在个数固定的情 ...

  10. iOS开发工具

    Xcode插件 几乎所有开发者都知道Alcatraz是一个开源的包管理工具,可以让我们更轻松地管理各种插件.接下来就介绍下我的最推荐的10个插件: 15.FuzzyAutocompletePlugin ...