проблема с передачей данных bean из сервлета в jsp - PullRequest
0 голосов
/ 19 июля 2011

У меня есть 2 страницы JSP, одна называется MyPage.jsp, а другая - View.jsp.View.jsp имеет древовидную структуру.MyPage.jsp имеет несколько текстовых полей, называемых числом и дизайном, которые необходимо заполнить через bean-компонент через сервлет.При щелчке любого узла дерева в View.jsp MyPage.jsp должен отображаться с установленными значениями текстовых полей.Теперь происходит то, что MyPage.jsp вызывается дважды, то есть один раз в View.jsp (в функции ajax) и второй в диспетчере запросов в сервлете, так что значения bean-компонентов, устанавливаемые в сервлете, теряются.Пожалуйста, предложите лучший способ, чтобы сохранить значения повсюду, и чтобы при щелчке узла дерева MyPagejsp отображался с установленными значениями поля.

responseBean.setNumber("220");
responseBean.setDesign("xyz");
response.setContentType("text/html");                        
response.setCharacterEncoding("UTF-8");
request.setAttribute("responseBean", responseBean);
RequestDispatcher requestDispatcher = getServletContext().getRequestDispatcher("/MyPage.jsp");
requestDispatcher.include(request, response);
response.getWriter().write("Success");

Страница jsp, откуда MyPage.jsp вызывается сУ набора значений bean-компонентов следующий код

View.jsp

$.ajax({
 url : AJAX_SERVLET,
type: "GET",
data: "Number="+node.data.title,
success : function(output) {                                
$("[id=content]").attr("src", '/Test-portlet/MyPage.jsp');
}
});
}

MyPage.jsp

<jsp:useBean id="responseBean" class="com.web.bean.ResponseBean" scope="request">

<jsp:setProperty name="responseBean" property="*"/>

</jsp:useBean>
<body>
<%System.out.println("Values"+responseBean.getNumber()); %>
</body>

В приведенном выше коде MyPage.jsp System.out.println имеет видпечатать значение дважды;один раз как значения 202 и второй как значения нуля.Поскольку он заменяет исходное значение на ноль только потому, что MyPage.jsp вызывается дважды, и поэтому значение второго раза теряется.Пожалуйста, помогите

1 Ответ

1 голос
/ 19 июля 2011

Я полагаю, что вы путаете / неправильно понимаете некоторые основные понятия, в частности, как работает HTTP и как должен работать Ajax.

Здесь происходит то, что вы эффективно запускаете два HTTP-запроса.Один на $.ajax(), а другой на element.attr('src', url).Каждый запрос приводит к созданию и установке полностью отдельного экземпляра компонента.Вы полностью игнорируете данные bean-компонента в обратном вызове запроса $.ajax().Я не уверен, что представляет элемент HTML [id=content], но я предполагаю, что это <iframe>.Это не совсем правильный путь.

В итоге вы должны эффективно запустить один HTTP-запрос.Есть в основном 2 решения:

  1. Забудьте $.ajax() и отправьте запрос по element.attr('src', url).

    $("[id=content]").attr("src", "/Test-portlet/MyPage.jsp?number=" + encodeURIComponent(node.data.title));
    

    Вы также можете изменить URL-адрес насервлет один, чтобы у вас было немного больше контроля предварительной обработки и, наконец, использовать RequestDispatcher#forward() вместо include().НЕ пишите HTML к ответу в сервлете.Пусть JSP сделает это.

  2. Забудьте вещь <iframe> и полностью обработайте ответ Servlet / Ajax без вмешательства JSP.Вам нужно будет преобразовать bean-компонент в другой формат данных, который легко разбирается с помощью JavaScript / jQuery.Я бы предложил использовать для этого JSON.

    $.get(AJAX_SERVLET, { "number": node.data.title }, function(response) {
        $("#number").text(response.number);
        $("#design").text(response.design);
    });
    

    в HTML, например,

    <div id="number"></div>
    <div id="design"></div>
    

    и в сервлете

    // ... (create ResponseBean the way as you want)
    String json = new Gson().toJson(responseBean);
    
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
    

См. Также:

...