0

我想使用 JSON 和 Ajax 在两个应用程序之间发送数据。对于第一个测试,我想单击一个按钮(在 xhtml 中)并在 managedbean 中接收数据(在第二个应用程序中)。

为此,我创建了:

xhtml页面:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui">
    <body>
        <ui:composition template="/templates/template.xhtml">
            <ui:define name="content">
                <h:outputScript library="js" name="test.js" />
                <h:form>
                <h:button  onclick="validate();" value="Tester" type="button"/> 
                </h:form>
            </ui:define>
        </ui:composition>
    </body>
    </html>

测试.js:

function validate(){ 
    try{
        var myJSONObject = {"name":"hello","address":"xyz"};
        var toServer = "data=" + encodeURIComponent(myJSONObject);
        var request=new XMLHttpRequest();
        request.open("POST", "http://'xxLocalIPxx':8080/Project1/folderTest/TestBean", true);
        request.send(toServer);
        return true;
    }
    catch(err)
    {
    alert(err.message);
    }
};

托管豆测试豆:

public class TestBean extends HttpServlet{
    private static final long   serialVersionUID    = 1L;

    public TestBean() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // PrintWriter out = response.getWriter();
        String output = request.getParameter("params");
        System.out.println("Servlet : " + output);
    }
}

但是,当我单击 xhtml 页面中的按钮时,我没有执行 managedBean 中的方法 doGet。我试图在这个方法中设置一个断点,但它从来没有用过。

为什么 ?

谢谢。

4

1 回答 1

3

您正在混合servletJSF backing beans。他们彼此没有任何关系。您所拥有的TestBean类本质上是一个 servlet,而不是一个 JSF 支持 bean。您不能通过@ManagedBean在类上或<managed-bean>faces-config.xml. 它必须注册为一个完全有价值的 servlet。您可以为此使用@WebServlet类上的注释或<servlet>条目web.xml

假设您的环境支持 Servlet 3.0,只需使用@WebServlet注册它:

@WebServlet("/testservlet")
public class TestServlet extends HttpServlet {
    // ...
}

(这里 ,/testservlet是 servlet 必须监听的 URL 模式)

并且,假设这/Project1是上下文路径,将其调用为

http://example.com:8080/Project1/testservlet

(如果你先在浏览器的地址栏中直接输入 URL 来测试它会更容易)

也可以看看:

于 2012-09-26T15:22:20.190 回答