Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STRUTS 2 <s:action - как продолжить рендеринг, Проблема взаимодействия тэгов STRUTS 2 
V
    Опции темы
carper
Дата 9.12.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



STRUTS 2.0.14

Есть jsp страничка (struts.xml см. ниже, после описания проблемы) :
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> <title>test</title><s:head/></head>
  <body>
     Привет 1
     <s:action name="BaseHeader" executeResult="true"  ignoreContextParams="true"></s:action>  
     Привет 2
     </body>
</html>


Выводится, что и ожидалось : Привет 1 InlineHello Привет 2


Теперь ПОСЛЕ (т.е. ДО можно добавлять сколько угодно) тэга "<s:action" добавим любой другой тэг от Struts (HTML тэги рендерятся без проблем) ну, например :
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> <title>test</title><s:head/></head>
   <body>
     Привет 1
     <s:action name="BaseHeader" executeResult="true"  ignoreContextParams="true"></s:action>  
     Привет 2
     Наш безобидный новый тэг:
     <s:label>Привет опять</s:label>
     </body>
</html>


Результат:  Привет 1 
ВСЁ! На тэге <s:action рендеринг странички заканчивается! Причем не отображается даже результат самого s:action
(flush = "true" или flush="false" не помогает).

Вопрос: почему и как этого избежать? (Что-то происходит с ActionContext? Но почему не обрабатывается хотя бы сам s:action?)
Может быть я не верно понимаю назначение этого тэга?


struts.xml:
Код

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.action.extension" value="action,do" />
    <constant name="struts.enable.SlashesInActionNames" value="false" />
    <constant name="struts.custom.i18n.resources" value="global" />
      
    <package name="struts2.actions" extends="struts-default" namespace="/">
        <action name="BaseHeader" class="struts2.actions.BaseHeader">
          <result>/includedPage.jsp</result>
         </action>
      </package>
</struts>



includedPage.jsp состоит из одной текстовой строки - InlineHello


Action, по сути заглушка:
Код

package struts2.actions;

import com.opensymphony.xwork2.ActionSupport;

public class BaseHeader extends ActionSupport {
  public String execute() {
        return SUCCESS;
  }
}

PM MAIL   Вверх
MisterCleric
Дата 9.12.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Слушай, может теги не так используешь?
например:
Код

<s:action name="BaseHeader" executeResult="true"  ignoreContextParams="true"></s:action>  


вот так, наверное
Код

<s:action name="BaseHeader" executeResult="true"  ignoreContextParams="true"/>

так как у тебя нету тела тега. Оно нужно, если ты хочешь передать экшену параметры
Код

<s:action name="BaseHeader" executeResult="true"  ignoreContextParams="true">
     <s:param name="message" value="ku-ku"/>
</s:action>  


и аналогично с 
Код

<s:label>Привет опять</s:label>

Вот так наверное
Код

<s:label label="Привет опять"/>


Добавлено через 19 секунд
по крайней мере у меня так работает

Добавлено через 1 минуту и 59 секунд
и такое замечание:

если ты делаешь просто экшен заглушку, то она и не нужна

вот должно быть

Код

<action name="BaseHeader">
          <result>/includedPage.jsp</result>
</action>


По дефолту будет создаваться экземпляр com.opensymphony.xwork2.ActionSupport


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
carper
Дата 9.12.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Что касается action как заглушки, так это он у меня ПОКА заглушка. smile

Тэги пробовал писать и  с телом и без (кстати, в Html допустимо любое написание, не думаю, что здесь иначе). 
Не работает.

Конечно обнадеживает, что хотя бы у других срабатывает, но просто шайтан какой-то нашел. :(

Остается подозрение на состав библиотек в WEB-INF/lib (возможно какой-то интерцептор чего-то там левое подтягивает) у меня там сейчас: antlr-2.7.2.jar 
            commons-logging-1.0.4.jar 
            commons-logging-api-1.1.jar 
            freemarker-2.3.8.jar 
            jsf-api.jar 
            jsf-impl.jar 
            jstl-1.2.jar 
            ognl-2.6.11.jar 
            struts2-core-2.0.14.jar 
            xwork-2.0.7.jar  
PM MAIL   Вверх
MisterCleric
Дата 9.12.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



вроде все правильно. 
Не понятно зачем jsf...

а такое в jsp есть 
Код

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="[url на struts.tld]" %>



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
carper
Дата 9.12.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



jsf, ну предполагается в дальнейшем проекте использовать, пока незачем - ничего сейчас в проекте нет, начал щупать и вот ...

У меня:
<%@ page  language="java" contentType="text/html;charset=UTF-8" pageEncoding="Windows-1251" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

Не знаю, кажется я начинаю понимать, где таятся сии чудеса (прошу прощения, сразу не предупредил, думал не имеет отношения к задаче - не хотел писать километровый пример).   smile 


Сейчас поясню: хотелось чтобы по вводе в строке браузера: мой_сайт/index.html - на самом деле вызвался action.

Насколько я помню я могу замапить ФИЛЬТР (org.apache.struts2.dispatcher.FilterDispatcher) на любое расширение/я, 
но не на конкретный файл! 

Т.е. если я не хочу, чтобы диспетчер  пытался трактовать ВСЕ мои файлы с расширением html как action, а только, скажем, index.html, то так сделать нельзя.

Поэтому я написал сервлет, замаппил его на index.html, а из самого сервлета вызываю нужный action.
Все работает прекрасно, все тэги STRUTS 2, само перенаправление и т.п.

Поэтому и не возникло никаких подозрений, когда вдруг вылезла странная проблема с s:action, сейчас похоже ларчик и открывается
жаль только не ясно как это обойти и почему так странно это проявляется. :(
 
Сервлет:
Код

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserFriendlyActionMapper extends HttpServlet {

       public UserFriendlyActionMapper() {
        super();
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String actionName = getServletConfig().getInitParameter("actionName");
        RequestDispatcher dispatcher = request.getRequestDispatcher(actionName);
        dispatcher.forward(request, response);
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
    }


В web.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   <filter>
     <filter-name>struts2</filter-name>
     <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
   </filter>

    <filter-mapping>
       <filter-name>struts2</filter-name>
       <url-pattern>/*</url-pattern>
       <dispatcher>REQUEST</dispatcher> 
       <dispatcher>INCLUDE</dispatcher>
       <dispatcher>FORWARD</dispatcher>
       <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    
    <welcome-file-list>
      <welcome-file>/index.jsp</welcome-file>
    </welcome-file-list>
    
    
   <servlet>
     <servlet-name>actionDipatcher</servlet-name>
     <servlet-class>servlets.UserFriendlyActionMapper</servlet-class>
     <init-param>
       <param-name>actionName</param-name>
       <param-value>/BaseHeader.action</param-value>
     </init-param>
   </servlet>
   <servlet-mapping>
     <servlet-name>actionDipatcher</servlet-name>
     <url-pattern>/index.html</url-pattern>
   </servlet-mapping>
    
</web-app>


Добавлено через 12 минут и 49 секунд
P.S. Нет, кажется рано обрадовался, не работает и без сервлета - только по-другому -  пишет, что не может action.
(При вызове из сервлета находит без проблем!)
Похоже единственное правильное решение - оставить всю эту мистику на свежую голову.
PM MAIL   Вверх
MisterCleric
Дата 9.12.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



так не пробовал?

index.html

Код

<html>
<head>
    <meta http-equiv="Refresh" content="0; URL=[твой экшен].action">
</head>
</html>


и в web.xml

Код

<welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>


а этот экшен должен вернуть валидную jsp со всеми объявлениями тэг-либ



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
carper
Дата 10.12.2008, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Цитата(MisterCleric @ 9.12.2008,  18:15)
так не пробовал?

index.html

Код

<html>
<head>
    <meta http-equiv="Refresh" content="0; URL=[твой экшен].action">
</head>
</html>


и в web.xml

Код

<welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>


а этот экшен должен вернуть валидную jsp со всеми объявлениями тэг-либ

Через refresh не хочу, т.к., хотя и на недолгое время, появляется страничка перенаправления, что неприятно смотрится, особенно на медленных линиях.

Кстати, дело оказалось вовсе не в моем "изобретении" перенаправления при помощи сервлета, как я было подумал.

Убрал все навороты, вызываю action напрямую, но первоначально описанная проблема осталась.  smile


Самое удивительное это то, как взаимосвязаны тэги тип s:action и s:label (поставленный в любом месте, лишь бы ПОСЛЕ s:action), что мало того, что после s:action не вызывается не только s:label, но и что бы то ни было вообще - будем считать, что что-то происходит с контекстом/потоком response, но и перестает отрабатывать, ранее отлично работающий, сам s:action!
Он-то почему?

И, главное, у других-то мой пример работает?! Очевидно, что ошибка именно у меня, но где?
PM MAIL   Вверх
carper
Дата 10.12.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Похоже, что я попал на баг, описанный в https://issues.apache.org/struts/browse/WW-2551
Но почему тогда это работает у других?
PM MAIL   Вверх
carper
Дата 10.12.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Большое спасибо всем участникам - разобрался, дело было в настройках фильтра (совершенно безобидных, на первый взгляд, именно они приводили к перехвату потока).  smile 
PM MAIL   Вверх
MisterCleric
Дата 10.12.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Код в студию! С указанием проблемного места, что люди не попадались в такие сети


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
carper
Дата 10.12.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Цитата(MisterCleric @ 10.12.2008,  13:20)
Код в студию! С указанием проблемного места, что люди не попадались в такие сети

Проблема, как я уже писал, была связана вовсе не с сервлетом/перенаправлениями.
Нашлась эта фигня только после того, как я всерьез задумался о том, кто из стандартных компонентов может свинячить с потоками. smile

Просто для фильтра было указано (FORWARD понадобился таки для перенаправления из сервлета, остальное от лукавого)

Код

   <filter-mapping>
       <filter-name>struts2</filter-name>
       <url-pattern>/*</url-pattern>
       <dispatcher>REQUEST</dispatcher>
       <dispatcher>FORWARD</dispatcher>
       <dispatcher>ERROR</dispatcher>
       <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

 
Дело оказалось в    <dispatcher>INCLUDE</dispatcher>

Из косвенных признаков было понятно, что дело где-то в response stream, но ничто в документации по STRUTS не наталкивало на то, что нельзя делать <dispatcher>INCLUDE</dispatcher>, скорее, наоборот, я где-то видел именно этот полный джентельменский набор диспатчеров.

Получается явная, крайне неприятная фича, документации - серьезный подводный камень нигде даже не упоминался.

Да, смысл фильтра на include не очевиден, но также совершенно не очевидно, что это должно сбрасывать поток вывода, хотя бы потому, что не ясно зачем же грести очистку всего потока вввода/вывода, не принимая во внимание, откуда отработал сам фильтр? :(
Да и способ каким это делается - по принципу так работает, а так нет, нельзя назвать очевидным ни в коей мере.

Исходя из поисков в Интернет, похоже, что на эту проблему никто не попал, т.к. никто на прописывал никаких dispather, ну, в крайнем случае, только на Forward.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1267 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.