服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 专题栏目 > WEB2.0新技术 > 查看文档

使用g4jsf集成gwt和jsf(二)

  使用g4jsf集成 google web toolkit 和 jsf,在我们应用程序的第一个版本中,我们硬编码标签字符到程序中.在下一个版本中,我们将保持该文本与java代码分离.

  使用更多的动态文本

  在我们应用程序的第一个版本中,我们硬编码标签字符到程序中.在下一个版本中,我们将保持该文本与java代码分离.

  gwt parameters in hosted mode

  一种方式是使用gwt来定义label 和message.

  13. 打开demo.gwt.client.hellowidgetentrypoint.java 文件用下面的代码替换createwidget 方法.

protected widget createwidget(final string id) {
map m = getwidgetparams(id);
final string buttonlabel = (string) m.get("buttonlabel");
final string greeting = (string) m.get("greeting");

button btn = new button(buttonlabel, new clicklistener() {
public void onclick(widget sender) {
      window.alert(greeting);
      }
});

return btn;
}

  14. 保存文件.

  15. 打开 javasource\demo\gwt\public\index.html 文件.

  该文件已经包含了一个如何定义参数的示例,我们只需要修改一下就可以了. :

  16. 修改为如下的代码:

<html>
<head>
<meta name="gwt:module" content="demo.gwt.hellowidget">
<meta name="gwt:property" content="viewid=hello">
<meta name="gwt:property" content="action=/gwtfacesservlet">
<title>gwt-jsf integration</title>
</head>
<body bgcolor="white">
<script language="javascript" src="gwt.js"></script>
<iframe id="__gwt_historyframe"
style="width:0;height:0;border:0"></iframe>

<span id="_id1" class="demo.gwt.hellowidget">
<span id="_id1:_data" style="display:none;">
<span  title="buttonlabel">say hello</span>
<span  title="greeting">hello gwt!</span>
</span>
<input type="hidden" id="javax.faces.viewstate"
name="javax.faces.viewstate" value="_id0:_id0" />
</span>

</body>
</html>

  17. 在 hosted mode 中启动ant:

  ant shell

  你现在可以看到文本定义在 public/index.html 文件中:

点击放大此图片

  然而,如果你想创建一个war文件,然后部署它.你将看不到相同的结果.这是因为 public/index.html仅仅在hosted mode中其作用.在 run-time mode,我们需要使用 jsf page.

  using jsf expression language (el) in run-time mode

  看一下webcontent\pages\base.xhtml文件.它包含如下代码:

<widget:component id="main"  /> 

  这实际上是一个gwt widget 的 jsf 包装.

  18. 定义组件的"buttonlabel" 和"greeting" 参数 :

<widget:component id="main"  buttonlabel ="click me!"
greeting="hello, gwt and jsf"/>

  19. 在run-time mode中运行该项目.

  看看结果. 然而这是不是太简单了, 下面来看看如何使用 jsf el来使它更动态一些.

  20.现在关闭xhtml 文件.

  adding a resource file

  21. 在javasource 文件夹下创建demo/gwt/app/bundle/labels.properties文件,包含下面的内容:

  #
  buttonlabel=say hello!

  adding a managed bean

  22. 在javasource中创建一个类demo.gwt.app.greetingbean .使用下面的代码:

package demo.gwt.app;

public class greetingbean {
string name;

public string getname() {
return name;
}

public void setname(string name) {
this.name = name;
}
}

  23. 在web-inf/faces-context.xml 中注册该bean.

the faces-context.xml should contain

:

<?xml version="1.0" encoding="utf-8"?>
<!doctype faces-config public "-//sun microsystems, inc.
//dtd javaserver faces config 1.1//en"
                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>

<managed-bean>
  <managed-bean-name>greetingbean</managed-bean-name>
  <managed-bean-class>demo.gwt.app.greetingbean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
  <managed-property>
   <property-name>name</property-name>
   <property-class>java.lang.string</property-class>
   <value>gwt and jsf</value>
  </managed-property>
</managed-bean>


  <application>
  <view-handler>com.sun.facelets.faceletviewhandler</view-handler>
</application>
</faces-config>

  finishing up

  要让el工作.我们要在组件类中添加属性到属性map中.

  24. 打开demo.gwt.jsf.uihellowidget, 找到 getwidgetparameters() 方法,使用下面的代码替换.

public map getwidgetparameters() {
hashmap params = new hashmap();
params.put("greeting",getattributes().get("greeting"));
params.put("buttonlabel",getattributes().get("buttonlabel"));
return params;
}

  25. 添加下面的import语句:

  import java.util.hashmap;

  现在回到 pages/base.xhtml文件中.

  26. 把资源声明放到该文件的顶部:

<f:loadbundle basename="demo.gwt.app.bundle.labels" var="bundle"/>

  27. 修改widget:component的属性:

<widget:component id="main" buttonlabel ="#{bundle.buttonlabel}"
greeting="hello #{greetingbean.name}!" />

  现在两个属性都通过el来产生了,一个来自于 bundle resource file, 一个来自于 backing bean.

  如果你创建,部署,启动该程序,你可以看到该程序现在使用的按钮标签了:

点击放大此图片

  ok,我们已经在jsf环境中参数化了gwt widget的数据. 因此你可以使用同样的方法用数据初始化该 widget .然而目前这一切看起来想一张单程车票( one-way ticket).我们还没有提到一个非常重要的方面 .

扫描关注微信公众号