Если вы хотите сделать более простой способ вывода шестнадцатеричного числа, вы можете написать такую функцию:
Обновленная версия представлена ниже; есть два способа: базовый индикатор 0x
может быть вставлен, со сносками, детализирующими различия между ними. Исходная версия сохраняется в нижней части ответа, чтобы не было неудобства для тех, кто ее использовал.
Обратите внимание, что как для обновленных, так и для оригинальных версий может потребоваться некоторый пошив для систем, в которых размер байта является многократно из 9 бит.
namespace detail {
constexpr int HEX_DIGIT_BITS = 4;
//constexpr int HEX_BASE_CHARS = 2; // Optional. See footnote #2.
// Replaced CharCheck with a much simpler trait.
template struct is_char
: std::integral_constant::value ||
std::is_same::value ||
std::is_same::value> {};
}
template
std::string hex_out_s(T val) {
using namespace detail;
std::stringstream sformatter;
sformatter << std::hex
<< std::internal
<< "0x" // See footnote #1.
<< std::setfill('0')
<< std::setw(sizeof(T) * CHAR_BIT / HEX_DIGIT_BITS) // See footnote #2.
<< (is_char::value ? static_cast(val) : val);
return sformatter.str();
}
Его можно использовать следующим образом:
uint32_t hexU32 = 0x0f;
int hexI = 0x3c;
unsigned short hexUS = 0x12;
std::cout << "uint32_t: " << hex_out_s(hexU32) << '\n'
<< "int: " << hex_out_s(hexI) << '\n'
<< "unsigned short: " << hex_out_s(hexUS) << std::endl;
См. обе опции (как указано в сносках ниже) live: здесь .
Сноски:
<< "0x"
<< std::showbase
Первая опция будет отображаться неправильно для пользовательские типы, которые пытаются вывести отрицательные шестнадцатеричные числа как -0x##
, а не как
, при этом знак отображается после базы (как 0x-##
), а не перед ней. Это очень редко проблема, поэтому я лично предпочитаю этот вариант. Если это проблема, то при использовании этих типов вы можете проверить отрицательность перед выводом базы, а затем использовать abs()
(или пользовательский abs()
, который возвращает значение без знака , если вам нужно чтобы иметь возможность обрабатывать наиболее отрицательные значения в системе дополнений 2) на val
. Второй вариант будет опускать базу, когда val == 0
, отображая (например, для int
, где int
- 32 бита) 0000000000
вместо ожидаемого 0x00000000
. Это происходит из-за того, что флаг showbase
обрабатывается как printf()
#
. Если это проблема, вы можете проверить, есть ли val == 0
, и применять специальную обработку, когда это происходит. << "0x"
, тогда HEX_BASE_CHARS
не требуется, и его можно опустить. Если используется << std::showbase
, то значение, указанное в setw()
, должно учитываться для этого: << std::setw((sizeof(T) * CHAR_BIT / HEX_DIGIT_BITS) + HEX_BASE_CHARS)
Исходная версия выглядит следующим образом:
// Helper structs and constants for hex_out_s().
namespace hex_out_helper {
constexpr int HEX_DIGIT_BITS = 4; // One hex digit = 4 bits.
constexpr int HEX_BASE_CHARS = 2; // For the "0x".
template struct CharCheck {
using type = T;
};
template<> struct CharCheck {
using type = char;
};
template<> struct CharCheck {
using type = char;
};
template using CharChecker = typename CharCheck::type;
} // namespace hex_out_helper
template std::string hex_out_s(T val) {
using namespace hex_out_helper;
std::stringstream sformatter;
sformatter << std::hex
<< std::internal
<< std::showbase
<< std::setfill('0')
<< std::setw((sizeof(T) * CHAR_BIT / HEX_DIGIT_BITS) + HEX_BASE_CHARS)
<< (std::is_same, char>{} ? static_cast(val) : val);
return sformatter.str();
}
, который затем можно использовать следующим образом:
uint32_t hexU32 = 0x0f;
int hexI = 0x3c;
unsigned short hexUS = 0x12;
std::cout << hex_out_s(hexU32) << std::endl;
std::cout << hex_out_s(hexI) << std::endl;
std::cout << "And let's not forget " << hex_out_s(hexUS) << std::endl;
Рабочий пример: здесь .
javax.el.PropertyNotFoundException: свойство 'foo' не найдено в типе com.example.Bean
blockquote>Это буквально означает, что упомянутый класс
com.example.Bean
не имеет общедоступный (нестатический!) метод getter для указанного свойстваfoo
. Обратите внимание, что само поле здесь не имеет значения!Имя открытого метода getter должно начинаться с
get
, за которым следует имя свойства, которое имеет заглавные буквы только в первой букве имени свойства, как вFoo
.public Foo getFoo() { return foo; }
Таким образом, вам необходимо убедиться, что существует метод получения, точно соответствующий имени свойства, и что метод
public
(неstatic
) и что метод не принимать любые аргументы и возвращать неvoid
. Если у вас есть один, и он по-прежнему не работает, то есть вероятность, что вы были заняты редактированием кода вперед и назад без прочной очистки сборки, восстановления кода и повторного развертывания / перезапуска приложения. Вы должны убедиться, что вы это сделали.Для свойств
boolean
(неBoolean
!) Имя метода getter должно начинаться сis
вместоget
.public boolean isFoo() { return foo; }
Независимо от типа, наличие самого поля
foo
, таким образом, не имеет значения. Он может иметь другое имя или быть полностью отсутствующим или даже бытьstatic
. Все ниже должно быть доступно${bean.foo}
.public Foo getFoo() { return bar; }
public Foo getFoo() { return new Foo("foo"); }
public Foo getFoo() { return FOO_CONSTANT; }
Понимаете, это не то, что подсчет, но сам метод геттера. Обратите внимание, что само имя свойства не должно быть капитализировано в EL. Другими словами,
${bean.Foo}
никогда не будет работать, это должно быть${bean.foo}
.См. Также:
- javax.el.PropertyNotFoundException: Свойство 'foo' не читается в виде java.lang.Boolean
- Как язык выражения Java решает логические атрибуты? (в JSF 1.2)
- Идентификация и решение javax.el.PropertyNotFoundException: Target Unreachable
- Выведенный код Facelets по-прежнему вызывает EL выражения типа # {bean.action ()} и вызывает javax.el.PropertyNotFoundException на # {bean.action}
Я считаю, что идентификаторы доступа не соответствуют соглашениям об именах бинов, и поэтому исключение выбрано. Они должны быть следующими:
public Integer getId() { return id; }
public void setId(Integer i){ id= i; }
Я столкнулся с аналогичным типом проблемы: Code Snippet:
<c:forEach items="${orderList}" var="xx">
${xx.id} <br>
</c:forEach>
После списка заказов было следующее: «$ {orderList}», из-за чего переменная xx скрывалась в String и не могла вызвать xx.id.
Поэтому убедитесь, что в пространстве. Иногда они играют решающую роль. : Р
com.pool.app.domain.Pool
такого метода нет. Вы должны убедиться, что он имеет этот метод или убедиться, что вы ссылаетесь на правильное имя свойства в EL. – BalusC 20 December 2011 в 17:42getPoolQuestion()
вPool
и используйте${pool.poolQuestion.answer}
, как в вашем сообщении об ошибке? Тем не менее, я предлагаю пройти через базовый учебник / книгу и поместить все концепции отдельно, а не рассматривать это как одну вещь. Проблема дизайна модели в свою очередь не связана с JSP / JSTL / EL. – BalusC 20 December 2011 в 17:55