<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-6  評(píng)論-38  文章-40  trackbacks-0
    ?

    ?

    簡(jiǎn)介

    Ajax有人形容為“新瓶里的老酒”,這一點(diǎn)也不為過(guò),這里就不多介紹了。在這技術(shù)日新月異的世界里,真是不g不知道,一g嚇一跳。給大家推薦一個(gè)實(shí)惠的:http://m.tkk7.com/eamoi

    AjaxTags是一個(gè)開(kāi)源的項(xiàng)目,目前進(jìn)展你自己看吧:http://ajaxtags.sourceforge.net/,里面有源碼、demo和doc。

    ?

    背景

    歷史解決方法

    1、? 在父select元素的onChange事件中增加方法,調(diào)用action去填充子select元素。

    2、? 方法1 的改進(jìn),將兩個(gè)或多個(gè)連動(dòng)select元素放到一個(gè)iframe中。

    3、? 將父select元素和子select元素的內(nèi)容,在頁(yè)面初始化時(shí)裝載到j(luò)s的變量中,由父select元素的onChange事件直接調(diào)用js實(shí)現(xiàn)。

    4、? 方法3 的變形,將父select元素和子select元素的內(nèi)容,寫成獨(dú)立的js。

    歷史方法缺點(diǎn)

    方法

    缺點(diǎn)

    方法1

    頁(yè)面得全部刷新,須記住其他已填的內(nèi)容

    方法2

    頁(yè)面復(fù)雜,iframe得全部刷新

    方法3

    對(duì)于用戶的每一次界面操作都得全部加載數(shù)據(jù),資源浪費(fèi),代碼繁多

    方法4

    數(shù)據(jù)庫(kù)的字典表和js同步有很大問(wèn)題,更新麻煩

    我們的目的

    1、? 頁(yè)面無(wú)需全部刷新;

    2、? 與字典表更新同步;

    3、? 減少網(wǎng)絡(luò)傳輸資源損耗;

    使用方法

    準(zhǔn)備工作

    1、? http://ajaxtags.sourceforge.net/上下載AjaxTags的最新版本,有源碼、demo和doc。

    2、? 按照demo所示,拷貝資源文件:css、js和lib,還要注意WEB-INF 目錄下的ajaxtags.tld。

    開(kāi)始使用

    1、? web.xml文件中加入

    ? <taglib>

    ???? <taglib-uri>/WEB-INF/ajaxtags.tld</taglib-uri>

    ???? <taglib-location>/WEB-INF/ajaxtags.tld</taglib-location>

    ? </taglib>

    2、? 如果你的連動(dòng)會(huì)多處使用,就寫成一個(gè).inc文件,使用時(shí)就引進(jìn)來(lái):<%@ include file="/inc/fathertoson.inc"%>

    <%@ page contentType="text/html;charset=GBK"%>

    ?

    <!--ajax的標(biāo)簽庫(kù)-->

    <%@ taglib uri="/WEB-INF/ajaxtags.tld" prefix="ajax"%>

    <!--ajax的css-->

    <link href="css/ajaxtags.css" rel="stylesheet" type="text/css" />

    <link href="css/displaytag.css" rel="stylesheet" type="text/css" />

    <!--ajax的js-->

    <script src="js/prototype-1.3.1.js"></script>

    <script src="js/ajaxtags-1.1.5.js"></script>

    ?

    <tr>

    ??? <td>父select</td>

    ??? <td>

    ??????? <!—struts的標(biāo)簽-->

    ??????? <html:select property="father" value="">

    ??????????? <html:option value="">&nbsp;</html:option>

    ??????????? <html:options collection="fatherCollection" property="id" labelProperty="name" />

    ??????? </html:select>

    ??? </td>

    ???

    ??? <td>子select</td>

    ??? <td>

    ??????? <select name="son">

    ??????????? <option selected>&nbsp;</option>

    ??????? </select>

    ??? </td>

    </tr>

    ?

    <!--父子連動(dòng)-->

    <ajax:select

    ? baseUrl="fatherToSon.do"

    ? source="father"

    ? target="son"

    ? parameters="fathername={father}" />?

    ?

    解釋一下:

    baseUrl 調(diào)用action的url;

    source 父select

    target 子select

    parameters="fathername={father}" fathername為action中獲得父select值的參數(shù)

    ?

    3、? Action的寫法

    public class FatherToSonAction extends BaseAjaxAction {

    ?

    ??? public String getXmlContent(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

    ??????? // 從界面獲得父select的值,注意該處使用的是"fathername"而不是"father"

    ??????? String selectValue = request.getParameter("fathername");

    ???????

    ??????? // 從數(shù)據(jù)庫(kù)中得到子select的列表

    ??????? ArrayList list = (ArrayList) ...;

    ???????

    ??????? // 子select的列表中的對(duì)象為子字典對(duì)象,具有"name", "id"屬性

    ??????? return new AjaxXmlBuilder().addItems(list, "name", "id").toString();

    ??? }

    ?

    }

    其中BaseAjaxAction和AjaxXmlBuilder可以參照ajax源碼進(jìn)行修改,修改后代碼如下:

    //================================ AjaxXmlBuilder======================

    import java.lang.reflect.InvocationTargetException;

    import java.util.ArrayList;

    import java.util.Collection;

    import java.util.Iterator;

    import java.util.List;

    ?

    import org.apache.commons.beanutils.BeanUtils;

    import org.apache.commons.lang.builder.ToStringBuilder;

    ?

    /**

    ?* Helper class to build valid XML typically returned in a response to the client.

    ?*

    ?* 生成xml類型文件的幫助類,我們可以將xml文件放到response中返回給客戶端

    ?*

    ?* @author Darren Spurgeon

    ?* @version $Revision$ $Date$

    ?*/

    public class AjaxXmlBuilder {

    ?

    ??? private String encoding = "UTF-8";

    ?

    ??? private List items = new ArrayList();

    ?

    ??? public String getEncoding() {

    ??????? return encoding;

    ??? }

    ?

    ??? public void setEncoding(String encoding) {

    ??????? this.encoding = encoding;

    ??? }

    ?

    ??? /**

    ??? ?* Add item to XML.

    ??? ?*

    ??? ?* @param name

    ??? ?*??????????? The name of the item

    ??? ?* @param value

    ??? ?*??????????? The value of the item

    ??? ?* @return

    ??? ?*/

    ??? public AjaxXmlBuilder addItem(String name, String value) {

    ??????? items.add(new Item(name, value, false));

    ??????? return this;

    ??? }

    ?

    ??? /**

    ??? ?* Add item wrapped with inside a CDATA element.

    ??? ?*

    ??? ?* @param name

    ??? ?*??????????? The name of the item

    ??? ?* @param value

    ??? ?*??????????? The value of the item

    ??? ?* @return

    ??? ?*/

    ??? public AjaxXmlBuilder addItemAsCData(String name, String value) {

    ??????? items.add(new Item(name, value, true));

    ??????? return this;

    ??? }

    ?

    ??? /**

    ??? ?* Add items from a collection.

    ??? ?*

    ??? ?* @param collection

    ??? ?* @param nameProperty

    ??? ?* @param valueProperty

    ??? ?* @return

    ??? ?* @throws IllegalAccessException

    ??? ?* @throws InvocationTargetException

    ??? ?* @throws NoSuchMethodException

    ??? ?*/

    ??? public AjaxXmlBuilder addItems(Collection collection, String nameProperty,

    ??????????? String valueProperty) throws IllegalAccessException,

    ??????????? InvocationTargetException, NoSuchMethodException {

    ??????? return addItems(collection, nameProperty, valueProperty, false);

    ??? }

    ?

    ??? /**

    ??? ?* Add items from a collection.

    ??? ?*

    ??? ?* @param collection

    ??? ?* @param nameProperty

    ??? ?* @param valueProperty

    ??? ?* @return

    ??? ?* @throws IllegalAccessException

    ??? ?* @throws InvocationTargetException

    ??? ?* @throws NoSuchMethodException

    ??? ?*/

    ??? public AjaxXmlBuilder addItems(Collection collection, String nameProperty,

    ??????????? String valueProperty, boolean asCData)

    ??????????? throws IllegalAccessException, InvocationTargetException,

    ??????????? NoSuchMethodException {

    ??????? for (Iterator iter = collection.iterator(); iter.hasNext();) {

    ??????????? Object element = (Object) iter.next();

    ??????????? String name = BeanUtils.getProperty(element, nameProperty);

    ??????????? String value = BeanUtils.getProperty(element, valueProperty);

    ??????????? if (asCData) {

    ??????????????? items.add(new Item(name, value, false));

    ??????????? } else {

    ??????????????? items.add(new Item(name, value, true));

    ?

    ??????????? }

    ??????? }

    ??????? return this;

    ??? }

    ?

    ??? /**

    ??? ?* Add items from a collection as CDATA element.

    ??? ?*

    ??? ?* @param collection

    ??? ?* @param nameProperty

    ??? ?* @param valueProperty

    ??? ?* @return

    ??? ?* @throws IllegalAccessException

    ??? ?* @throws InvocationTargetException

    ??? ?* @throws NoSuchMethodException

    ??? ?*/

    ??? public AjaxXmlBuilder addItemsAsCData(Collection collection,

    ??????????? String nameProperty, String valueProperty)

    ??????????? throws IllegalAccessException, InvocationTargetException,

    ??????????? NoSuchMethodException {

    ??????? return addItems(collection, nameProperty, valueProperty, true);

    ??? }

    ?

    ??? /**

    ??? ?* @see java.lang.Object#toString()

    ??? ?*/

    ??? public String toString() {

    ??????? StringBuffer xml = new StringBuffer().append("<?xml version=\"1.0\"");

    ??????? if (encoding != null) {

    ??????????? xml.append(" encoding=\"");

    ??????????? xml.append(encoding);

    ??????????? xml.append("\"");

    ??????? }

    ??????? xml.append(" ?>");

    ?

    ??????? xml.append("<ajax-response>");

    ??????? xml.append("<response>");

    ??????? for (Iterator iter = items.iterator(); iter.hasNext();) {

    ??????????? Item item = (Item) iter.next();

    ??????????? xml.append("<item>");

    ??????????? xml.append("<name>");

    ??????????? if (item.isAsCData()) {

    ??????????????? xml.append("<![CDATA[");

    ??????????? }

    ??????????? xml.append(item.getName());

    ??????????? if (item.isAsCData()) {

    ??????????????? xml.append("]]>");

    ??????????? }

    ??????????? xml.append("</name>");

    ??????????? xml.append("<value>");

    ??????????? if (item.isAsCData()) {

    ??????????????? xml.append("<![CDATA[");

    ??????????? }

    ??????????? xml.append(item.getValue());

    ??????????? if (item.isAsCData()) {

    ??????????????? xml.append("]]>");

    ??????????? }

    ??????????? xml.append("</value>");

    ??????????? xml.append("</item>");

    ??????? }

    ??????? xml.append("</response>");

    ??????? xml.append("</ajax-response>");

    ?

    ??????? return xml.toString();

    ?

    ??? }

    ?

    }

    ?

    /**

    ?* A generic item class, basically representing a name-value pair.

    ?*

    ?* 一個(gè)通用的item類,代表了一個(gè)name-value對(duì)

    ?*

    ?* @author Darren Spurgoen

    ?* @version $Revision$ $Date$

    ?*/

    class Item {

    ?

    ??? private String name;

    ?

    ??? private String value;

    ?

    ??? private boolean asData;

    ?

    ??? /**

    ??? ?* Constructor for Item.

    ??? ?*/

    ??? public Item() {

    ??????? super();

    ??? }

    ?

    ??? /**

    ??? ?* Constructor for Item.

    ??? ?*

    ??? ?* @param name

    ??? ?* @param value

    ??? ?*/

    ??? public Item(String name, String value, boolean asData) {

    ??????? super();

    ??????? this.name = name;

    ??????? this.value = value;

    ??????? this.asData = asData;

    ??? }

    ?

    ??? /**

    ??? ?* @return Returns the name.

    ??? ?*/

    ??? public String getName() {

    ??????? return this.name;

    ??? }

    ?

    ??? /**

    ??? ?* @param name

    ??? ?*??????????? The name to set.

    ??? ?*/

    ??? public void setName(String name) {

    ??????? this.name = name;

    ??? }

    ?

    ??? /**

    ??? ?* @return Returns the value.

    ??? ?*/

    ??? public String getValue() {

    ??????? return this.value;

    ??? }

    ?

    ??? /**

    ??? ?* @param value

    ??? ?*??????????? The value to set.

    ??? ?*/

    ??? public void setValue(String value) {

    ??????? this.value = value;

    ??? }

    ?

    ??? /**

    ??? ?* @return Returns the asCData.

    ??? ?*/

    ??? public boolean isAsCData() {

    ??????? return this.asData;

    ??? }

    ?

    ??? /**

    ??? ?* @param asData

    ??? ?*?????????? ?The asData to set.

    ??? ?*/

    ??? public void setAsData(boolean asData) {

    ??????? this.asData = asData;

    ??? }

    ?

    ??? /**

    ??? ?* @see java.lang.Object#toString()

    ??? ?*/

    ??? public String toString() {

    ??????? return new ToStringBuilder(this).append("name", name).append("value",

    ??????????????? value).append("asData", asData).toString();

    ??? }

    }

    //========================== BaseAjaxAction==============================

    ?

    import java.io.PrintWriter;

    ?

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    ?

    import org.apache.struts.action.Action;

    import org.apache.struts.action.ActionForm;

    import org.apache.struts.action.ActionForward;

    import org.apache.struts.action.ActionMapping;

    ?

    /**

    ?* Ajax應(yīng)用的祖先抽象類,將xml文件類型數(shù)據(jù)放到響應(yīng)流中

    ?*

    ?* @author luzhilin

    ?*

    ?*/

    public abstract class BaseAjaxAction extends Action {

    ?

    ??? /**

    ??? ?* @see Action#execute(ActionMapping, ActionForm, HttpServletRequest,

    ??? ?*????? HttpServletResponse)

    ??? ?*/

    ??? public final ActionForward execute(ActionMapping mapping, ActionForm form,

    ??????????? HttpServletRequest request, HttpServletResponse response)

    ??????????? throws Exception {

    ?

    ??????? String xml = null;

    ??????? try {

    ??????????? xml = getXmlContent(mapping, form, request, response);

    ??????? } catch (Exception ex) {

    ??????????? // Send back a 500 error code.

    ??????????? response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,

    ??????????????????? "Can not create response");

    ??????????? return null;

    ??????? }

    ?

    ??????? // Set content to xml

    ??????? response.setContentType("text/xml; charset=UTF-8");

    ??????? response.setHeader("Cache-Control", "no-cache");

    ??????? PrintWriter pw = response.getWriter();

    ??????? pw.write(xml);

    ??????? pw.close();

    ?

    ??????? return null;

    ??? }

    ?

    ??? /**

    ??? ?* Each child class should override this method to generate the specific XML

    ??? ?* content necessary for each AJAX action.

    ??? ?*

    ??? ?* 每一個(gè)子類都必須重寫此方法,用于生成特定的xml文件數(shù)據(jù)流

    ??? ?*

    ??? ?* @param mapping

    ??? ?* @param form

    ??? ?* @param request

    ??? ?*??????????? the {@javax.servlet.http.HttpServletRequest} object

    ??? ?* @param response

    ??? ?*??????????? the {@javax.servlet.http.HttpServletResponse} object

    ??? ?* @return a {@java.lang.String} representation of the XML response/content

    ??? ?* @throws Exception

    ??? ?*/

    ??? public abstract String getXmlContent(ActionMapping mapping,

    ??????????? ActionForm form, HttpServletRequest request,

    ??????????? HttpServletResponse response) throws Exception;

    ?

    }

    進(jìn)一步思考的問(wèn)題

    1、?? 多層連動(dòng)怎么實(shí)現(xiàn);

    2、? 多組連動(dòng),我們的 action 怎么實(shí)現(xiàn);

    posted on 2006-11-26 17:08 一手的小窩窩 閱讀(600) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 国产中文在线亚洲精品官网| 亚洲精品视频免费看| 日韩毛片免费在线观看| 亚洲高清免费在线观看| 久久久婷婷五月亚洲97号色| 永久免费av无码入口国语片| 国产精品免费观看久久| 亚洲午夜久久久久妓女影院| 一级一看免费完整版毛片| 亚洲色图综合在线| 久久亚洲精品专区蓝色区| 妻子5免费完整高清电视| 亚洲六月丁香婷婷综合| 99久久免费国产精品特黄| 日韩亚洲国产高清免费视频| 日韩高清免费在线观看| 日韩色视频一区二区三区亚洲| 国产免费人成视频在线观看| 亚洲精品美女久久久久9999| 无码国产精品一区二区免费式影视| 亚洲一区二区三区91| 免费无码一区二区三区蜜桃| 久久久久亚洲AV片无码| 中文毛片无遮挡高潮免费| 亚洲性猛交XXXX| 8090在线观看免费观看| 亚洲人成网亚洲欧洲无码| av无码久久久久不卡免费网站| 久久综合久久综合亚洲| 亚洲国产午夜中文字幕精品黄网站| 国产精品亚洲精品观看不卡| 日本人护士免费xxxx视频| 丝袜足液精子免费视频| 亚洲精品尤物yw在线影院| 久久精品私人影院免费看| 亚洲av片劲爆在线观看| 在线免费观看污网站| 中国内地毛片免费高清| 亚洲人精品亚洲人成在线| 亚洲精品国精品久久99热 | 国产偷国产偷亚洲高清人|