Открытие нового окна, если условие истинно в управляемом компоненте

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

Я нашел эту возможность:

Тег «h:link» полезен для создания ссылки, которая требует взаимодействия с JSF «результатом», но отсутствие поддержки «действия» затрудняет создание динамического результата.

Тег «h:commandLink» — отстой, сгенерированный JavaScript действительно страшный! Не рекомендуется использовать этот тег, если у вас нет веских причин для поддержки. Но он поддерживает атрибут «action», чего не хватает «h:link».

«h:outputLink» полезен для создания ссылки, которая не требует взаимодействия с самой программой JSF. Наконец, будет идеально, если в «h:link» будет добавлен атрибут «action».

Но я не нашел способа запустить открытую веб-страницу из моего управляемого компонента после проверки условия.

Я использую JSF2.0, Facelets и PrimeFaces 3.4.


person Amira    schedule 02.10.2012    source источник


Ответы (1)


Чтобы открыть цель в новом окне с помощью одного из этих компонентов ссылки, вам нужно указать атрибут target="_blank", но это уже откроет цель в новом окне в момент нажатия на ссылку и, таким образом, не зависит от ответа. В основном вам нужно открыть цель в новом окне в момент получения ответа. Единственный способ — вернуть вызов JavaScript window.open() в ответ, чтобы он был выполнен в веб-браузер.

В стандартном JSF вы можете просто условно отображать window.open() JavaScript.

<h:form>
    <h:inputText value="#{bean.url}" />
    <h:commandButton value="submit" action="#{bean.submit}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
    <h:outputScript rendered="#{bean.valid}">window.open('#{bean.url}')</h:outputScript>
</h:form>

с участием

private String url;
private boolean valid;

public void submit() {
    valid = validate(url);
}

// ...

В PrimeFaces вы можете использовать RequestContext#execute()< /a> для указания кода JavaScript, который необходимо выполнить после завершения ответа.

<h:form>
    <p:inputText value="#{bean.url}" />
    <p:commandButton value="submit" action="#{bean.submit}" />
</h:form>

с участием

private String url;

public void submit() {
    if (validate(url)) {
        RequestContext.getCurrentInstance().execute("window.open('" + url + "')");
    }
}

// ...

Не имеет отношения к конкретной проблеме: краткие утверждения, которые вы там цитировали, по-видимому, написаны кем-то, кто ничего не знает об основах HTTP/HTML (ограничения GET против POST и т. д.). Пожалуйста, относитесь к ним с недоверием.

person BalusC    schedule 02.10.2012
comment
Тогда URL-адрес, по-видимому, недействителен. Он должен начинаться с http:// и так далее. Передайте его конструктору new URL() и перехватите исключение. Если поймано, то URL-адрес недействителен. - person BalusC; 02.10.2012
comment
я не хочу, чтобы это отображалось перед URL-адресом «localhost: 8081/JavaServerFaces/faces», потому что это внешний URL-адрес. спасибо - person Amira; 02.10.2012
comment
Вы не поняли мой предыдущий комментарий? URL-адрес должен начинаться с http://. В противном случае это, очевидно, относительно текущего URL-адреса. Вы можете проверить его с помощью new URL(url), а затем проверить, не выдает ли он исключение. При необходимости вы можете вручную добавить префикс http:// к URL-адресу, когда конечный пользователь не ввел его. - person BalusC; 02.10.2012
comment
Я полагаю, что ОП означает, что ему не нужна часть «localhost ...» в URL-адресе ... @AmiraGL: Вероятно, вам следует открыть для этого еще один вопрос, подробно описав, как вы получаете этот URL-адрес. - person Elias Dorneles; 02.10.2012
comment
@eljunior: OP использовала URL-адрес, относящийся к схеме, www.mkyong.com/etc..., поэтому без префикса http://. Если вы передадите это window.open(), оно станет относительным к текущему URL-адресу запроса. OP должен убедиться, что это абсолютный URL-адрес, такой как http://www.mkyong.com/etc.... - person BalusC; 02.10.2012
comment
привет, это снова я, я пробовал так, но у меня это не сработало, я поместил его в правки - person Amira; 02.10.2012
comment
Просто не пытайтесь использовать неправильный код, который я вообще не предлагал. Пожалуйста, не редактируйте неправильный код в ответе, который должен показывать только правильный код. Вместо этого отредактируйте свой собственный вопрос, если вам это действительно нужно. Опять же, URL-адрес должен начинаться с http://. Вы понимаете, что это значит и как это исправить? Где вы научились основам веб-разработки и основам Java? - person BalusC; 02.10.2012