|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
Tree средствами HTML26.03.2010, 11:21. Показов 1227. Ответов 9
Метки нет (Все метки)
Нужно реализовать Tree на Web странице. Уже придумал алгоритм, осталось только реализовать представление на JSP. Но вот незадача - не хотется этот код встаивать в страницу - некрасиво. Думал через custom tags, но не знаю как ссылку на JavaBean отображаемого дерева передать обработчику своего тега. А может есть стандартное решение? Подскажите плиз...
0
|
|
| 26.03.2010, 11:21 | |
|
Ответы с готовыми решениями:
9
Какими средствами написать конвертер DOC-HTML, HTML-DOC Определить предикат maxelem(Tree, Max), чтобы Max равнялось наибольшему из чисел, входящих в дерево Tree
|
|
mishgun
|
|
| 26.03.2010, 20:53 | |
|
<%@ include file='yourfile.html' %>
так не пойдет? |
|
|
mishgun
|
|
| 27.03.2010, 01:07 | |
|
Извиняюсь не совсем въехал в вопрос.
посмотрите на sourceforge.com там есть кастом таги на jacarta.apache.org jsptags.com тоже гляньте но по моему это лишний геморрой идите обычным путем |
|
|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
| 28.03.2010, 09:49 [ТС] | |
|
Все, сделал. Обошелся без стандартных тегов - написал свой. Одно плохо - после каждого клика на узле дерева при сворачивании-разворачивании приходится перегружать страницу. Ещё пока не решил как восстанавливть текущую ветвь дерева на старой позиции при перегрузке страницы если раскрываемый или закрываемый узел находится не в начале документа. Если кому интересно - могу объяснить поподробнее, поделиться исходниками.
0
|
|
|
3 / 3 / 3
Регистрация: 09.07.2008
Сообщений: 422
|
|
| 28.03.2010, 12:02 | |
|
Держи hidden элемент для каждого узла
0
|
|
|
0 / 0 / 0
Регистрация: 26.05.2009
Сообщений: 81
|
|
| 28.03.2010, 14:03 | |
|
to makem
поделись исходничками если не трудно... на alekseymir@rambler.ru please
0
|
|
|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
| 28.03.2010, 17:26 [ТС] | |
|
to SVOLOCH: че-то не догнал, зачем hidden? Чтоб привязаться к нему, что ли?
А исходнички подготовлю и опубликую здесь (не в обиду, да?). Думаю всем будет интересно . К завтрему наверное управлюсь.
0
|
|
|
3 / 3 / 3
Регистрация: 09.07.2008
Сообщений: 422
|
|
| 29.03.2010, 14:13 | |
|
Если реализовать дерево внутри тэга FORM, а клики на элементы дерева - как сабмит этой формы, причем для каждого узла держать hidden элемент, имеющий значение 'true' или 'false' в зависимости от текущего состояния узла, тогда при последующем построении дерева после сабмита ты всегда сможешь отобразить его так, как его развернул юзер. Могу исходничек скинуть, если что..
0
|
|
|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
| 29.03.2010, 15:32 [ТС] | |
|
Спасибо, понял. Но я пошел несколько другим путем. Далее увидите, скоро сброшу исходники с краткими комментариями. Ждите, у меня много работы...
0
|
|
|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
| 31.03.2010, 12:53 [ТС] | |
|
Выкладываю (все что знаю) Не осудите если где в чем то ошибся (но незначительно)
))))))))))))))))))).Во-первых, все узлы и линии дерева отображаются графикой 20x20 пикселов (для теста в формате bmp).Принята такая сигнатура: Для раскрытого узла minusR.bmp (R - всегда отображается связь с иконкой узла) minusRD.bmp (D - узел не последний на своем уровне) Для закрытого узла plusR.bmp plusRD.bmp Вертикальная линия без связей с узлами lineV.bmp Вертикальная линия с отображением связи с узлом у которого нет потомков lineRD.bmp Вертикальная линия с отображением связи с последним на своем уровне узлом у которого нет потомков lineR.bmp Графический табулятор ( заполнения пространства в глубину вложенности для строки) empty.bmp Далее привожу код custom taga public class TreeTag extends TagSupport implements javax.servlet.jsp.tagext.TryCatchFinally { private final String [] stages = {'circleRed.bmp', 'circleMagenta.bmp', 'circleBlue.bmp', 'circleGreen.bmp', 'circleBrown.bmp', 'circleBlack.bmp'}; // Кэш уровней связи (по коду станет ясно если так не понятно ))Vector vCash = new Vector(); // Атрибуты private String catalogName; private String headValue; public TreeTag() { super(); } public void otherDoStartTagOperations() { try { JspWriter out = pageContext.getOut(); ServletRequest sr = pageContext.getRequest(); out.println('<table bgcolor=#cccccc width='100%' border='0' cellspacing='1' cellpadding='0' align='left' class='ttext'>'); out.print('<tr bgcolor='#cccccc'><th align='center'>'); out.print('Схема'); out.print('</th><th width='90%' align='left'>'); out.print('Позиции'); out.print('</th></tr>'); out.print('<tr><td bgcolor=#ffffff>'); out.print('<img src='/Images/circleYellow.bmp' alt='' border=0 hspace=0 vspace=0>'); out.print('</td><td bgcolor=#ffffff>'); out.print(headValue); out.println('</td></tr>'); // Получить корневой каталог Vector vCatalog = (Vector)sr.getAttribute(catalogName); // прорисовка в глубину (рекурсия) printNodes(vCatalog,out); out.println('</table>'); out.flush(); } catch (Exception ex) { System.out.print(ex.toString()); } } public boolean theBodyShouldBeEvaluated() { return true; } public int doStartTag() throws JspException, JspException { otherDoStartTagOperations(); if (theBodyShouldBeEvaluated()) { return EVAL_BODY_INCLUDE; } else { return SKIP_BODY; } } public int doEndTag() throws JspException, JspException { otherDoEndTagOperations(); if (shouldEvaluateRestOfPageAfterEndTag()) { return EVAL_PAGE; } else { return SKIP_PAGE; } } // Геттеры sion> <jsp-version>1.2</jsp-version> <short-name>max</short-name> <uri>/max</uri> <display-name>max</display-name> <description>A blank tag library template. </description> <tag> <name>tree</name> <tag-class>tags.max.TreeTag</tag-class> <body-content>empty</body-content> <description></description> <tldx> <packagename>tags.max</packagename> <extendsSupportClass>TRUE</extendsSupportClass> <supportClass>TagSupport</supportClass> <implementsTryCatchFinally>TRUE</implementsTryCatchFinally> <findparent>FALSE</findparent> </tldx> <attribute> <name>catalog</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>String</type> <tldx> <javaVariable>catalogName</javaVariable> <IsReferenceID>FALSE</IsReferenceID> <ReferencesTag>FALSE</ReferencesTag> <ReferenceScope>Session</ReferenceScope> <ReferencesTagReferentFirst>TRUE</ReferencesTagReferentFirst> </tldx> </attribute> <attribute> <name>head</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>String</type> <tldx> <javaVariable>headValue</javaVariable> <defaultValue>'Заголовок'</defaultValue> <IsReferenceID>FALSE</IsReferenceID> <ReferencesTag>FALSE</ReferencesTag> <ReferenceScope>Session</ReferenceScope> <ReferencesTagType></ReferencesTagType> <ReferencesTagVariable></ReferencesTagVariable> <ReferencesTagReferentFirst>TRUE</ReferencesTagReferentFirst> </tldx> </attribute> <example></example> </tag> </taglib> Определение класса Node (узел дерева): package srv; import java.util.Vector; public class Node { // Состояние узла public static final int NODE_OPEN = 1; public static final int NODE_CLOSE = 2; // Cчетчик для идентификации каждого узла во время создания private static int nodesCount=1; // Имя узла private String nodeName; // Это для моих целей (для себя можете определить что угодно) private String nodeCode; // Ключ для поиска данного узла private String nodeKey; // Флаг наличия потомков boolean isMulty = false; // Текущее состояние int keyState = NODE_CLOSE; // Это тоже для своих целей int keyLevel; // Контейнер потомков Vector childs = new Vector(); public Node(String nodeCode, String nodeName, int iLevel) { this.nodeCode = nodeCode; this.nodeName = nodeName; this.keyLevel = iLevel; this.nodeKey = String.valueOf(nodesCount); nodesCount++; } public String getName() { return nodeName; } public boolean isKeyEquals(String key) { if(key.equals(nodeKey)) return true; return fa R> node32.setKey(Node.NODE_OPEN); node31.addChild(new Node('25','Test 3.1.1',2)); node31.addChild(new Node('26','Test 3.1.2',2)); node.addChild(node31); Node node321 = new Node('27','Test 3.2.1',2); Node node3211 = new Node('28','Test 3.2.1.1',3); node3211.addChild(new Node('29','Test 3.2.1.1.1',4)); node3211.addChild(new Node('30','Test 3.2.1.1.2',4)); node321.addChild(node3211); node321.addChild(new Node('31','Test 3.2.1.2',3)); node32.addChild(node321); node.addChild(node32); catalog.add(node); node = new Node('32','Test 4',0); node.addChild(new Node('33','Test 4.1',1)); catalog.add(node); node = new Node('34','Test 5',0); node.addChild(new Node('35','Test 5.1',1)); catalog.add(node); query.getRequest().setAttribute('testCat alog', catalog); Вот пока и все. Как говорится если нет подходящего решения - используй рекурсию - в скольких случаях это выручало! Будут вопросы - пишите. Хотя мгновенного ответа не гарантирую - работы невпроворот.Пока
0
|
|
| 31.03.2010, 12:53 | |
|
Помогаю со студенческими работами здесь
10
Как создать Tree - НЕ ОБЫЧНЫЙ, А как в XSI Render Tree или Maya HTML-code средствами Qt Изменение html средствами js Парсинг HTML средствами AS 3.0 Определить браузер средствами HTML Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|