1

我有一个 JSF 页面,用户可以在其中向外部链接提交一些数据。但是,在这样做之前,我需要从支持 bean 调用本地操作。我可以通过什么方式实现这一目标?

这是我的表单示例(由于外部链接操作,使用普通 HTML):

<form method="POST" action="https://EXTERNAL-LINK.com/">
    <input type="hidden" ... />
    <button>Submit</button>
</form>

所以简而言之,这是我的情况:

  1. 提交表单我点击按钮
  2. 从 bean 调用本地方法
  3. 将表单提交到外部链接

关于如何实现这一目标的任何想法?

4

2 回答 2

2

我会首先在幕后通过 AJAX 提交 JSF 表单,当响应到达时,我会将您的纯 HTML 表单提交到外部 URL。

例子:

<script type="text/javascript">
    function jsf(data) {
        if(data.status == 'success') {
            document.getElementById('plain-submit').click();
        }
    }
    function normal() {
        document.getElementById('jsf-submit').click();
    }
</script>
...
<h:form prependId="false">
    ...
    <h:commandButton id="jsf-submit" action="#{bean.action} value="Submit" style="display:none">
        <f:ajax execute="@form" ... onevent="jsf"/>
    </h:commandButton>
</h:form>
<form method="POST" action="https://EXTERNAL-LINK.com/">
    ...
    <input id="button-submit" type="button" onclick="normal()" ...>Submit</input>
    <input id="plain-submit" type="submit" style="display:none">Submit</input>
</form>

或者通过使纯 HTML 表单不可见来扭转这种情况会更容易,从而减少 JavaScript 操作的数量:您通过 AJAX 提交(可见)JSF 表单,然后在响应成功返回时提交(不可见)纯 HTML 表单。

于 2013-07-15T14:46:09.387 回答
2

<form>将to和其他 HTML 组件更改<h:form>为 JSF 组件,将它们的值与托管 bean 绑定并让用户提交数据。然后,在您的action方法中评估数据,然后使用Apache HttpClient之类的库向您想要/需要的 URL 发送 POST 请求。

这可能是一个原始示例(基于您的示例)。

JSF 代码

<h:form >
    <h:inputHidden value="#{bean.aField}" />
    <h:commandButton value="Submit" action="#{bean.anAction}" />
</h:form>

托管 bean 代码

@ManagedBean
@RequestScoped
public class Bean {
    private String aField;
    //constructor, getter and setter...
    public void anAction() {
        //do your form processing...
        HttpRequestHandler httpRequestHandler = new HttpRequestHandler();
        httpRequestHandler.handlePost(...); //send the arguments here
    }
}

public class HttpRequestHandler {
    public void handlePost(String ... parameters) {
        //you do the Apache HttpClient POST handling here
        //always create a class between your application and your third party libraries
        //code adapted from HttpClient examples: http://hc.apache.org/httpcomponents-client-ga/examples.html
        HttpClient httpclient = new DefaultHttpClient();
        try {
            HttpPost httpPost = new HttpPost(...);// your URL goes here
            //do as you please with the HttpPost request

        } finally {
            httpclient.getConnectionManager().shutdown();
        }
    }
}

如果您不想为此作业添加 Apache HttpClient 库,则可以使用本机 Java 类URLConnection,如下所示:Using java.net.URLConnection to fire and handle HTTP requests

于 2013-07-15T14:46:48.427 回答