Seam HttpServlet + injected context variable

20 views
Skip to first unread message

nantuko84

unread,
Dec 19, 2008, 1:37:43 AM12/19/08
to The Russia JBoss Seam user group
Задача состоит в создании HttpServlet, который бы записывался данные в
response.getOutputStream()
при получении запроса
/myproject/initdata.seam?documentid=1&typeid=2

С одной стороны это делается довольно легко:
Наследуется класс от HttpServlet и в методе service(final
HttpServletRequest request, final HttpServletResponse response) в
респонз пишутся данные.

Проблема в том, как получить объекты подобно тому, как в Seam action
достаются переменные через аннотацию @In.
Если я пишу
@In("#{localService}") LocalService localService;
или даже
@In("#{messages['test.message.example']}") String
messagesAdvoiceliteCopyOf;
то их значение равны null.
Хотя в другом симовском экшене они достаются нормально
(HomePageAction)

2. Пробовал также Component.getInstance("homepageaction") - получаю
Access denied
3. Пробовал Contexts.getSessionContext().get("homepageaction") -
объект достаётся, методы вызываются, всё гуд, но эти переменные опять
null ;(

Пока сделал вывод на страницу с <f:view contentType="application/
xml">, но возможно будут косяки...

В общем, целый день вчера с этим возился, может у кого есть идеи?

Greg

unread,
Dec 19, 2008, 3:46:35 AM12/19/08
to The Russia JBoss Seam user group
Если я правильно всё понял, то ты хочешь в своём сервлете обращатся к
компонентам Seam. Для этого ты в самом сервлете юзаешь такой метод
доступа Component.getInstance("homepageaction"). Но чтоб он начал
работать нужно в components.xml добавить строку:

<web:context-filter url-pattern="/images/*"/> где url-pattern
указывает на котекст твоего сервлета

nantuko

unread,
Dec 19, 2008, 3:51:42 AM12/19/08
to the-russia-jboss...@googlegroups.com
сейчас у меня servlet, из которого я пытаюсь достучаться до компонента Seam, вызывается по урлу
/seam/servlet/.seam?documentid=1&typeid=2

и у меня в components.xml прописано
<web:context-filter url-pattern="/seam/servlet/*"/>

но при этом тот же message всё равно null

19 декабря 2008 г. 11:46 пользователь Greg <tkac...@gmail.com> написал:

Greg

unread,
Dec 19, 2008, 4:10:58 AM12/19/08
to The Russia JBoss Seam user group
а почему такой урл странный " /seam/servlet/.seam" ? покажи web.xml
свой.

On 19 дек, 10:51, nantuko <nantuk...@gmail.com> wrote:
> сейчас у меня servlet, из которого я пытаюсь достучаться до компонента Seam,
> вызывается по урлу
> /seam/servlet/.seam?documentid=1&typeid=2
>
> и у меня в components.xml прописано
> <web:context-filter url-pattern="/seam/servlet/*"/>
>
> но при этом тот же message всё равно null
>

> 19 декабря 2008 г. 11:46 пользователь Greg <tkachu...@gmail.com> написал:

nantuko84

unread,
Dec 19, 2008, 4:17:17 AM12/19/08
to The Russia JBoss Seam user group
<?xml version="1.0"?>
<web-app 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"
version="2.5">

<context-param>
<param-name>com.sun.faces.disableVersionTracking</param-name>
<param-value>true</param-value>
</context-param>

<context-param>
<param-name>org.richfaces.SKIN</param-name>
<param-value>emeraldTown</param-value>
</context-param>
<filter>
<display-name>RichFaces Filter</display-name>
<filter-name>richfaces</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>richfaces</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>

<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>

<context-param>
<description>
If the view cannot be found in the session on a JSF
postback, rebuild
the view again before executing the Restore View phase.
This step
prevents "stale" public form pages. Enable this feature if
you need it.
</description>
<param-name>facelets.BUILD_BEFORE_RESTORE</param-name>
<param-value>false</param-value>
</context-param>

<listener>
<listener-class>org.jboss.seam.servlet.SeamListener</listener-
class>
</listener>

<!--
MUST LOAD AFTER SEAMLISTENER!
-->
<listener>
<listener-
class>org.springframework.web.context.ContextLoaderListener</listener-
class>
</listener>

<listener>
<listener-class>com.sun.faces.config.ConfigureListener</
listener-class>
</listener>

<filter>
<filter-name>Seam Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>Seam Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>Seam Resource Servlet</servlet-name>
<servlet-class>org.jboss.seam.servlet.SeamResourceServlet</
servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Seam Resource Servlet</servlet-name>
<url-pattern>/seam/resource/*</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>Direct Seam Servlet</servlet-name>
<servlet-class>com.myproject.actions.SeamServletAdapter</
servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Direct Seam Servlet</servlet-name>
<url-pattern>/seam/servlet/*</url-pattern>
</servlet-mapping>

<!-- Facelets development mode (disable in production) -->
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>false</param-value>
</context-param>

<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.seam</url-pattern>
</servlet-mapping>

<security-constraint>
<display-name>Restrict raw XHTML Documents</display-name>
<web-resource-collection>
<web-resource-name>XHTML</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint/>
</security-constraint>

</web-app>
Message has been deleted

nantuko84

unread,
Dec 19, 2008, 4:20:36 AM12/19/08
to The Russia JBoss Seam user group
мапится, как понимаешь, вот тут:
(SeamServletAdapter как раз и есть HttpServlet)

Greg

unread,
Dec 19, 2008, 4:44:32 AM12/19/08
to The Russia JBoss Seam user group
судя по web.xml у тебя сервлет должен вызыватся вот так /seam/servlet?
documentid=1&typeid=2 вообщем не должно у тебя быть расширения .seam

nantuko84

unread,
Dec 19, 2008, 4:59:25 AM12/19/08
to The Russia JBoss Seam user group
думаешь, это влияет на доступ к контексту?
потому что метод то в любом случае вызывается (и с твоим урлом, и
с .seam)
кстати в <url-pattern> стоит /seam/servlet/* - со звездочкой, так что
он нормально кушает /seam/servlet/.seam?documentid=1&typeid=2

кстати эта ссылка сгенерирована тегом
<s:link view="/seam/servlet/" target="_blank">
<f:param name="documentid" value="1"/>
<f:param name="typeid" value="2" />
</s:link>

Greg

unread,
Dec 19, 2008, 5:01:29 AM12/19/08
to The Russia JBoss Seam user group
попробуй записать без звездочки вот так /seam/servlet в web.xml и
потом вот так обатится /seam/servlet?documentid=1&typeid=2, у меня
сейчас именно так и работает

nantuko

unread,
Dec 19, 2008, 5:15:11 AM12/19/08
to the-russia-jboss...@googlegroups.com
сделал
объект получается, но все внутренние переменные из контекста равны null

@Name("homepageaction")
@Scope(ScopeType.SESSION)
@Restrict("#{identity.loggedIn}")
@Synchronized(timeout=5000)
public class HomePageAction implements HomePageActionInterface {

     @In("#{localService}") LocalService localService;   <-- достаётся из контекста

.....
}

и

public class SeamServletAdapter extends HttpServlet {
 ...
@Override
    protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,IOException {

Object o = Component.getInstance("homepageaction");
...
}

достать объект получается, но при этом localService = null
если же я работаю с HomePageAction через страницу home.seam (home.xhtml), то localService инициализируется

может я чего-то не понимаю и нужно доставать не action со ScopeType.SESSION

Greg

unread,
Dec 19, 2008, 5:23:11 AM12/19/08
to The Russia JBoss Seam user group
А если напрямую обратится к localService? например так: Object o =
Component.getInstance("localeService");

nantuko84

unread,
Dec 19, 2008, 6:31:02 AM12/19/08
to The Russia JBoss Seam user group
Component.getInstance("localService") - null
Component.getInstance("#{localService}") - null

;(

Greg

unread,
Dec 19, 2008, 7:39:45 AM12/19/08
to The Russia JBoss Seam user group
а в debug.seam он инстациирован?

Greg

unread,
Dec 19, 2008, 7:40:29 AM12/19/08
to The Russia JBoss Seam user group
Ну тоесть видно что он есть или нет?

nantuko84

unread,
Dec 19, 2008, 12:27:36 PM12/19/08
to The Russia JBoss Seam user group
его там нет, но есть homepageaction

в общем, я так и не смог ничего не сделать.
была идея при логине в статичном менеджере сохранять localService -
работает, но как-то некрасиво и не уверен, что будет если к этому же
объекту обратится другой пользователь

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

в любом случае, спасибо за попытку помочь

;)

Reply all
Reply to author
Forward
0 new messages