搜档网
当前位置:搜档网 › Struts2、Spring3、MyBatis3整合ExtJS,完成ColumnTree 【二】

Struts2、Spring3、MyBatis3整合ExtJS,完成ColumnTree 【二】

Struts2、Spring3、MyBatis3整合ExtJS,完成ColumnTree 【二】
Struts2、Spring3、MyBatis3整合ExtJS,完成ColumnTree 【二】

三、加入Struts2框架

1、准备工作

添加jar文件如下:

org.springframework.web-3.0.5.RELEASE.jar

org.springframework.aop-3.0.5.RELEASE.jar

这2个jar包是spring的context所依赖的jar包

struts2-spring-plugin-2.2.3.jar是struts整合spring的jar包

2、在web.xml加入struts2的控制器

struts2

org.apache.struts2.dispatcher.FilterDispatcher

struts2

/*

3、在src目录添加struts.xml

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"https://www.sodocs.net/doc/bf217750.html,/dtds/struts-2.0.dtd">

启动后,可以看到首页index的页面就基本整合完成。

4、首先看看Action代码,代码如下:

package com.hoo.action;

import java.util.ArrayList;

import java.util.List;

import javax.inject.Inject;

import https://www.sodocs.net/doc/bf217750.html,d;

import https://www.sodocs.net/doc/bf217750.html,ponent;

import https://www.sodocs.net/doc/bf217750.html,.AccountBiz;

import com.hoo.entity.Account;

import com.opensymphony.xwork2.ActionSupport;

/**

* function: Account Action

* @author hoojo

* @createDate 2011-5-11 下午12:03:05

* @file AccountAction.java

* @package com.hoo.action

* @project S2SMyBatis

* @blog https://www.sodocs.net/doc/bf217750.html,/IBM_hoojo

* @email hoojo_@https://www.sodocs.net/doc/bf217750.html,

* @version 1.0

*/

@Component

public class AccountAction extends ActionSupport {

/**

* @author Hoojo

*/

private static final long serialVersionUID = -973535478139284399L;

@Inject

@Named("accountBiz")

private AccountBiz biz;

private Account acc;

private List results = new ArrayList();

public List getResults() {

return results;

}

public Account getAcc() {

return acc;

}

public void setAcc(Account acc) {

this.acc = acc;

}

public String add() throws Exception {

if (!biz.addAccount(acc)) {

this.addActionMessage("添加数据失败");

return ERROR;

}

return SUCCESS;

}

public String show() throws Exception {

results = biz.getList();

return"show";

}

public String remove() throws Exception {

return SUCCESS;

}

public String edit() throws Exception {

return SUCCESS;

}

public String treeData() throws Exception {

results = biz.getList();

return"tree";

}

}

这个Action被注解成Component,那么在spring的applicationContext配置文件中就不需要进行标签的配置了。上面注入了AccountDao,完成相关操作。

5、由于Struts2要和Spring进行整合,所以struts的配置会有点不同

account!show.action

/show.jsp

上面的class不再是AccountAction的classpath,而是spring容器中配置的bean。就是通过@Component注解过的AccountAction,被注解注释过后它的id默认是类名称首字母小写。所以上面的action的配置是accountAction。

6、由于要整合ExtJS,所以这里用到struts2-json-plugin-2.2.3.jar这个插件,将其加入到lib库中,struts.xml更改成:

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"https://www.sodocs.net/doc/bf217750.html,/dtds/struts-2.0.dtd">

/error.jsp

account!show.action

/show.jsp

acc

AccountAction中的treeData方法返回的tree,在account这个action配置中找到tree的result,将result的type配置成json。表示该result的数据以json的方式展示。tree这个result还配置了一个param,名称为excludeProperties表示排除的属性。这个参数将排除当前Action中的acc属性。也就是说这个属性将不会得到json的转换。其他属性将会被转换成json。

7、前台页面

index.jsp

显示所有

添加数据

JSON

show.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %>

<%

String path = request.getContextPath();

String basePath =

request.getScheme()+"://"+request.getServerName()+":"+request.getServ erPort()+path+"/";

%>

show all data

${data }<===>

#

#

#

#

#

删除 |

href="account!edit.action">修改


Struts标签和OGNL表达式显示数据

add.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %>

<%

String path = request.getContextPath();

String basePath =

request.getScheme()+"://"+request.getServerName()+":"+request.getServ erPort()+path+"/";

%>

add

四、整合ExtJS

1、添加ext的库,版本是2.2.2

需要添加column-tree.css

/*

* Ext JS Library 2.2.1

* Copyright(c) 2006-2009, Ext JS, LLC.

* licensing@https://www.sodocs.net/doc/bf217750.html,

*

* https://www.sodocs.net/doc/bf217750.html,/license

*/

.x-column-tree.x-tree-node {

zoom:1;

}

.x-column-tree.x-tree-node-el {

/*border-bottom:1px solid #eee; borders? */

zoom:1;

}

.x-column-tree.x-tree-selected {

background: #d9e8fb;

}

.x-column-tree.x-tree-node a {

line-height:18px;

vertical-align:middle;

}

.x-column-tree.x-tree-node a span{

}

.x-column-tree.x-tree-node.x-tree-selected a span{ background:transparent;

color:#000;

}

.x-tree-col {

float:left;

overflow:hidden;

padding:0 1px;

zoom:1;

}

.x-tree-col-text, .x-tree-hd-text {

overflow:hidden;

-o-text-overflow: ellipsis;

text-overflow: ellipsis;

padding:3px 3px 3px 5px;

white-space: nowrap;

font:normal 11px arial, tahoma, helvetica, sans-serif;

}

.x-tree-headers {

background: #f9f9f9

url(../ext2/resources/images/default/grid/grid3-hrow.gif) repeat-x 0 bottom;

cursor:default;

zoom:1;

}

.x-tree-hd {

float:left;

overflow:hidden;

border-left:1px solid #eee;

border-right:1px solid #d0d0d0;

}

.task {

background-image:url(../shared/icons/fam/cog.png) !important;

}

.task-folder {

background-image:url(../shared/icons/fam/folder_go.png) !important;

}

Ext.tree.ColumnTree.js

/*

* Ext JS Library 2.2.1

* Copyright(c) 2006-2009, Ext JS, LLC.

* licensing@https://www.sodocs.net/doc/bf217750.html,

*

* https://www.sodocs.net/doc/bf217750.html,/license

*/

Ext.tree.ColumnTree = Ext.extend(Ext.tree.TreePanel, {

lines:false,

borderWidth: Ext.isBorderBox ? 0 : 2, // the combined left/right border for each cell

cls:'x-column-tree',

onRender : function(){

Ext.tree.ColumnTree.superclass.onRender.apply(this, arguments);

this.headers = this.body.createChild(

{cls:'x-tree-headers'},this.innerCt.dom);

var cols = this.columns, c;

var totalWidth = 0;

for(var i = 0, len = cols.length; i < len; i++){

c = cols[i];

totalWidth += c.width;

this.headers.createChild({

cls:'x-tree-hd ' + (c.cls?c.cls+'-hd':''),

cn: {

cls:'x-tree-hd-text',

html: c.header

},

style:'width:'+(c.width-this.borderWidth)+'px;'

});

}

this.headers.createChild({cls:'x-clear'});

// prevent floats from wrapping when clipped

this.headers.setWidth(totalWidth);

this.innerCt.setWidth(totalWidth);

}

});

Ext.tree.ColumnNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {

focus: Ext.emptyFn, // prevent odd scrolling behavior

renderElements : function(n, a, targetNode, bulkRender){ this.indentMarkup = n.parentNode ?

n.parentNode.ui.getChildIndent() : '';

var t = n.getOwnerTree();

var cols = t.columns;

var bw = t.borderWidth;

var c = cols[0];

var buf = [

'

  • ',

    '

    style="width:',c.width-bw,'px;">',

    '

    class="x-tree-node-indent">',this.indentMarkup,"",

    '',

    '

    class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on">',

    '

    href="',a.href ? a.href : "#",'" tabIndex="1" ',

    a.hrefTarget ? ' target="'+a.hrefTarget+'"': "", '>',

    '', n.text || (c.renderer ?

    c.renderer(a[c.dataIndex], n, a) : a[c.dataIndex]),"",

    "

    "];

    for(var i = 1, len = cols.length; i < len; i++){

    c = cols[i];

    buf.push('

    style="width:',c.width-bw,'px;">',

    '

    ',(c.renderer ?

    c.renderer(a[c.dataIndex], n, a) : a[c.dataIndex]),"

    ",

    "

    ");

    }

    buf.push(

    '

    ',

    '

    ',

    "

  • ");

    if(bulkRender !== true && n.nextSibling &&

    n.nextSibling.ui.getEl()){

    this.wrap = Ext.DomHelper.insertHtml("beforeBegin",

    n.nextSibling.ui.getEl(), buf.join(""));

    }else{

    this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf.join(""));

    }

    this.elNode = this.wrap.childNodes[0];

    this.ctNode = this.wrap.childNodes[1];

    var cs = this.elNode.firstChild.childNodes;

    this.indentNode = cs[0];

    this.ecNode = cs[1];

    this.iconNode = cs[2];

    this.anchor = cs[3];

    this.textNode = cs[3].firstChild;

    }

    });

    2、编写静态ColumnTree

    /**

    * @function column tree column tree 多列信息的tree

    * @auhor: hoojo

    * @createDate: Aug 29, 2010 10:39:02 PM

    * @blog: https://www.sodocs.net/doc/bf217750.html,/IBM_hoojo

    * @email: hoojo_@https://www.sodocs.net/doc/bf217750.html,

    */

    Ext.ns("Ext.hoo.tree");

    https://www.sodocs.net/doc/bf217750.html,erColumnTree = Ext.extend(Ext.tree.ColumnTree, {

    constructor: function () {

    https://www.sodocs.net/doc/bf217750.html,erColumnTree.superclass.constructor.call(this, { renderTo: "show",

    title: "用户信息column tree",

    width: 450,

    hieght: 400,

    autoScroll: true,

    rootVisible: true,

    columns: [{

    header: "名称",

    width: 100,

    dataIndex: "name"

    }, {

    header: "性别",

    width: 100,

    dataIndex: "sex"

    }, {

    header: "年龄",

    width: 100,

    dataIndex: "age"

    }, {

    header: "班级",

    width: 100,

    dataIndex: "classes"

    }],

    loader: new Ext.tree.TreeLoader({

    baseAttrs: {

    uiProvider: Ext.tree.ColumnNodeUI }

    }),

    root: new Ext.tree.AsyncTreeNode({

    text: "用户基本信息",

    children: [{

    name: "大二一班",

    classes: "二(1)班",

    children: [{

    name: "微微",

    sex: "女",

    age: 20,

    classes: "二(1)班",

    leaf: true

    },{

    name: "筱筱",

    sex: "女",

    age: 22,

    classes: "二(1)班",

    leaf: true

    },{

    name: "珠珠",

    sex: "女",

    age: 19,

    classes: "二(1)班",

    leaf: true

    },{

    name: "拉拉",

    sex: "女",

    age: 19,

    classes: "二(1)班",

    leaf: true

    }]

    },{

    name: "二二班",

    classes: "二(2)班",

    children: [{

    name: "放放",

    sex: "男",

    age: 22,

    classes: "二(2)班",

    leaf: true

    },{

    name: "枫枫",

    sex: "男",

    age: 22,

    classes: "二(2)班",

    leaf: true

    }]

    },{

    name: "未成立",

    sex: "",

    age: 0,

    classes: "二(3)班",

    leaf: true

    }]

    })

    });

    this.on("click", this.onNodeClick, this);

    },

    onNodeClick: function (node, e) {

    alert(Ext.encode(node.attributes) + "###" + node.leaf + "###" + Ext.encode(e.getPoint()) + "##" + e.getXY());

    }

    });

    Ext.onReady(function () {

    Ext.BLANK_IMAGE_URL = "ext2/resources/images/default/s.gif";

    new https://www.sodocs.net/doc/bf217750.html,erColumnTree();

    });

    上面的就是一个静态的ColumnTree,在Ext的onReady函数中运行它。

    3、、需要在页面中导入ext库、css、即我们编写的js

    "https://www.sodocs.net/doc/bf217750.html,/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    TreePanel 示例

    content="text/html;charset=UTF-8" />

    content="https://www.sodocs.net/doc/bf217750.html,/IBM_hoojo"/>

    href="ext2/resources/css/ext-all.css" />

    href="jslib/column-tree.css" />

    4、下面编写远程数据的ColumnTree,代码如下:

    Ext.ns("Ext.hoo.tree");

    https://www.sodocs.net/doc/bf217750.html,erBasicColumnTree = Ext.extend(Ext.tree.ColumnTree, {

    constructor: function () {

    https://www.sodocs.net/doc/bf217750.html,erBasicColumnTree.superclass.constructor.call(this, {

    renderTo: "showBasic",

    title: "远程数据",

    width: 550,

    hieght: 400,

    autoScroll: true,

    rootVisible: true,

    columns: [{

    header: "编号",

    width: 100,

    dataIndex: "accountId"

    }, {

    header: "用户名称",

    width: 100,

    dataIndex: "username"

    }, {

    header: "密码",

    width: 100,

    dataIndex: "password"

    }, {

    header: "创建时间",

    width: 150,

    dataIndex: "createTime"

    }],

    loader: new Ext.tree.TreeLoader({

    baseAttrs: {

    uiProvider: Ext.tree.ColumnNodeUI

    }

    }),

    root: new Ext.tree.AsyncTreeNode({

    text: "用户基本信息",

    children: []

    }),

    listeners: {

    expandnode: {

    fn: this.onExpandNode,

    scope: this

    }

    }

    });

    },

    onExpandNode: function (node) {

    //只对未加载过的添加子结点,加载后不在重复加载;避免增加请求,浪费资源

    if (!node.attributes.isLoad) {

    Ext.Ajax.request({

    url: https://www.sodocs.net/doc/bf217750.html,erBasicColumnTree.TREE_DATA_URL, success: function (response, options) {

    node.attributes.isLoad = true;//设置加载标识

    var nodes = Ext.decode(response.responseText); //将json的text转换成js对象

    node.appendChild(nodes.results);

    },

    failure: function (response) {

    Ext.Msg.alert("程序异常", response.responseText); }

    });

    }

    }

    });

    https://www.sodocs.net/doc/bf217750.html,erBasicColumnTree.TREE_DATA_URL =

    "account!treeData.action";

    由于服务器端返回来的数据是一个对象,而不是一个Array。所以客户端要将数据稍作处理,然后再添加到columnTree的children中。

    5、在上面的onReady中创建这个对象就可以了运行

    Ext.onReady(function () {

    Ext.BLANK_IMAGE_URL = "ext2/resources/images/default/s.gif";

    new https://www.sodocs.net/doc/bf217750.html,erColumnTree();

    new https://www.sodocs.net/doc/bf217750.html,erBasicColumnTree();

    });

    由于Account对象的数据形式不是一个完整的tree形态。所以展示效果就是上面的样子。正确的数据的格式的话,Account中至少包含以下属性:

    Boolean leaf; List children; 这样就知道当前节点是否是叶子节点,并且知道其子元素。

    七种高效的网络营销方法及案例分析

    伴随着中国农历新年的来临,辞旧迎新之际,也是许多中小企业制定年度营销计划的关键时刻,受经济大环境的影响,对于许多公司来说,2009年可能是个巨大的挑战,因为经济增长的放缓给商业的发展蒙上了一层厚重的阴影。然而,网络营销看起来却不会受什么影响,随着营销预算地不断削减和限制条件地增多,网络营销的优势越来越多地展现出来。 一、电子商务营销 对于企业来说,电子商务能够有效的实现信息的流动与传播,而这种双向的交互行为能够更方便消费者获取商品信息,企业也能及时了解消费者的需求从而做出调整。除此之外,电子商务还能为企业有效的节约成本,另企业更具竞争力。特别是目前全球经济衰退的背景下,电子商务更能体现其无与伦比的优势。 在金融危机的辐射之下,消费者看好自己的腰包,不再盲目的消费;商场连锁点选择关闭分店,以求能够坚持的更久;企业大多选择大范围裁员来压缩成本,其中更是不乏有雅虎、索尼、花旗集团等国际企业。与此同时,国内许多企业也都开始以各种形式压缩成本,而为了保证持续增长许多企业选择开展电子商务。随着阿里巴巴、淘宝、当当、卓越、红孩子等电子商务企业的成功,国内网购市场也日渐成熟,传统商家对电子商务更加充满有信心,越来越多的企业看准了电子商务这块肥肉,联想、神州数码、国美、蒙牛等大型企业均开展了自己的电子商务营销。 二、搜索引擎营销 搜索引擎营销是一种成本最低,最有效的营销手段。人们上网查找信息大部分都是通过搜索引擎,只要网站能够在搜索引擎取得较好的关键词排名,客户就会最先点击你的网站。 搜索引擎营销轻而易举解决网络营销中所遇到的品牌推广、产品推广难的问题。将有特色的产品推广到互联网的每个角落,使意向客户走到哪里都能轻松找到你的产品和联系方式,让企业抢尽先机。 搜索引擎营销主要有三种主要方式:分别是付费排名,关键字广告,以及搜索引擎优化。中小企业最常用的是付费排名和关键字广告,但忽略了搜索引擎优化。搜索引擎优化最明显的效果让企业网站在搜索引擎中获取好的排名,提高网站展示率,让营销效果得到显著提高。 目前国内的中小企业都把80%注意力都放在付费搜索引擎广告,而忽略了搜索引擎优化(SEO)的优点。众所周知,付费排名/关键字广告都需要长期付出高额的费用。搜索引擎优化是“一劳永逸”的营销策略,通过搜索引擎优化让网站获取了好的排名,那么后期维护的成本将会很低。从一些研究报告分析,网民对搜索引擎中的付费连接有着排斥行为。网民更愿意接受一个自然排名比较好的网站,所以搜索引擎优化是中小企业开展网络营销不应忽略的方面,它也是搜索引擎营销中一个很好的捷径。 三、社区营销 Web2.0时代来临,网络社区无疑成为继门户和搜索之后中国互联网络未来发展的又一个热点;而基于其独特的用户群和黏性的服务,网络社区强大的营销价值也正日益被发掘。 通过网络社区这一平台的搭建,企业可以更大范围搜索消费者和传播对象,将分散的目标顾客和受众精准地聚集在一起,利用新的网络手段扩大口碑传播,获得更为精准的营销推广效果——真正网罗分众、汇聚目标群体、演绎精准营销。随着企业对“精准营销”的需求不断增加,有针对性的精准广告投放所占据的比例将越来越大,这也为寻求商业模式的互联网社区营销服务找到了一条赢利出路。由于网络社区本身是人以类聚的,这在一定程度上减少了企业搜索顾客的成本,进而将企业与顾客等参与者的信息集中起来,便于双方信息的沟通,提高了企业营销的效率和营销成功率。相比传统网络营销行为,社区营销的精准程度及营销互动性更胜一筹。 四、博客营销 博客营销模式是基于WEB2.0的运用,典型的代表除了博客本身以外,还如RSS、网摘、播客等。随着WEB2.0网站的快速发展,不仅提供了更多的网络营销资源,也随之出现了更多的网络营销方法,博客营销将形成主流。 因为博客营销方法是随着网络营销环境的发展而发展的,逐渐表现出其网络营销价值,成为可以被有效利用的网络营销工具,受到更多的关注。 企业博客率先在大型企业和I T 企业获得应用,企业博客频道和基于第三方BSP的博客营销模式均有许多成功应用案例,越来越多的中小企业也加入到博客营销的行列。当然,RSS营销的发展显然要缓慢得多。 优良的博客商业模式是一种资产,不单只是网页、不只是广告。这种模式应该是成本低、人员少、自动化,且不可不易被替代的服务产品。 五、事件营销 所谓事件,是指能够引起社会关注的焦点、大众关心的话题、议题,所谓事件营销,即是企业利用这些事件的社会专注度,把自己和事件进行某种关联和捆绑,从而在媒体报道与消费者参与事件的时候,达到提升企业形象以及销售产品的目的。企业可以参与大众关注的焦点话题,将自己带入话题的中心,由此引起媒体和大众的关注;也可以通过自身策划富有创意的活动,引起媒体或者大众关注。 “事件营销”作为四两拨千斤的品牌营销利器,其适用对象既可以是实力有限的中小企业,又可以是实力雄厚的大企业。 终极的事件营销传播方式,是将各种焦点事件进行有效整合传播。通过各种借势与造势手段,始终让品牌处于高关注度和高美誉度。 六、视频营销 2009年将会是真正的视频营销元年。互联网从文字,图片,发展了到了视频。随着网民的需求不断的增加。互联网行业也短短十几年。迅速成为了个朝阳产业。而最近几年传统媒体的广告市场在下降,网络广告一路上涨。随着网络经济的快速发展和网络视频行业的不断成熟。也将从个人博客到播客!

    整合营销传播的七个层次

    整合营销传播的七个层 次

    整合營銷傳播的七個層次 1、認知的整合 這是實現整合營銷傳播的第一個層次,這裡只有要求營銷人員認識或明瞭營銷傳播的需要。 2、形象的整合 第二個層次牽涉到確保信息與媒體一致性的決策,信息與媒體一致性一是指廣告的文字與其他視覺要素之間要達到的一致性;二是指在不同媒體上投放廣告的一致性。 3、功能的整合 是把不同的營銷傳播方案編製出來,作為服務於營銷目標(如銷售額與市場份額)的直接功能,也就是說每個營銷傳播要素的優勢劣勢都經過詳盡的分析,並與特定的營銷目標緊密結合起來。 4、協調的整合 第四個層次是人員推銷功能與其他營銷傳播要素(廣告公關促銷和直銷)等被直接整合在一起,這意味著各種手段都用來確保人際營銷傳播與非人際形式的營銷傳播的高度一致。例如推銷人員所說的內容必須與其他媒體上的廣告內容協調一致。 5、基於消費者的整合 營銷策略必須在瞭解消費者的需求和欲求的基礎上鎖定目標消費者,在給產品以明確的定位以後才能開始營銷策劃,換句話說,營銷策略的整合使得戰略定位的信息直接到達目標消費者的心中。 6、基於風險共擔者的整合

    這是營銷人員認識到目標消費者不是本機構應該傳播的唯一群體,其他共擔風險的經營者也應該包含在整體的整合營銷傳播戰術之內。例如本機構的員工、供應商、配銷商以及股東等。 7、關係管理的整合 這一層次被認為是整合營銷的最高階段。關係管理的整合就是要向不同的關係單位作出有效的傳播,公司必鬚髮展有效的戰略。這些戰略不只是營銷戰略,還有製造戰略、工程戰略、財務戰略、人力資源戰略以及會計戰略等,也就是說,公司必須在每個功能環節內(如製造、工程、研發、營銷等環節)發展出營銷戰略以達成不同功能部門的協調,同時對社會資源也要作出戰略整合。

    相关主题