注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

widebright的个人空间

// 编程和生活

 
 
 

日志

 
 

我也来学习Google Web Toolkit (二)与JSF2.0集成  

2010-05-04 20:11:01|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

我个人觉得GWT和JSF之类的网页技术一起使用是比较合适的,虽然GWT也可以直接通过RPC和服务器端进行交互,但在某种情况下使用传统的网页技术也是很不错的。因为以前简单看过JSF(http://java.sun.com/javaee/javaserverfaces/),所以就去看了看。JSF已经升级到2.0版本了,到JSF2.0项目 Mojarra Project. https://javaserverfaces.dev.java.net/ 的主页把jsf的库下载下来,放到GWT项目的WEB-INF/lib目录里面,使用GWT的”Web Application “模式运行项目,Google集成的Jetty服务器就可以支持JSF2.0的了,可以在"Configure Debug“那里设置Google的 "Web Application“ 调试的模式的设置,比如classpath,是不是使用内置的Jetty服务器等。我试过这个JSF2.0的库也是可以放到Tomcat中使用的。

我也来学习Google Web Toolkit (二)与JSF2.0集成 - widebright - widebright的个人空间

写个简单的登录界面,在GWT的dialogbox 里面用一个iframe包含一个JSF的页面,运行效果如图,正确工作了的。

我也来学习Google Web Toolkit (二)与JSF2.0集成 - widebright - widebright的个人空间

我也来学习Google Web Toolkit (二)与JSF2.0集成 - widebright - widebright的个人空间

--------------------------------------------------------------------------

index.xhtml 文件内容,注意我根据JSF包的例子,把Eclipse自动生成的jsf模板的头部改了的,不改好像不能正确运行,JSF2.0使用的xhtml语法,所以页面也是最好使用xhtml语法吧。注意文件扩展名一定要用 .xhtml不然运行的时候出错。以前jsf1.0好像是可以是哟娜 *.jsf 或者*.jsp的,所以我一开始也是用index.jsf这样,结果就是出错了,他的错误提示好像是什么ELParser还是什么ELResolver 的错误,一点也不清楚,害我找了半天也不知道。后来改了他自带例子一样xhtml扩展名才发现可以了。但好像Eclipse的JAVAEE IDE也还不支持JSF2.0的,在WebEdit中编辑*.xhtml的页面文件时,他是不能支持JSF属性的,非要把名字改成*.jsf或者*.jsp 才行,所以很麻烦,老是把名字改来改去。两边都做得不好,JSF那边实现由只认*.xhtml也不知道他们是怎么想的,错误提示也不能做好的。找知道一开始选NetBean了,听说那个是支持JSF2。0的了。

-----------------------------------------------------------------------------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

<title>Login</title>

</head>

<body>

<f:view>

     <h1>#{LoginBean.msg}</h1>

<h:form id="widebright">

   <h:outputLabel value="用户名"></h:outputLabel>

   <h:inputText value="#{LoginBean.name}" id="username"></h:inputText>

   <h:commandButton type="submit" value="登录" actionListener="#{LoginBean.Submit}"></h:commandButton>

</h:form>

</f:view>

</body>

</html>

actionListener属性指定一个public声明的返回void和带一个ActionEvent参数的办法就可以了,下面代码里面有。

-------------------------------------------------------------------------------

LoginBean.java

注意JSF2.0使用“@ManagedBean”来标志后台Bean了,这样就可以不使用以前jsf 1.0那样的faces。xm配置文件了。不过注意这个东东,默认会把第一个类名大写字母转成小写字母来使用。我也不知道他们为什么要这样搞,害我又是弄了半天。后来发现他文档上也是有说的,不过为什么不用同样的名字那不很好么,非要把人家第一个如果是大写的转成小写,唉。

-------------------------------------------------------------------------

package widebright.faces;

import javax.faces.bean.ManagedBean;

import javax.faces.bean.SessionScoped;

import java.io.Serializable;

import java.util.Map;

import javax.faces.event.ActionEvent;

import javax.faces.event.AbortProcessingException;

import javax.faces.event.ActionListener;

import javax.faces.context.FacesContext;

import javax.servlet.http.HttpSession;

//不指定bean的名称,那么就会使用缺省的名称userNumberBean(也就是该bean的类名,但是将第一个字母小写)。

@ManagedBean(name = "LoginBean")

@SessionScoped

public class LoginBean implements Serializable{

private static final long serialVersionUID = 123123131L;

  

private String name;

    public String getName() { return name;}

    public void setName(String name) { this.name = name; }

  

    private String msg;

    public String getMsg() { return msg;}

    public void setMsg(String msg) { this.msg = msg; }

       

    public void Submit (ActionEvent event)

    {

        FacesContext context = FacesContext.getCurrentInstance();

//       Map requestParams = context.getExternalContext().getRequestParameterMap();

//

//       String username = (String) requestParams.get("username");

//

//       if ("widebright".equals(username))

//       {

//         System.out.println("登录成功") ;

//         this.msg = "登录成功" ;

//       }else {

//         this.msg = "你的名字是:" + username +"不允许登录" ;       

//       }

  

    if ("widebright".equals (this.name))

        {

       this.msg = "登录成功" ;

       HttpSession session =(HttpSession) context.getExternalContext().getSession(true);

            session.setAttribute("user", name);

        }

    else

    {

       this.msg = "你的名字是:" + this.name +"不允许登录" ;       

    }

        

    }

}

---------------------Google 前台和RPC的代码-----------------

package widebright.client;

import com.google.gwt.user.client.rpc.RemoteService;

import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

/**

* The client side stub for the RPC service.

*/

@RemoteServiceRelativePath("greet")

public interface GreetingService extends RemoteService {

String greetServer(String name) throws IllegalArgumentException;

String getLoginUserName() throws IllegalArgumentException;

}

-------------------------------------

package widebright.client;

import widebright.shared.FieldVerifier;

import com.google.gwt.core.client.EntryPoint;

import com.google.gwt.core.client.GWT;

import com.google.gwt.event.dom.client.ClickEvent;

import com.google.gwt.event.dom.client.ClickHandler;

import com.google.gwt.event.dom.client.KeyCodes;

import com.google.gwt.event.dom.client.KeyUpEvent;

import com.google.gwt.event.dom.client.KeyUpHandler;

import com.google.gwt.user.client.rpc.AsyncCallback;

import com.google.gwt.user.client.ui.Button;

import com.google.gwt.user.client.ui.DialogBox;

import com.google.gwt.user.client.ui.HTML;

import com.google.gwt.user.client.ui.Label;

import com.google.gwt.user.client.ui.RootPanel;

import com.google.gwt.user.client.ui.TextBox;

import com.google.gwt.user.client.ui.VerticalPanel;

/**

* Entry point classes define <code>onModuleLoad()</code>.

*/

public class Widebright implements EntryPoint {

/**

* The message displayed to the user when the server cannot be reached or

* returns an error.

*/

private static final String SERVER_ERROR = "An error occurred while "

    + "attempting to contact the server. Please check your network "

    + "connection and try again.";

/**

* Create a remote service proxy to talk to the server-side Greeting service.

*/

private final GreetingServiceAsync greetingService = GWT

    .create(GreetingService.class);

/**

* This is the entry point method.

*/

public void onModuleLoad() {

   final Button sendButton = new Button("Send");

   final TextBox nameField = new TextBox();

   nameField.setText("GWT User");

   final Label errorLabel = new Label();

  

   final String userName ="";

   greetingService.getLoginUserName(new AsyncCallback<String>() {

      public void onFailure(Throwable caught) {

       ;

      }

      public void onSuccess(String result) {

       userName.concat(result);

      }

     });

  

  

   // We can add style names to widgets

   sendButton.addStyleName("sendButton");

   // Add the nameField and sendButton to the RootPanel

   // Use RootPanel.get() to get the entire body element

   RootPanel.get("nameFieldContainer").add(nameField);

   RootPanel.get("sendButtonContainer").add(sendButton);

   RootPanel.get("errorLabelContainer").add(errorLabel);

   // Focus the cursor on the name field when the app loads

   nameField.setFocus(true);

   nameField.selectAll();

   // Create the popup dialog box

   final DialogBox dialogBox = new DialogBox();

   if (userName.isEmpty())

   {

    dialogBox.setText("Please Login!");

    dialogBox.setAnimationEnabled(true);

    dialogBox.add(new HTML("<iframe width=100% height=100% src=\"./jsf/index.xhtml\"></</iframe>"));

    dialogBox.center();

   }else

   {

  

   dialogBox.setText("Remote Procedure Call");

   dialogBox.setAnimationEnabled(true);

   final Button closeButton = new Button("Close");

   // We can set the id of a widget by accessing its Element

   closeButton.getElement().setId("closeButton");

   final Label textToServerLabel = new Label();

   final HTML serverResponseLabel = new HTML();

   VerticalPanel dialogVPanel = new VerticalPanel();

   dialogVPanel.addStyleName("dialogVPanel");

   dialogVPanel.add(new HTML("<b>Sending name to the server:</b>"));

   dialogVPanel.add(textToServerLabel);

   dialogVPanel.add(new HTML("<br><b>Server replies:</b>"));

   dialogVPanel.add(serverResponseLabel);

   dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);

   dialogVPanel.add(closeButton);

   dialogBox.setWidget(dialogVPanel);

   // Add a handler to close the DialogBox

   closeButton.addClickHandler(new ClickHandler() {

    public void onClick(ClickEvent event) {

     dialogBox.hide();

     sendButton.setEnabled(true);

     sendButton.setFocus(true);

    }

   });

   // Create a handler for the sendButton and nameField

   class MyHandler implements ClickHandler, KeyUpHandler {

    /**

    * Fired when the user clicks on the sendButton.

    */

    public void onClick(ClickEvent event) {

     sendNameToServer();

    }

    /**

    * Fired when the user types in the nameField.

    */

    public void onKeyUp(KeyUpEvent event) {

     if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {

      sendNameToServer();

     }

    }

    /**

    * Send the name from the nameField to the server and wait for a response.

    */

    private void sendNameToServer() {

     // First, we validate the input.

     errorLabel.setText("");

     String textToServer = nameField.getText();

     if (!FieldVerifier.isValidName(textToServer)) {

      errorLabel.setText("Please enter at least four characters");

      return;

     }

     // Then, we send the input to the server.

     sendButton.setEnabled(false);

     textToServerLabel.setText(textToServer);

     serverResponseLabel.setText("");

     greetingService.greetServer(textToServer,

       new AsyncCallback<String>() {

        public void onFailure(Throwable caught) {

         // Show the RPC error message to the user

         dialogBox

           .setText("Remote Procedure Call - Failure");

         serverResponseLabel

           .addStyleName("serverResponseLabelError");

         serverResponseLabel.setHTML(SERVER_ERROR);

         dialogBox.center();

         closeButton.setFocus(true);

        }

        public void onSuccess(String result) {

         dialogBox.setText("Remote Procedure Call");

         serverResponseLabel

           .removeStyleName("serverResponseLabelError");

         serverResponseLabel.setHTML(result);

         dialogBox.center();

         closeButton.setFocus(true);

        }

       });

    }

   }

   // Add a handler to send the name to the server

   MyHandler handler = new MyHandler();

   sendButton.addClickHandler(handler);

   nameField.addKeyUpHandler(handler);

   }

}

}

-----------web.xml配置文件-------------------------

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"

         xmlns="http://java.sun.com/xml/ns/javaee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<display-name>widebright</display-name>

<description>widebright haha</description>  

<!-- Change to "Production" when you are ready to deploy -->

<context-param>

<param-name>javax.faces.PROJECT_STAGE</param-name>

<param-value>Development</param-value>

</context-param>

<!-- Servlets -->

<servlet>

    <servlet-name>greetServlet</servlet-name>

    <servlet-class>widebright.server.GreetingServiceImpl</servlet-class>

</servlet>

<!-- Faces Servlet -->

<servlet>

<servlet-name>Faces Servlet</servlet-name>

<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<!-- Faces Servlet Mapping -->

<servlet-mapping>

<servlet-name>Faces Servlet</servlet-name>

<url-pattern>*.xhtml</url-pattern>

</servlet-mapping>

   

<servlet-mapping>

    <servlet-name>greetServlet</servlet-name>

    <url-pattern>/widebright/greet</url-pattern>

</servlet-mapping>

<!-- Default page to serve -->

<welcome-file-list>

    <welcome-file>Widebright.html</welcome-file>

</welcome-file-list>

</web-app>

---------------------------------------------

就是在GWT项目的默认配置基础上加上jsf的servlet的那些映射了,注意文件扩展名一定使用xhtml哦,前面说过的了。

其他的没什么了,看看JSF和GWT的文档就行了。JSF文档在下载下来的JSF2.0的包里面有,很多JSF控件属性说明啊什么的都要看一看。

  评论这张
 
阅读(1015)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017