Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Struts 2 + JQuery Ajax


Автор: Nikola661 12.4.2010, 09:15
Добре!!!
Пытаюсь использовать в своем приложении Struts 2 и JQuery Ajax.
Вот index.jsp:

Код

<script type=text/javascript src="<s:url value="/tiles/jquery.js"/>"></SCRIPT>
<script type=text/javascript>
$(document).ready(function(){
    $('#basis').change(
        function() {
         if ($('#offence option:selected').val()!='-1') {
             alert($('#basis option:selected').val() + '>' + $('#basis option:selected').text());
             $.ajax({
                 type:'POST',
                 url:'testAjax.action',
                 data:'offence='+$('#offence option:selected').val()+'&basis='+$('#basis option:selected').val(),
                 success: function(data) {
                     $('#regform').html(data);
                     alert('Success');
                 }
             });
         } else {
             alert('Не указан       .');
             $('#basis option:first').attr('selected','yes');
         }
        }
    );
});
</SCRIPT>

<form>
        <table class="wwTable" >
        <tr>
    <td class="tdLabel"><label for="offence" class="label">Селект1:</label></td>

    <td
><select name="offence" id="offence">
    <option value="-1"
    >-- Пожалуйста выберите --</option>
    <option value="1">.......</option>
    <option value="2">.......</option>
    <option value="3">.......</option>


</select>
</td>
</tr>

        <tr>
    <td class="tdLabel"><label for="basis" class="label">Селект2:</label></td>
    <td
><select name="basis" id="basis">
    <option value="-1"
    >-- Пожалуйста выберите --</option>
    <option value="1">...............</option>

    <option value="2">...............</option>
    ..............................................................
    <option value="10">..............</option>
</select>
</td>
</tr>

        </table>
        </form>
        <div id="regform"></div>


Возможно ли так в jquery, без jquery у меня получалось аяксить. Когда делаю так то работает:
Код

$.ajax({
                 type:'POST',
                 url:'regform.jsp',
                 data:'offence='+$('#offence option:selected').val()+'&basis='+$('#basis option:selected').val(),
                 success: function(data) {
                     $('#regform').html(data);
                     alert('Success');
                 }
             });


Но мне надо сначало выполнить Action!!! Спасибо???

Автор: Ares4322 12.4.2010, 13:43
В доках по Struts2 пишут, что надо кастомайзить свой Action-класс для обработки AJAX. Но я сделал проще. Делаю простой сервлет, который обрабатывает AJAX(принимает запросы, парсит их и отправляет ответы), определяю в web.xml отображение запросов на этот сервлет(ну как простое программирование веба через сервлеты), а в struts.xml запрещаю обрабатывать запросы по данному url. И все работает. То есть AJAX запросы обрабатываются вне ACTION-классов, но, при этом, этот сервлет может пользоваться данными struts, например, объектами сессии.

Автор: Nikola661 13.4.2010, 04:27
Цитата(Ares4322 @ 12.4.2010,  13:43)
В доках по Struts2 пишут, что надо кастомайзить свой Action-класс для обработки AJAX. Но я сделал проще. 

Тоже вариант, но прикол в том что раньше я делал так (взято с форума http://www.linkexchanger.su/forum/viewtopic.php?f=20&t=257&p=2297#p2297 чтобы только показать суть):
Код

function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}

var xmlhttp = getXmlHttp()
xmlhttp.open('GET', 'http://www.site.ru/love/', true); // <---- адрес страницы, откуда берем данные
xmlhttp.onreadystatechange = function() {
  
if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
        dataLoaded(xmlhttp.responseText);
     }
     else {
        alert("Error " + xmlhttp.status + ": " + xmlhttp.statusText);    
    }
  }
};
xmlhttp.send(null);


И все работало! Тут естественно в url писал так http://localhost:8080/MyApp/testAjax.do
Action возвращал мне HTML и я всовывал его в какой-нибудь тег:
Код

getElementById('nnnn').innerHTML(xmlhttp.responseText);


Через эту конструкцию не работает:
Код

$.ajax({
                 type:'POST',
                 url:'testAjax.action',
                 data:'offence='+$('#offence option:selected').val()+'&basis='+$('#basis option:selected').val(),
                 success: function(data) {
                     $('#regform').html(data);
                     alert('Success');
                 }
             });



А вот так прокатило:

Код

$.post('testAjax.action','',function(data){
                                            $('#regform').html(data);
                                        },'html');


вернул страницу!!! Хотя на api.jquery.com написано, что должно пахать. Попробовал использовать другие собития, а именно error и beforeSend:
Код

$.ajax({
                 type:'POST',
                 url:'testAjax.action',
                 data:'offence='+$('#offence option:selected').val()+'&basis='+$('#basis option:selected').val(),
                 error: function(xhr, ajaxOptions, thrownError) {
                     alert(xhr.responseText);
                 },
                 success: function(data) {
                     $('#regform').html(data);
                     alert('Success');
                 }
             });



Вот что он мне написал:
Error 404: No result defined for action ru.tester.action.TestAjaxAction and result input

Автор: Ares4322 13.4.2010, 08:02
Описание этой ошибки означает, что Ваши данные не прошли валидацию, а struts не может найти перенаправление для Result-типа input. Вы делаете валидацию ( с помощью файла или метода)?

Автор: Nikola661 13.4.2010, 09:41
Не внимательно читал док!!!
Я неправильно засылал параметры запроса.
Код

$.ajax({
    data:'offence='+$('#offence option:selected').val()+'&basis='+$('#basis option:selected').val(),           
});


Это не правильно!!!Надо вроде так:
Код

$.ajax({
      data:({offence: [$('#offence option:selected').val()], 
                  basis: [$('#offence option:selected').val()]              
               })
});


,но почему то в севрлете они null.
Код

System.out.println(request.getParameter("offence")); //дает null

Тут написано: smile
http://api.jquery.com/jQuery.ajax/ 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)