#jquery #ajax #jsf
#jquery #ajax #jsf
Вопрос:
Я столкнулся с проблемой при использовании комбинации jquery ajax и jsf. Я не совсем уверен, что это обычная проблема и с ней можно справиться, но надеюсь получить решение.
вот сценарий. мы разрабатываем проект портала с помощью jsf. таким образом, на странице нам приходится загружать огромные данные в виде строк в таблице (иногда 300-400 appx), и в каждой строке будет ссылка, которая должна открывать всплывающее окно. итак, чтобы не снизить производительность страницы, я планирую отложить загрузку jsp (всплывающего содержимого). поэтому я решил использовать ajax. jsp содержит теги jsf, которые не распознаются загрузкой ajax. Я понимаю, что когда jsp загрузится с помощью ajax, это будет простая / независимая (не подтвержденная jsf’ом) версия.
итак, мой вопрос: как я могу сделать jsp (всплывающее содержимое) в этом сценарии jsf’подтвержденным, чтобы теги jsf могли быть видны.
в настоящее время я получаю не удается найти FacesContext.
я использую следующий код:
jQuery.ajax({
type: "GET",
cache: false,
contentType: "text/html; charset=ISP-8859-1" ,
url: '<%=renderResponse.encodeURL(renderRequest.getContextPath() "/tempfolder/tempLoader.jsp") %>',
data:{param1:66, param2:88},
success:function(msg) {
jQuery(".loadContent").html(msg);
jQuery("#viewpopupdiv").children().show();
}
});
И мой jsp:
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@taglib uri="http://www.ibm.com/jsf/html_extended" prefix="hx"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<div id="view" style="text-align:left">
<table class="viewpopupdiv" style="width:480px;background-color:#efedea;border-width: thin; border-color: #ff6633; border-style:solid;" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<table style="width:100%">
<tr>
<td>
<table style="width:100%;background-color:#424341;">
<tr>
<td class="editLineHeaderDarkLeft">
<span class="">Line ID</span> :amp;nbsp;<span class="headerValueForPopup"><%=lineDetails.getDisplayableOrderLineId()%></span></td>
<td class="editLineHeaderDarkCenter">
<span class="">Order Number</span> :amp;nbsp;<span class="orderNumberHeaderValueForPopup"><%=lineDetails.getDisplayableOrderHeaderId()%></span></td>
<td class="editLineHeaderDarkRight"><div href="#" onclick="closePopupForEditLine('closepopupdiv')"><img class="close" src='<%=imgURL%>' border="0"></div>
</td>
</tr>
</table>
<td class="editLineHeaderDarkLeft">
<div class="chargeTypeDropListJQ">
<h:selectOneMenu value="#{popupBean.chargeTypeId}" styleClass="selectOneMenu">
<f:selectItems value="#{popupBean.chargeType}" />
</h:selectOneMenu>
</div>
</td>
</tr>
</table>
</td></tr></table></div>
Комментарии:
1. просто к вашему сведению. мы используем фреймворк jsf1.2 core. поэтому я даже не могу использовать ajax4jsf.
2. richfaces 3.3 отлично работает с jsf 1.2, поэтому вы можете использовать a4j, если хотите. Это не ответ на ваш вопрос, но я подумал, что должен упомянуть об этом.
3. Спасибо, Дэйв. На самом деле клиент, по крайней мере, в течение некоторого времени, не готов вводить какие-либо новые функции. поэтому было интересно, могу ли я найти какой-либо обходной путь для того, что я делаю.
Ответ №1:
не удается найти FacesContext
Вы получите это исключение при запуске страницы JSP с компонентами JSF как «простого ванильного» JSP без вызова FacesServlet
. Он отвечает за создание FacesContext
. URL запроса должен соответствовать <url-pattern>
из FacesServlet
, как это было определено в web.xml
, чтобы все теги JSF выполнялись должным образом.
Предполагая, что шаблон URL является *.jsf
, тогда вам нужно изменить
url: '<%=renderResponse.encodeURL(renderRequest.getContextPath() "/tempfolder/tempLoader.jsp") %>',
Для
url: '<%=renderResponse.encodeURL(renderRequest.getContextPath() "/tempfolder/tempLoader.jsf") %>',
Комментарии:
1. Спасибо BalusC. Я тоже пытался сделать то, что вы указали выше. по-прежнему безуспешно. На самом деле у нас есть шаблон URL, определенный как /portlet /*. как показано ниже: <имя сервлета> Сталкивается с сервлетом</servlet-name> <url-шаблон>/ портлет /*</url-шаблон>. итак, я использовал это для тестирования: url: ‘<%=RenderResponse.encodeURL(RenderRequest.getContextPath() «/portlet / tempLoader.jsp») %>’,
2. tempfolder — это папка моего рабочего пространства, в которой находится jsp. я уверен, что способ, которым я получаю доступ: url: ‘<%=RenderResponse.encodeURL(RenderRequest.getContextPath() «/ portlet / tempLoader.jsp») %>’ неверен. Пожалуйста, поправьте меня, указав правильный URL. я сомневаюсь в «/ portlet / tempLoader.jsp».
3. Я имею в виду, что это было в вашем исходном URL, но больше не в вашем новом URL. Разве это не должно быть
/portlet/tempfolder/tempLoader.jsp
?4. @BalusC: я пытался сохранить /portlet /tempfolder /tempLoader.jsp, но все равно это не сработало. Ну, я вижу открытие страницы, но я не вижу компоненты, специфичные для тега jsf. на странице также есть некоторые html-элементы, они отображаются правильно, но когда дело доходит до jsf- нет. на консоли я вижу исключение с нулевым указателем.
5. Я не уверен, что вы слишком упростили код JSP или нет, но для тегов JSF требуется
<f:view>
корневой тег.