Рефакторинг “включает ад файла”

Краткое объяснение

Проблема, которую вы затрагиваете выше, вызвана тем фактом, что обработчик не может обработать вашу ссылку действия, поскольку он не может сгенерировать идентификатор для компонента ссылки. - означает, что ссылка на активированный компонент фактически отсутствует.

Оба ваших примера на самом деле не совсем верны. Однако со ссылкой, сгенерированной за пределами таблицы, обработчик представления каким-то образом может определить идентификатор для компонента и оказывается в нужном месте при выполнении действия.

Глядя на код

Если мы посмотрим на то, что генерирует JSF Mojarra при вызове приведенного выше кода, мы увидим следующее:

Ссылки внутри таблицы получают ссылку на [111 ], но нет идентификатора, связанного с компонентом, поэтому ссылка не будет работать.

Ссылка вне таблицы получает ссылку на form:j_idt5 и генерируется идентификатор j_id1:javax.faces.ViewState:0. Так что, хотя это действительно вызывает действие - корреляция link / id не совсем верна.

Так ясно, что рендерер может определить сгенерированный идентификатор для ссылки, но он никогда не устанавливает этот сгенерированный идентификатор на фактический компонент / тег. Это в некоторой степени проблема.

Решение проблемы

Решение в том, чтобы помочь JSF и обработчику представления выяснить путь к компоненту с действием. Вы можете сделать это, принудительно установив идентификатор при программной генерации ссылки на команду - внутри метода getTable() добавьте следующий код:

inlink.setId("link");

Это должно позволить рендереру отображать действительную страницу с ссылки на рабочие действия.

5
задан Jason Baker 27 September 2008 в 14:53
поделиться

6 ответов

Существует несколько основных вещей, которые можно сделать при приеме в классическое приложение ASP, но Вы, вероятно, закончите тем, что сожалели, что делали их.

  1. Устраните дубликат, включают файлы. Каждое классическое приложение ASP, которое я когда-либо видел, имело 5 страниц "login.asp" и 7 "datepicker.js" файлов и т.д. Выследите и удалите все дубликаты и затем измените ссылки в остальной части приложения по мере необходимости. Старайтесь сделать, разность проверяет каждый файл, поскольку Вы удаляете его - часто, дублированные файлы имеют незначительные различия, потому что исходный автор скопировал его и затем изменил просто копию. Это - большая вещь для Эволюции, но не так для кода.
  2. Создайте рациональную структуру папок и переместите все файлы в нее. Этот очевиден, но это - то, которое Вы будете больше всего сожалеть, что делали. Являются ли ссылки в приложении относительными или абсолютными, необходимо будет изменить большинство из них.
  3. Объедините весь Ваш включать файлы в один большой файл. Можно затем переупорядочить все функции логически и разбить их в отдельные, разумно названные файлы. Необходимо будет затем пройти страницу приложения страницей и выяснить то, чем включать операторы на каждой странице должны быть (или палка с одним файлом и просто включать ее на каждой странице - я не могу помнить, является ли это хорошей идеей в ASP). Я не могу постигать уровень боли, включенный здесь, и это предполагает, что существующие включают файлы, не делают интенсивное использование одноименного globals.

Я не сделал бы ни одного из этого. Для перефразирования Steve Yegge (я думаю), "нет ничего неправильно с классическим приложением ASP, которое не может быть исправлено с общим количеством, переписывают". Я очень серьезно отношусь к этому - я не думаю, что существует большая пустая трата времени программиста в этом мире, чем поддержание приложения ASP, и проблема просто ухудшается, поскольку ASP становится устаревшим.

14
ответ дан 18 December 2019 в 05:56
поделиться
  1. Используйте один файл для глобальных заголовков, и включает (позволяет, называют это t-head.asp). Этот файл включен во все файлы asp.
  2. Используйте один файл, чтобы сделать сайт визуальным глобальным заголовком (логотипы, меню, и т.д.) и включать его прямо позади. Позвольте называют это t-begin.asp
  3. Используйте один файл для создания сайта визуальным глобальным нижним колонтитулом (авторское право, аналитика Google, и т.д.) и закрывающий все отделения или таблицы открытый в t-begin.asp. Позволяет называют этот файл t-end.asp
  4. Используйте одну папку для помещения файлов бизнес-логики, названных ШИНОЙ. Файлы в этой папке не могут иметь, включает. Каждой функции в файле нужно предшествовать под названием логическое устройство (IE: вся функция в products.asp должна начаться с product_ *),
  5. Используйте одну папку для помещения, некоторые снова использовали код UI, названный UI. Файлы в этой папке не могут иметь, включает.

Пример:

<%@  Language=VBScript %>
<% Option Explicit %>
<% Response.Buffer = true%>
<html>
<head>
<!--#include file="../general/t-head.asp"-->
<!--#include file="../bus/product.asp"-->
<title>Products page</title>
</head>
<body>
<!--#include file="../general/t-begin.asp"-->

   <% 'all your code  %>

<!--#include file="../general/t-end.asp"--> 
</body>
</html>
3
ответ дан 18 December 2019 в 05:56
поделиться

Список пункта маркированного списка @MusiGenisis является хорошим советом следовать, но я не согласился бы с -

"Я не сделал бы ни одного из этого. Для перефразирования Steve Yegge (я думаю), "нет ничего неправильно с классическим приложением ASP, которое не может быть исправлено с общим количеством, переписывают". Я очень серьезно отношусь к этому - я не думаю, что существует большая пустая трата времени программиста в этом мире, чем поддержание приложения ASP, и проблема просто ухудшается, поскольку ASP становится устаревшим".

Очень хороший, но если это - значительное приложение прежней версии, делающее завершенный, переписывает, часто не возможно из-за отсутствия времени/ресурса разработчика.

У нас есть довольно большое классическое приложение ASP, которое вырастило руки и участки за эти годы, это не симпатично, но это действительно служит бизнес-потребностям. У нас нет времени проводить следующие шесть месяцев, делая полное, переписывают, это было бы хорошо, но просто не возможно. Наш подход -

  1. Где существует новая требуемая функциональность, она реализована в ASP.NET. Это происходит 95% времени. 5% пограничных случаев, обычно являющихся этим, существуют большое число очков, где новый код приложения касается старого приложения, требующего, чтобы мы сделали, много классического ASP переделывает потенциально создание более хрупкого приложения.

  2. Где существует изменение в функциональности, мы оцениваем, можем ли мы осуществить рефакторинг на ASP.NET с минимальным влиянием. Если это не будет возможно затем, то мы реализуем изменение в классическом ASP и уберем существующий код, поскольку мы продвигаемся, например, упрощение включают вложение файла, заменяя JavaScript большим количеством перекрестного браузера дружественный код, такая вещь.

В ответе на Ваш вопрос о #ifndef нет эквивалента, я боюсь.

10
ответ дан 18 December 2019 в 05:56
поделиться

я думаю, что необходимо считать перемещение кода от VBScript ASP до Visual Basic COM DLL. это упростит на Вас имеющий, слишком много включает.

0
ответ дан 18 December 2019 в 05:56
поделиться

Ничего себе. Меня постоянно удивляет, у сколько людей есть ненависть к ASP. В достойных руках это - совершенно способный язык для разработки веб-приложений.

Однако я признаю, что путь включает файлы, управляются в ASP, может быть что-то вроде brainache - потому что (в зависимости от того, как Вы используете их) они должны быть загружены и проанализированы, даже если Вы не используете половину функций, содержавших в.

Я склонен иметь, каждый включает файл (initialise.asp или некоторые такой), который самостоятельно включает ссылки на несколько библиотек функций (lib_http.asp, lib_mssql.asp или подобный), и все библиотечные функции являются автономными, таким образом, нет никакого беспокойства о пересекающихся переменных. Любой глобальный Вар объявляется и устанавливается в основном файле. Это означает, что я могу использовать функцию где угодно, любое время и не волноваться о том, где она была определена, это просто там для использования. И IDE, такие как Visual Studio и Primalscript имеют способность "перейти к определению" при нахождении вызова к функции, которую Вы не распознаете.

Затем любой определенный для сценария включает, включены в сценарий после того, как вызов этому ведущему устройству включает файл.

Я признаю, что это - требующий много памяти подход, поскольку все функции во всех библиотеках компилируются для каждого вызова сценария, таким образом, совершенствование потребностей метода для каждого сайта, который Вы разрабатываете - решает, что звонить через ведущее устройство, включают и что является более определенным для страницы. Было бы хорошо смочь только загрузить то, в чем Вы нуждаетесь - но это - подход DLL и не доступно для большинства реальных разработок, и также необходимо было бы уравновесить стоимость процессора компиляции маленьких сценариев по сравнению с загружающимися компонентами.

Краткая структура каталогов является необходимым и легко разработанный, но это может быть тяжелая работа, чтобы пробраться через весь код в существующем сайте и изменить любые ссылки или вызовы mappath. Кроме того, знайте, что некоторые администраторы IIS запрещают '..\' метод пересекающих каталогов через VBScript, таким образом все ссылки на файл должны быть полными путями.

1
ответ дан 18 December 2019 в 05:56
поделиться

Я не знаю о способе предотвратить двойное включение кроме получения сообщения об ошибке, которое является. Вы - наблюдение, включает помещенный всюду по странице, которая делает их трудными определить?

Так же, как в стороне, Вы работаете с копией кода и базы данных по серверу разработки? На основе моего опыта первое, что нужно сделать является отдельным самостоятельно от живого сайта как можно скорее. В то время как стычка первоначально, это даст Вам свободу внести изменения, не портя живой сайт. Легко делать то крошечным изменением во включении и BAM! целый сайт понижается.

Я работал через несколько проектов как, Вы описали и использовали следующие стратегии:

Завершенный переписывают - прекрасный, когда существует время/деньги, но обычно я получаю вызов, когда что-то пошло не так, как надо, и результаты необходимы как можно скорее.

Меньшие проекты - я открываю все в IDE и только начинаю искать все файлы проекта functions/sub для создания знания включать логики. В значительной степени каждый раз, все распространено везде, таким образом, я начинаю восстанавливать включение, организованное бизнес-логикой. Я также натыкался на встроенный код (необработанный код, не нижние индексы или функции) брошенный во включение, таким образом, я буду обычно просто задерживать код в страницу для рефакторинга позже.

Большие проекты - я буду использовать некоторый код, у меня есть наложение вокруг, чтобы проанализировать включение для строк с sub/function заголовками и вывести тех, которые к текстовому файлу для создания списка того, что - стандартные программы то, где и относятся к этому. Это пригождается, когда у Вас есть тонна, включает на каждой странице и не может получить Вашу голову вокруг кодовой базы.

0
ответ дан 18 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: