开发者社区> 问答> 正文

关于axis2和jsf

有个项目,是用axis2 webservice(协议是soap)实现服务器端和客户端的交互,服务器端的代码是jsf的框架下的java web工程,我们知道当浏览器访问jsf web工程时,会创建jsf的上下文,并将managed bean实例化后放入上下文中(简单的说就FacesContext.getCurrentInstance().getELContext()能获得值),我现在客户端写了一个java桌面程序来模拟浏览器。遇到个问题就是怎么通过我的程序访问jsf工程使工程创建jsf的上下文,并将managed bean实例化后放入上下文中???

展开
收起
长安归故里. 2020-01-31 14:04:21 2019 0
1 条回答
写回答
取消 提交回答
  • 你的本地应用与容器分别运行在不同的虚拟机里,是不能直接互相访问对方的内部对象的。而且在容器内部,FacesContext实例是在Request Scope的(每个请求处理线程都有独立的FacesContext实例),你必须通过访问FacesServlet去创建出实例。

    综上,你没办法在本地应用里直接访问容器里的FacesContext。但如果你知道需要获取什么信息,可以在容器上用某种方法(暴露WebService或RestFul API 或最简单的通过普通http响应)通过http协议返回你需要的数据。

    例如,你可以写个页面 get-my-info.xhtml,里面只放一行代码 #{myInfoBean.returnInfo} 然后在你的myInfoBean的returnInfo方法中:

    public String returnInfo() {
                    final String json = “。。。”  //取到你需要的Managed Bean,把你需要的信息拼成JSON
    
    final FacesContext facesContext = FacesContext.getCurrentInstance();
    final Object response = facesContext.getExternalContext().getResponse();
    if (response instanceof HttpServletResponse) {
    final HttpServletResponse httpResponse = (HttpServletResponse) response;
    final PrintWriter writer = httpResponse.getWriter();
    writer.append(json);
    httpResponse.setStatus(200);
    facesContext.responseComplete();
    }
    
                    return null;
    }
    
    

    然后在你的本地应用里用HttpClient ( http://hc.apache.org/httpclient-3.x/ )之类的客户端包访问get-my-info.jsf,就能取到你在容器端拼出来的json信息。

    2020-01-31 14:05:05
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Challenging Web-Scale Graph 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载