Поместите компонент в область видимости и избавьтесь от любой бизнес-логики в методах getter.
Компонент должен быть помещен в область представления, чтобы все предыдущие выборы и новые доступные элементы были запомнены, в противном случае что-то не удастся, если, например, rendered
атрибут зависит от условия, которое было задано только в предыдущем запросе, или если JSF должен проверить выбранный элемент по списку доступных элементов.
Методы getter не должны содержать никакой бизнес-логики, поскольку они также будет использоваться во время ao фаза проверки. Вы должны использовать
для выполнения бизнес-логики на основе изменения. Вы должны в методе слушателя также явно очистить выбранные значения дочерних выпадающих списков. Вы можете использовать
для обновления содержимого дочерних выпадающих списков.
Таким образом, так:
с
@ManagedBean
@ViewScoped
public class Nodes {
private String selectedState; // getter+setter
private String selectedCity; // getter+setter
private String selectedRegion; // getter+setter
private String selectedStation; // getter+setter
private List availableStates; // getter (no setter necessary!)
private List availableCities; // getter (no setter necessary!)
private List availableRegions; // getter (no setter necessary!)
private List availableStations; // getter (no setter necessary!)
@EJB
private SomeService someService;
@PostConstruct
public void init() {
availableStates = someService.listStates();
}
public void changeState(AjaxBehaviorEvent event) {
availableCities = someService.listCities(selectedState);
selectedCity = selectedRegion = selectedStation = null;
availableRegions = availableStations = null;
}
public void changeCity(AjaxBehaviorEvent event) {
availableRegions = someService.listRegions(selectedCity);
selectedRegion = selectedStation = null;
availableStations = null;
}
public void changeRegion(AjaxBehaviorEvent event) {
availableStations = someService.listStations(selectedRegion);
selectedStation = null;
}
// Generate necessary getters+setters here. You should not change them.
}
Если Вы хотите обзор MD5 и имеете Инди установленные компоненты, можно сделать это:
uses SysUtils, IdGlobal, IdHash, IdHashMessageDigest;
with TIdHashMessageDigest5.Create do
try
Result := TIdHash128.AsHex(HashValue('Hello, world'));
finally
Free;
end;
самые популярные алгоритмы поддерживаются в Пакет Криптографии Дельфи :
DCPCrypt
теперь сохраняется , Warren Postma и источник может быть найден здесь .
Если вы хотите, чтобы строка хеша MD5 была шестнадцатеричной, и у вас установлено Delphi XE 1 , то есть у вас есть компоненты Indy 10 .5.7, которые вы можете сделать это. :
использует IdGlobal, IdHash, IdHashMessageDigest;
class function getMd5HashString(value: string): string;
var
hashMessageDigest5 : TIdHashMessageDigest5;
begin
hashMessageDigest5 := nil;
try
hashMessageDigest5 := TIdHashMessageDigest5.Create;
Result := IdGlobal.IndyLowerCase ( hashMessageDigest5.HashStringAsHex ( value ) );
finally
hashMessageDigest5.Free;
end;
end;
Я обычно использую DCPCrypt2 ( Пакет Криптографии Дельфи ) от David Barton ( Город в Небе ).
Это, также содержит следующие Алгоритмы шифрования:
DCPCrypt
теперь сохраняется , Warren Postma и источник может быть найден здесь .
Это модификация ответа devstopfix, которая была принята.
В текущей версии Indy вы можете легко хешировать строки и потоки. Пример:
function MD5String(str: String): String;
begin
with TIdHashMessageDigest5.Create do
try
Result := HashStringAsHex(str);
finally
Free;
end;
end;
Используйте HashString
, HashStringAsHex
, HashBytes
, HashBytesAsHex
, HashStream
, HashStreamAsHex
. Преимущество заключается в том, что вы также можете указать кодировку текста
Вы также можете использовать WindowsCrypto API с Delphi:
Там есть подразделение, которое оборачивает все CryptoAPI. Вы также можете использовать Lockbox, который теперь с открытым исходным кодом.
В конце концов, вы можете поддерживать практически любые алгоритмы хэширования с Delphi. Пример Indy, вероятно, ближе всего к Delphi, поскольку Indy включен в большинство версий Delphi. В остальном вам нужно будет либо использовать библиотеку, либо написать больше кода для доступа к CryptoAPI или реализовать его самостоятельно.