Библиотека Struts2 + Jquery. Что не так с этим вызовом AJAX?

Я пытаюсь выполнить вызов ajax с помощью Struts2 и библиотеки JQuery. Это код JSP:

<s:div id="my_result" >
    Nothing
</s:div>

<s:form action="UserManager" theme="simple">
    <s:textfield name="nickname" />
    <s:password name="password" />
    <s:label cssClass="menu_span">
        <sj:submit targets="my_result" value="Login" />
    </s:label>
</s:form>

это код bean/action с xml:

public class UserManager extends ActionSupport {
    private String nickname;
    private String password;

    @Override
    public String execute() throws Exception {
        String output="i have insered "+this.getNickname()+" and "+this.getPassword();
        System.out.println(output);
        return output;
    }

    public String getNickname() { return nickname; }
    public void setNickname(String newValue) { nickname=newValue; }

    public String getPassword() { return password; }
    public void setPassword(String newValue) { password=newValue; }
}

<package name="model" extends="struts-default">
    <action name="UserManager" class="model.UserManager">
        <result>index.jsp</result>
    </action>
</package>

Если я return SUCCESS в bean-компоненте UserManager, он загружает my_result ту же вызывающую страницу. Иначе, если я return output, я получу сообщение Messages:
No result defined for action model.UserManager and result i have insered aaa and bbb
(с псевдонимом=aaa и паролем=bbb).

Что случилось? Как я могу вернуть эту строку? Я думаю, что это ошибка struts.xml

Ваше здоровье

ОБНОВЛЕНИЕ

открытый класс UserManager расширяет ActionSupport { частный псевдоним String; закрытый строковый пароль; ошибка частной строки;

@Override
public String execute() throws Exception {
    error="i have insered "+this.getNickname()+" and "+this.getPassword();
    return SUCCESS;
}

public String getNickname() { return nickname; }
public void setNickname(String newValue) { nickname=newValue; }

public String getPassword() { return password; }
public void setPassword(String newValue) { password=newValue; }

public String getError() { return error; }
public void setError(String newValue) { error=newValue; }
}

<s:div id="my_result" >
    <s:property value="error" />
</s:div>

<s:form action="UserManager" theme="simple">
    <s:textfield name="nickname" />
    <s:password name="password" />
    <s:label cssClass="menu_span">
        <sj:submit targets="my_result" value="Login" />
    </s:label>
</s:form>

ОБНОВЛЕНИЕ 2

<package name="model" extends="json-default">
    <action name="UserManager" class="model.UserManager">
        <result type="json" />
    </action>
</package>

person markzzz    schedule 06.12.2010    source источник
comment
Да, но у меня все еще есть проблема. Проверьте комментарий :)   -  person markzzz    schedule 07.12.2010
comment
Я снова прокомментировал ответ   -  person Javi    schedule 08.12.2010
comment
Вопрос отредактирован и снова прокомментирован.   -  person Javi    schedule 10.12.2010


Ответы (1)


Возвращаемое значение, которое вы возвращаете в методе execute(), должно быть одним из сопоставленных значений. Поскольку у вас нет такого имени результата:

<result name="resultName"></result>

Он будет использовать значение по умолчанию: «успех». Вы должны вернуть значение «успех» в методе execute().

Результатом метода execute является имя отображаемого результата. Чтобы отправить сообщение, вы должны добавить атрибут String в свое действие (и геттер для его получения), а в методе выполнения сделать что-то вроде

 this.message = "my message";

Редактировать: как получить сообщение с помощью ajax: Если вы установили сообщение в своем действии в атрибуте с именем «String message» и у вас есть геттер для этого атрибута (public String getMessage()), вы может получить эту информацию, получая доступ к этому свойству в объекте, который вы получаете в вызове ajax. Если вы выполняете вызов ajax, например, с помощью jquery, вы можете получить его следующим образом:

$.ajax({
    url: '/yourAjaxUrl',
    success: function(data) {
       var message = data.message;
       alert('The message is '+message);
       $('#my_result').html(message);
    }
});

Редактировать: в XML-файле struts в теге пакета вы должны определить тип json:

<result-types>
    <result-type name="json" class="com.googlecode.jsonplugin.JSONResult">
    ...
</result-types>

и добавьте json-plugin.jar, который можно скачать здесь

дополнительную информацию см. в http://code.google.com/p/jsonplugin/wiki/Documentation< /а>

person Javi    schedule 06.12.2010
comment
Спасибо, приятно. Но как я могу напечатать значение результата в my_result div? - person markzzz; 07.12.2010
comment
Я вижу твой пример. Но я до сих пор не понимаю, как получить только сообщение в моем div my_result, а не весь div (используя Struts2, а не Jquery напрямую). Как мне это сделать? Проверьте ОБНОВЛЕНИЕ выше. Он возвращает сообщение (ДА, ДЕЛАЕТ), но возвращает всю страницу (index.jsp) в my_result div (а я этого не хочу). - person markzzz; 07.12.2010
comment
На самом деле, я хотел бы перезагрузить только div с именем my_result, а не всю страницу. Ты знаешь, что я имею в виду? - person markzzz; 07.12.2010
comment
Читая документацию, я прочитал 'targets' is a list of element ids whose content will be updated with the text returned from request., но он загружает ВСЮ страницу по идентификатору (это my_result). Поэтому я думаю, что мне нужно что-то изменить в .xml... и в результате не использовать страницу jsp. - person markzzz; 07.12.2010
comment
Хороший. Я добавил библиотеку, изменил struts.xml (вы можете видеть в моем последнем обновлении), но я получаю java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.TextUtils . Почему? - person markzzz; 09.12.2010
comment
@markzzz Вы добавили в проект библиотеку xwork.jar? Вы можете скачать его здесь: findjar.com/class/com/ opensymphony/xwork2/util/TextUtils.html - person Javi; 09.12.2010
comment
О нет. Что это за библиотека? И зачем мне это нужно? Кроме того, если я поставлю эту библиотеку, приложение не запустится (ОШИБКА 500). Мне действительно это нужно? - person markzzz; 09.12.2010
comment
Нравится java.lang.NoSuchMethodError: com.opensymphony.xwork2.util... Я добавил xwork-2.1.2.jar - person markzzz; 09.12.2010
comment
Похоже, у jsonplugin-0.34 есть проблемы с xwork-2.1.2. - person markzzz; 09.12.2010
comment
С xwork-core-2.1.5.jar по-прежнему возникает та же ошибка (java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.TextUtils) - person markzzz; 09.12.2010
comment
Я смотрю, как работает проект, и у меня xwork-2.1.2.jar и jsonplugin-0.34.jar работают без проблем. Я отредактировал вопрос, показывающий, как настроен плагин. Не забывайте, что вы должны добавить библиотеки в папку lib, а в свой проект/свойства/путь сборки Java/библиотеки вы должны добавить банки на случай, если все банки вашей папки lib не будут добавлены автоматически. - person Javi; 10.12.2010
comment
странный. Я только что удалил все библиотеки и поставил struts-json-plugins, и, похоже, это работает. Не знаю, но когда я запускаю сервер, я получаю массу ошибок (о строке кода, которую я удалил некоторое время назад). Похоже, что Tomcat не обновляет фактические файлы xml... - person markzzz; 10.12.2010
comment
@markzzz, если вы что-то измените в xml, вам всегда придется перезапускать tomcat - person Javi; 10.12.2010