有个项目,是用axis2 webservice(协议是soap)实现服务器端和客户端的交互,服务器端的代码是jsf的框架下的java web工程,我们知道当浏览器访问jsf web工程时,会创建jsf的上下文,并将managed bean实例化后放入上下文中(简单的说就FacesContext.getCurrentInstance().getELContext()能获得值),我现在客户端写了一个java桌面程序来模拟浏览器。遇到个问题就是怎么通过我的程序访问jsf工程使工程创建jsf的上下文,并将managed bean实例化后放入上下文中???
你的本地应用与容器分别运行在不同的虚拟机里,是不能直接互相访问对方的内部对象的。而且在容器内部,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信息。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。