Я пытаюсь выяснить, как перенаправить обратно к результатам поиска из функции JavaScript: в заголовке JSP, который отображается для данного результата поиска, есть ссылка «Вернуться к списку результатов», по которой можно щелкнуть, чтобы вернуться к результаты поиска. После перехода на формат контроллера ModelAndView
кажется, что эта ссылка возврата больше не работает и теперь просто возвращает пустую белую страницу. Я пробовал возиться с базовыми контроллерами и отлаживать некоторые из них, но не совсем понимаю, почему он пуст. Мне кажется, я здесь что-то не понимаю, но не знаю, что именно.
searchResultHeading.jsp — это jsp, внутри которого есть заголовок, содержащий рассматриваемую ссылку.
<%if (ApplicationBean.getBizActivityAuthorizations().ResultBasicInfo() && !ApplicationBean.isInExternalAppContext()) { %>
| <a href = "javaScript:returnToResultList();" class=sm>Return to Result list</a>
<% } %>
</td>
</tr>
Header.jsp — еще один jsp, который содержит массу общих вещей и функций. Функция returnToResultList
находится внутри.
function returnToResultList()
{
<%if (ApplicationBean.isSearchResultsAvailable()){
%>
gotoSearchResults(document.userSelection);
<%
}else if (ApplicationBean.isMarketingListAvailable()){
%>
gotoListParticipants();
<%
}%>
}
function gotoSearchResults(searchForm)
{
searchForm.userAction.value = "<%=myLiterals.USER_ACTION_RETURN_TO_SEARCH_RESULTS_PAGE%>";
searchForm.action = "/mySite/GlobalNavigationController";
searchForm.submit();
return true;
}
Сам файл GlobalNavigationController.java находится ниже, и именно здесь я перенаправляюсь на различные контроллеры, которые отображают свои JSP.
@Controller
public class GlobalNavigationController {
@Autowired
private CustomerListController customerListController;
@RequestMapping(path = "/GlobalNavigationController", method = {RequestMethod.GET, RequestMethod.POST})
public ModelAndView doGet(HttpSession session, HttpServletRequest req, HttpServletResponse res) throws Exception
{
SiteBean myBean = new myBean();
try
{
RequestMapper.MapToBean(req,myBean);
if (myBean.getUserAction().equals(myLiterals.USER_ACTION_1))
{
return null;
}
else if (myBean.getUserAction().equals(myLiterals.USER_ACTION_2))
{
GlobalNavigationUCService.processSideNav();
GlobalNavigationUCService.resetDisPlayOrder();
return maintainController.doGet(session, req, res);
}
else if (myBean.getUserAction().equals(myLiterals.USER_ACTION_3))
{
GlobalNavigationUCService.processSideNavInitiateSearch();
GlobalNavigationUCService.resetDisPlayOrder();
return SearchController.doGet(session, req, res);
}
else if (myBean.getUserAction().equalsIgnoreCase(myLiteral.USER_ACTION_4))
{
GlobalNavigationUCService.processSideNavInitiateSearch();
GlobalNavigationUCService.processTabsGoToResults();
GlobalNavigationUCService.resetDisPlayOrder();
return ProfileController.doGet(session,req,res);
}
else if (myBean.getUserAction().equals(myLiterals.USER_ACTION_RETURN_TO_SEARCH_RESULTS_PAGE))
{
GlobalNavigationUCService.processTabsGoToResults();
return customerListController.doGet(session, req, res);
}
Обновлено:
Посмотрев на сведения о сети F12, я вижу, что полезная нагрузка в GlobalNav не передает новое пользовательское действие, определенное JavaScript. Но я определяю новое UserAction в функции. Возможно, что-то не сохраняется из того, как я настроил структуру модели и представления?
@RomanC В настоящее время в консоли нет ничего об исключениях. Я могу попробовать добавить Try-Catch к функции JavaScript и посмотреть, возвращает ли она исключение, а не сообщает о нем.
Я отладил его с помощью некоторых Try-Catches в функциях Javascript и не обнаружил никаких ошибок. Я думаю, что, как и отредактировал вышеизложенное, UserAction в форме не передается должным образом, и перенаправление ни к чему не приводит.
Вы отлаживали белую пустую страницу? Ошибка опубликована там.
У меня есть try-catch в GlobalNavController и контроллере SearchList, на который GlobalNav должен перенаправляться. Я поместил Try-Catches в функцию Javascript для вывода ошибок на консоль. Я не видел никаких исключений на вкладке сети моего браузера или в консоли моей IDE ни разу, когда я повторно запускал код и тестировал страницу. Единственное, что выглядело не так, это то, что в GlobalNavServlet на вкладке сети userAction не соответствует литералу, на который ссылается функция javascript. литерал, присваиваемый userAction, должен быть: 'returnToSearchResultsPage'
Эти литералы недоступны в вашем коде.
В верхней части Header.jsp мы импортируем файл литералов: <%@ page import = "com.webpage.literals.myLiterals" %>
Кажется, это работало до изменений в структуре ModelAndView-Controller.
Никто этого не знает, подумайте о том, чтобы создать минимально воспроизводимый пример.
Я понял, что происходит:
Когда был выполнен переход на структуру Spring MVC, это пользовательское действие считалось устаревшим, поскольку исходная функциональность устарела. В результате значение Redirect возвращалось нулевым. Флаг, на который ссылался JSP при вызове функции, всегда установлен для всего сайта как True
.
В результате мы не использовали функцию Javascript внутри условия if, показанного выше, а вместо этого использовали эту функцию внутри else:
function gotoListParticipants()
{
userSelection.userAction.value = "<%=myLiterals.USER_ACTION_REVIEW_MARKETING_LIST_PARTICIPANTS%>";
userSelection.action= "/mySite/GlobalNavigationServlet";
userSelection.submit();
return true;
}
Чтобы исправить это, я реализовал вызов CustomerListController
, если для userAction установлено значение USER_ACTION_REVIEW_MARKETING_LIST_PARTICIPANTS
.
@Controller
public class GlobalNavigationController {
@Autowired
private CustomerListController customerListController;
@RequestMapping(path = "/GlobalNavigationController", method = {RequestMethod.GET, RequestMethod.POST})
public ModelAndView doGet(HttpSession session, HttpServletRequest req, HttpServletResponse res) throws Exception
{
SiteBean myBean = new myBean();
try
{
RequestMapper.MapToBean(req,myBean);
if (myBean.getUserAction().equals(myLiterals.USER_ACTION_1))
{
return null;
}
else if (myBean.getUserAction().equals(myLiterals.USER_ACTION_REVIEW_MARKETING_LIST_PARTICIPANTS))
{
GlobalNavigationUCService.processTabsGoToSearch();
if (applicationServlet.getUserContext(req).getSearchResults() == null) {
GlobalNavigationUCService.resetCustomerDetailsInUserContext();
}
return customerListController.doGet(session, req, res);
}
Ваш код может вызывать исключения. Поймайте это и добавьте трассировку стека к вопросу.