Существует три основные причины.
FacesServlet
не вызывается. FacesServlet
mapping . URL-адрес ссылки (URL-адрес, который вы видите в адресной строке браузера) должен соответствовать
файла FacesServlet
, как определено в web.xml
чтобы все работы JSF выполнялись. FacesServlet
- это тот, который отвечает за разбор файла XHTML, сбор представленных значений формы, выполнение преобразования / проверки, обновление моделей, вызывание действий и создание выходных данных HTML. Если вы не вызываете FacesServlet
по URL-адресу, то все, что вы получили (и увидите через rightclick, View Source в браузере), действительно является исходным исходным кодом XHTML.
Если
, например, *.jsf
, ссылка должна указывать на /register.jsf
, а не на /register.xhtml
. Если это, например, /faces/*
, как и у вас, ссылка должна указывать на /faces/register.xhtml
, а не на /register.xhtml
. Один из способов избежать этой путаницы - просто изменить
с /faces/*
на *.xhtml
. Таким образом, нижестоящее является идеальным отображением:
facesServlet
javax.faces.webapp.FacesServlet
facesServlet
*.xhtml
Если вы по какой-то причине не можете поменять
на *.xhtml
, то вы, вероятно, также хотели бы, чтобы конечные пользователи не могли напрямую обращаться к источнику XHTML кодировать файлы по URL-адресу. В этом случае вы можете добавить
в
в *.xhtml
с пустым
в web.xml
, который предотвращает это:
Restrict direct access to XHTML files
XHTML files
*.xhtml
Предстоящий JSF 2.3 решит все из вышеперечисленного, автоматически регистрируя FacesServlet
в шаблоне URL-адреса *.xhtml
во время запуска webapp.
. С введением JSF 2.2 еще одна вероятная причина заключается в том, что пространства имен XML не соответствуют версии JSF. xmlns.jcp.org
, как показано ниже, является новым с JSF 2.2 и не работает в старых версиях JSF. Символы почти такие же, как если бы FacesServlet
не вызывался.
Если вы не можете перейти на JSF 2.2, вам нужно вместо этого использовать старые пространства имен java.sun.com
XML:
. Еще одна вероятная причина заключается в том, что несколько реализаций JSF были загружены вашим webapp, конфликтуя и разлагая друг друга. Например, когда ваш путь к классу среды выполнения Webapp загрязнен несколькими различными версиями JSF-библиотек или в конкретной комбинации Mojarra 2.x + Tomcat 8.x, когда в файле web.xml
веб-приложения есть ненужная запись ConfigureListener
, вызывающая ее загрузку дважды.
com.sun.faces.config.ConfigureListener
При использовании Maven убедитесь, что вы правильно определяете зависимости и понимаете области зависимостей. Важно: не связывайте зависимости в webapp, если они уже предоставлены целевым сервером.
JSF имеет очень крутую кривую обучения для тех, кто не знаком с базовыми HTTP , HTML и сервлетами . В Интернете много ресурсов низкого качества. Пожалуйста, игнорируйте фрагменты скриншотов кода, поддерживаемые любителями, в основном ориентированные на доход от рекламы, а не на обучение, такие как розы, учебник, javabeat и т. Д. Они легко узнаваемы, нарушая рекламные ссылки / баннеры. Также, пожалуйста, игнорируйте ресурсы, связанные с юрским JSF 1.x. Они легко узнаваемы с помощью JSP-файлов вместо файлов XHTML. JSP как технология просмотра устарела с тех пор, как JSF 2.0 уже в 2009 году.
Чтобы начать правильно, начните с нашей вики-страницы JSF и закажите авторитетную книгу .
Если это - что-то, что Вы заканчиваете тем, что часто делали, и с различными операциями, необходимо, вероятно, создать класс, чтобы обработать случаи как это или лучше пользоваться некоторой библиотекой как Numpy.
Иначе, ищите понимания списка используемый с zip встроенная функция:
[a_i - b_i for a_i, b_i in zip(a, b)]
Немного отличающийся Векторный класс.
class Vector( object ):
def __init__(self, *data):
self.data = data
def __repr__(self):
return repr(self.data)
def __add__(self, other):
return tuple( (a+b for a,b in zip(self.data, other.data) ) )
def __sub__(self, other):
return tuple( (a-b for a,b in zip(self.data, other.data) ) )
Vector(1, 2, 3) - Vector(1, 1, 1)
Если у Вас есть два списка, названные и 'b', можно сделать: [m - n for m,n in zip(a,b)]
Я должен был бы рекомендовать , NumPy также
Не только является этим быстрее для того, чтобы сделать векторную математику, но и это также имеет тонну функций удобства.
, Если Вы хотите что-то еще быстрее для 1d векторы, попробуйте vop
, Это подобно MatLab, но свободно и материал. Вот пример того, что Вы сделали бы
from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]
Бум.
Если Ваши списки являются a и b, можно сделать:
map(int.__sub__, a, b)
, Но Вы, вероятно, не были должны. Никто не будет знать то, что это означает.
Вот альтернатива для списка пониманий. Карта выполняет итерации через список (списки) (последние аргументы), делая так одновременно, и передает их элементы как аргументы функции (первый аргумент). Это возвращает получающийся список.
map(operator.sub, a, b)
Этот код, потому что имеет меньше синтаксиса (который более эстетичен для меня), и по-видимому это на 40% быстрее для списков длины 5 (см. комментарий bobince). Однако, любое решение будет работать.
Если бы Вы планируете выполнение более, чем простого лайнеры, было бы лучше реализовать Ваш собственный класс и переопределить соответствующие операторы, поскольку они относятся к Вашему случаю.
Взятый от Математика в Python :
class Vector:
def __init__(self, data):
self.data = data
def __repr__(self):
return repr(self.data)
def __add__(self, other):
data = []
for j in range(len(self.data)):
data.append(self.data[j] + other.data[j])
return Vector(data)
x = Vector([1, 2, 3])
print x + x