Как выполнить метод после загрузки представления в Pretty-Faces

Я хотел бы выполнить метод после нажатия ссылки и загрузки новой страницы. Я попробовал <action/> пометить как, но это тоже не помогло:

<url-mapping id="myApp/seller/addProduct">
    <pattern value="/myApp/seller/addProduct" />
    <view-id value="/pages/seller/add_product.xhtml" />
    <action onPostback="false">#{myBean.barMethod}</action>
    <action>#{myBean.myMethod}</action>
</url-mapping>

@Bean
public class MyBean{
   //source code omitted
   public void myMehtod(){
      //source code omitted
   }
}

Я попытался отладить выполнение метода. Звонок никогда не выполняется после загрузки страницы. Как я могу решить эту проблему, пожалуйста?

ОБНОВЛЕНИЕ. После нескольких часов отладки этой проблемы я пришел к выводу, что первое действие myBean.barMethod() всегда выполняется, а второе myBean.myMethod() никогда не запускается, что я не очень понимаю, почему ??


person ecdhe    schedule 08.03.2018    source источник
comment
Что вы ПОПРОБОВАЛИ?   -  person Kukeltje    schedule 11.03.2018
comment
@Kukeltje: я обновил ветку и предоставил свой исходный код.   -  person ecdhe    schedule 12.03.2018
comment
Почему бы вам просто не выполнить метод в представлении?   -  person Kukeltje    schedule 12.03.2018
comment
Доступ к представлению осуществляется из нескольких источников (т. е. исходных представлений). Этот конкретный метод должен выполняться только для этого конкретного сценария или источника, так сказать. Есть ли способ наложить условие на выполнение метода в целевом представлении?   -  person ecdhe    schedule 12.03.2018


Ответы (2)


Вы не можете напрямую передавать аргументы методам действия с помощью pretty-config.xml, вам нужно будет привязать значение к свойству компонента, например:

https://www.ocpsoft.org/docs/prettyfaces/3.3.3/en-US/html/Configuration.html#config.pathparams

<url-mapping id="viewItem"> <pattern value="/store/item/#{ iid : bean.itemId }/" /> <view-id value="/faces/shop/item.jsf" /> <action>#{bean.loadItem}</action> </url-mapping>

Кроме того, последующие методы действия после первого не будут выполняться, если навигация была вызвана предыдущим методом действия:

https://www.ocpsoft.org/docs/prettyfaces/3.3.3/en-US/html/Configuration.html#config.actions.navigation

Тем не менее, если вы не привязываете значение из URL-адреса, почему бы просто не вызвать другой метод в bean-компоненте или получить значение для передачи другим способом?

person Lincoln    schedule 15.03.2018

В версии 1.2x и более поздних версиях JSF вы можете использовать @PostConstruct в методе bean-компонента, который будет вызываться при первом отображении страницы.

В вашем случае привяжите страницу add_product.xhtml к bean-компоненту и украсьте вызываемый метод с помощью @PostConstruct

person Saif Kamaal    schedule 12.03.2018
comment
Это не решает мою проблему. Метод должен выполняться не только при первом отображении страницы, но и каждый раз, когда пользователь перенаправляется на нее. - person ecdhe; 12.03.2018
comment
Если bean-компонент находится в RequestScope, то он определенно будет запускаться каждый раз. - person Saif Kamaal; 12.03.2018
comment
Я должен создать новый bean-компонент только для этой цели, поскольку MyBean ограничен сеансом. Я бы сказал, что это больше хак, чем решение этой проблемы. Мой окончательный код не будет чистым. - person ecdhe; 12.03.2018