JSF — Настройка свойства при переходе по ссылке

#jsf #jakarta-ee #prettyfaces

#jsf #джакарта-ee #prettyfaces

Вопрос:

Я использую prettyfaces для обработки URL-путей.

Что я хочу сделать, так это установить свойство языка при переходе по ссылке (чтобы выбрать язык). Что-то вроде этого:

 <h:link outcome="#{bean.currentPath}" value="English"> <!-- path goes to self -->
    <f:param name="link" value="#{currentTopic.link}" />
    <f:param name="lang" value="eng" />
</h:link>
  

Prettyconfig извлекает ссылку и следует по ней, но как я могу отправить параметр в языковой компонент?

 <url-mapping id="">
    <pattern value="/topic/#{link:bean.link}" />
    <view-id>/faces/topic.jsf</view-id>
</url-mapping>
  

Компонент не имеет состояния (@RequestScoped), а языковой компонент отслеживает состояние (@SessionScoped). Оба являются @ManagedBeans.

Комментарии:

1. возможно ли добавить его в существующий шаблон URL? /topic/#{link:bean.link}/#{lang:languageBean.lang}

2. Я рассматривал это, однако мой профессор здесь, в университете. указанный язык должен быть полностью определен на стороне сервера, без указания его в URL для просмотра пользователем, потому что он определен только один раз.

3. Однако это огромный недостаток SEO. Содержимое на разных языках таким образом будет помечено как дублирующее содержимое.

4. 1 БалусК — ваш сайт значительно выиграет, если сделает контент доступным для каждого языка по URL-адресу distict, чтобы их можно было индексировать независимо.

5. Ах, я понимаю. Хороший момент. Я подумаю о переходе к решению, которое вы предоставили, Дэйв, спасибо 🙂

Ответ №1:

Вот вариант для вас, который по-прежнему использует URL-адреса rest. Это не очень элегантно, но, вероятно, достигает того, что вы ищете:

 <pretty:link mappingId="LanguageTopic">
    <f:param name="link" value="#{currentTopic.link}" />
    <f:param name="lang" value="eng" />
    English
</pretty:link>
  

pretty-config.xml:

 <url-mapping id="LanguageTopic">
    <pattern value="/topic/#{link:linkBean.link}/#{lang:languageBean.lang}/" />
    <view-id>/faces/topic.jsf</view-id>
    <action>#{linkBean.cleanUrl}</action>
</url-mapping>

<url-mapping id="Topic">
    <pattern value="/topic/#{link:linkBean.link}/" />
    <view-id>/faces/topic.jsf</view-id>
</url-mapping>
  

языковой компонент:

 @ManagedBean(name = "languageBean")
@SessionScoped
public class LanguageBean implements Serializable {

    private static final long serialVersionUID = 4460586548949990787L;

    /**
     * Stores the users language preference
     */
    private String lang;

    public String getLang() { return this.lang; }
    public void setLang(String lang) { this.lang = lang; }

}
  

компонент link:

 @ManagedBean(name = "linkBean")
@RequestScoped
public class LinkBean {

    /**
     * Stores the resource the user is currently accessing
     */
    private String link;

    public String getLink() { return this.link; }
    public void setLink(String link) { this.link = link; }

    /**
     * Cleans language specific rest urls to non-specific urls
     */
    public void cleanUrl() {
        final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();

        try {
            externalContext.redirect("/topic/"   this.link   "/");
        } catch (IOException ex) {
            //log or whatever you want here
        }    
    }
}