Чтобы понять, что mod_rewrite вам сначала нужно понять, как работает веб-сервер. Веб-сервер отвечает на HTTP-запросы . HTTP-запрос на самом базовом уровне выглядит следующим образом:
GET /foo/bar.html HTTP/1.1
Это простой запрос браузера на веб-сервер с запросом URL /foo/bar.html
. Важно подчеркнуть, что он не запрашивает файл , он запрашивает только некоторые произвольные URL-адреса. Запрос также может выглядеть так:
GET /foo/bar?baz=42 HTTP/1.1
Это так же верно, как и запрос на URL-адрес, и он явно не имеет ничего общего с файлами.
Веб-сервер это приложение, прослушивающее порт, прием HTTP-запросов, поступающих на этот порт, и возвращение ответа. Веб-сервер полностью может отвечать на любой запрос любым способом, который он считает нужным / каким-либо образом вы настроили его для ответа. Этот ответ не является файлом, это HTTP-ответ , который может или не может иметь ничего общего с физическими файлами на любом диске. Веб-сервер не обязательно должен быть Apache, есть много других веб-серверов, которые являются всего лишь программами, которые работают постоянно и привязаны к порту, который отвечает на HTTP-запросы. Вы можете написать его самостоятельно. Этот параграф был предназначен для развода с любым понятием, что URL-адреса напрямую равны файлам, что действительно важно для понимания. :)
Конфигурация по умолчанию для большинства веб-серверов - это поиск файла, который соответствует URL-адресу на жестком диске. Если document root сервера установлен, скажем, /var/www
, он может посмотреть, существует ли файл /var/www/foo/bar.html
и обслуживать его, если это так. Если файл заканчивается на «.php», он вызовет интерпретатор PHP и , после чего вернет результат. Вся эта ассоциация полностью настраивается; файл не должен заканчиваться на «.php» для веб-сервера для запуска его через интерпретатор PHP, и URL-адрес не должен соответствовать конкретному файлу на диске, чтобы что-то произошло.
mod_rewrite - это способ переписать внутреннюю обработку запросов. Когда веб-сервер получает запрос на URL /foo/bar
, вы можете переписать этот URL-адрес на что-то еще, прежде чем веб-сервер будет искать файл на диске в соответствии с ним. Простой пример:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Это правило говорит всякий раз, когда запрос соответствует «/ foo / bar», перепишите его на «/foo/baz". Затем запрос будет обработан как если бы /foo/baz
был запрошен. Это может быть использовано для различных эффектов, например:
RewriteRule (.*) $1.html
Это правило соответствует чему-либо (.*
), а захватывает it ((..)
), а затем перезаписывает его добавьте «.html». Другими словами, если /foo/bar
был запрошенным URL-адресом, он будет обрабатываться так, как будто запрошено /foo/bar.html
. См. http://regular-expressions.info для получения дополнительной информации о сопоставлении регулярных выражений, захвате и замене.
Другое часто встречающееся правило:
RewriteRule (.*) index.php?url=$1
Это опять-таки сопоставляет что-либо и переписывает его в файл index.php с первоначально запрошенным URL-адресом, добавленным в параметр запроса url
. Т.е. для любых входящих и входящих запросов файл index.php выполняется, и этот файл будет иметь доступ к исходному запросу в $_GET['url']
, поэтому он может делать с ним что угодно.
В первую очередь вы помещаете эти правила перезаписи в свой конфигурационный файл веб-сервера .
* Если разрешено первичным Apache, то вы можете поместить их в файл с именем .htaccess
в корне вашего документа (т. Е. Рядом с вашими файлами .php). Файл конфигурации; это необязательно, но часто разрешено.
mod_rewrite не волшебным образом делает все ваши URL «хорошенькими». Это распространенное недоразумение. Если у вас есть эта ссылка на вашем веб-сайте:
нет ничего, что мог бы сделать mod_rewrite, чтобы сделать это красиво. Чтобы сделать это красивой ссылкой, вы должны:
/my/pretty/link
, используя любой из описанных выше методов. (Можно использовать mod_substitute
для преобразования исходящих HTML-страниц
Существует много возможностей mod_rewrite и очень сложные правила соответствия, которые вы можете создать, включая цепочку нескольких переписываний, проксирование запросов на совершенно другую услугу или машину, возврат определенных кодов статуса HTTP в виде ответов, перенаправление запросов и т. д. Это очень мощный и может быть использован для хорошего использования, если вы понимаете основной механизм запроса HTTP-ответа. Он не автоматически делает ваши ссылки симпатичными.
См. Официальную документацию для всех возможных флагов и опций.
Сбой проверки с сообщением «form: location: Ошибка проверки: значение недопустимо»
blockquote>Эта ошибка сводится к тому, что выбранная элемент не соответствует ни одному из доступных значений элемента выбора, указанного любым вложенным тегом
<f:selectItem(s)>
во время обработки запроса на отправку формы.Как часть защиты от подделанных / взломанных запросов, JSF будет повторять все доступные выберите значения элемента и проверьте, если
selectedItem.equals(availableItem)
возвращаетtrue
для хотя бы одного доступного значения элемента. Если значение одного элемента не совпадает, вы получите именно эту ошибку проверки.Этот процесс находится под обложками в основном так, как показано ниже, в соответствии с тем, что
bean.getAvailableItems()
представляет собой полный список доступных элементов выбора, определенных в<f:selectItem(s)>
:String submittedValue = request.getParameter(component.getClientId()); Converter converter = component.getConverter(); Object selectedItem = (converter != null) ? converter.getAsObject(context, component, submittedValue) : submittedValue; boolean valid = false; for (Object availableItem : bean.getAvailableItems()) { if (selectedItem.equals(availableItem)) { valid = true; break; } } if (!valid) { throw new ValidatorException("Validation Error: Value is not valid"); }
Итак, на основе по логике выше эта проблема может логически иметь по крайней мере следующие причины:
- Выбранный элемент отсутствует в списке доступных элементов.
- Метод
equals()
класса, представляющего выбранный элемент, отсутствует или сломан.- Если задействован пользовательский
Converter
, он возвращает неправильный объект вgetAsObject()
. Возможно, это дажеnull
.Чтобы решить эту проблему:
- Убедитесь, что точно такой же список сохранен во время последующего запроса, особенно в случае несколько каскадных меню. Создание бина
@ViewScoped
вместо@RequestScoped
должно исправить его в большинстве случаев. Также убедитесь, что вы не выполняете бизнес-логику в методе getter<f:selectItem(s)>
, а вместо этого в@PostConstruct
или методе действия (слушателя). Если вы полагаетесь на конкретные параметры запроса, вам нужно будет явно хранить их в компоненте@ViewScoped
или повторно передать их при последующих запросах, например.<f:param>
. См. Также Как выбрать правильную область видимости бобов?- Убедитесь, что метод
equals()
реализован правильно. Это уже сделано на стандартных Java-типах, таких какjava.lang.String
,java.lang.Number
и т. Д., Но необязательно на пользовательских объектах / beans / entites. См. Также Правильный способ выполнения равного контракта . Если вы уже используетеString
, убедитесь, что кодировка символов запроса настроена правильно. Если он содержит специальные символы, а JSF сконфигурирован для визуализации вывода как UTF-8, но интерпретирует входные данные, например. ISO-8859-1, то он потерпит неудачу. См. Также a.o. Вход Unicode, полученный через входные компоненты PrimeFaces, поврежден .- Отлаживать / регистрировать действия вашего пользовательского
Converter
и исправлять его соответствующим образом. Для рекомендаций см. Также Значение параметра ошибки преобразования для 'null Converter' Если вы используетеjava.util.Date
в качестве доступных элементов с<f:convertDateTime>
, убедитесь, что вы не забыли полную часть времени в шаблоне. См. Также "Ошибка проверки: значение недействительно" ОшибкаСм. также:
- Наша страница
]selectOneMenu
wiki- Как заполнить параметры h: selectOneMenu из базы данных?
- Сделать несколько зависимых / каскадных selectOneMenu списков в JSF
Если кто-то может бросить некоторые советы по устранению неполадок / отладки для этой проблемы, это будет очень полезно.
blockquote>Просто задайте здесь ясный и конкретный вопрос. Не задавайте слишком широких вопросов;)
В моем случае я забыл реализовать правильные методы get / set. Это произошло потому, что я изменил множество атрибутов в процессе разработки.
Без надлежащего метода get JSF не может восстановить выбранный вами элемент и, как это делает BalusC, в пункте 1 его ответа:
1. Выбранный элемент отсутствует в списке доступных элементов. Это может произойти, если список доступных элементов обслуживается компонентом с включенным запросом, который неправильно повторно инициализируется при последующем запросе или неправильно выполняет деловое задание внутри метода getter, что приводит к тому, что он каким-то образом возвращает другой список.
blockquote>
Это может быть проблема с конвертером или проблема с DTO. Попробуйте решить это, добавив методы hashCode () и equals () в ваш объект DTO; В приведенном выше сценарии вы можете сгенерировать эти методы в классе объекта Location, который указывается здесь как «DTO».
Пример:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (id ^ (id >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Location other = (Location) obj;
if (id != other.id)
return false;
return true;
}
equals
происходит. Моя ситуация немного сложна. Я создаю свой собственный пользовательский компонент, который позволяет пользователю иметь сложную компоновку радио. Он отлично работает, если у меня есть только одна радиогруппа (f: selectItems прямо под моим настраиваемым компонентом). Однако по мере того, как макет становится более сложным (несколько групп радиостанций, каждый из них имеет свои собственные f: selectItems, но все имеют один и тот же выбор), я должен иметь f: selectItems внутри ui: repeat, тогда ui: repeat находится под моим пользовательским компонентом. Затем я столкнулся с этой проблемой. Я хочу увидеть код mojarra, который обрабатывает это – Thang Pham 17 November 2012 в 01:18