`
macrabbit
  • 浏览: 230580 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Struts 2 + GWT

    博客分类:
  • GWT
阅读更多

Struts 2 + GWT
Struts GWT Plugin is the recommended way to integrate Struts 2 and GWT.Use this tutorial if you cannot change your actions, or you just don't like the way (GWT way) that you have to implement them to be used with the plugin.
These tutorial will demonstrate how to call an Struts 2 action, using GWT to submit a form and use the returned data.
Write your action.
Example action:
"Hello.java"

package example; 
  
import com.opensymphony.xwork2.Action; 
  
public class Hello { 
    private String firstName; 
    private String lastName; 
  
    public String execute() { 
        return Action.SUCCESS; 
    } 
  
    public String getFirstName() { 
        return firstName; 
    } 
    public void setFirstName(String firstName) { 
        this.firstName = firstName; 
    } 
    public String getLastName() { 
        return lastName; 
    } 
    public void setLastName(String lastName) { 
        this.lastName = lastName; 
    } 
} 

 
Write the mapping for your action.
In this example the mapping is in struts.xml:
struts.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 
  
<struts> 
  
  <package name="example"  extends="struts-default"> 
    <action name="Hello" class="example.Hello"> 
      <result type="json" /> 
    </action> 
  
    <action name="Main" class="com.opensymphony.xwork2.ActionSupport"> 
      <result>org.apache.struts.gwt.Main/Main.jsp</result> 
    </action> 
  </package> 
  
</struts> 

 The "Hello" action has a result of type "json", which will serialize the action object into a JSON string. If "firstName" is set to "John" and "lastName" is set to "Galt", the output of the "Hello" action will be:
{
   "firstName" : "John",
   "lastName"  : "Galt"
}
The "Main" action points to the "Main.jsp" page which is the page that uses GWT. The path of the result is "org.apache.struts.gwt.Main/Main.jsp". That means that the files generated by GWT must go under a folder named "org.apache.struts.gwt.Main" under the root of your application. See "Deployment structure" for more details.
Write "Main.jsp" page.
This is the page that is generated by GWT's "applicationCreator". It has been renamed to .jsp because we have modified it to be a jsp page, instead of a plain html page.
Main.jsp

 

<%@ taglib prefix="s" uri="/struts-tags" %> 
<html> 
  <head> 
    <s:head theme="ajax" debug="true"/> 
    <meta name='gwt:module' content='org.apache.struts.gwt.Main/org.apache.struts.gwt.Main'> 
  </head> 
  
  <body> 
    <script language="javascript" src="${pageContext.request.contextPath}/org.apache.struts.gwt.Main/gwt.js"/> 
  
      <form id="form1"> 
         <input type="text" name="firstName"> 
          <br/> 
          <input type="text" name="lastName"> 
          <span id="slot1"></span> 
       </form> 
  
       <br/> 
       <span id="slot2"></span> 
  </body> 
</html> 

  


We set head's tag attribute "theme" to ajax to use Dojo, don't panic, you won't have to use it directly. Note that we have changed a few things from the original html page generated by GWT, we set "content" to "org.apache.struts.gwt.Main/org.apache.struts.gwt.Main" because the GWT generated files will be under "AppRoot/org.apache.struts.gwt.Main" instead of beneath root, and we set "src" to "${pageContext.request.contextPath}/org.apache.struts.gwt.Main/gwt.js" for the same reason. Without these two changes the GWT files wouldn't be loaded.
Struts2GWTHelper
This class will take care of making the request. Why? Why do I need this class? Couple of reasons, first, there is a bug on bug on HTTPRequest.asyncPost which doesn't encode the payload properly, second, if you want to submit a form, you have to encode it yourself, and this class will help you do that. Optionally you can download a jar containing this class (with more methods) from here , add this to your GWT application file (i.e Main.gwt.xml):
<inherits name='struts2gwt.Struts2GWT'/>
and add the jar to the classpath in your compile script (i.e Main-compile.cmd) and the compile script (i.e Main-shell.cmd).
Struts2GWTHelper .java

 

package org.apache.struts.gwt.client; 
  
import com.google.gwt.user.client.ResponseTextHandler; 
  
public class Struts2GWTHelper { 
  
    /** 
     * Make asynchronous post 
     * @param url Action url 
     * @param formId id of form that will be posted 
     * @param handler callback function 
     */ 
    public static native void asyncPost(String url, String formId, ResponseTextHandler handler) /*-{ 
        dojo = $wnd.dojo; 
        //don't use the dojo.io.bind({...}) shortcut, it doesn't work here 
        var request = new dojo.io.Request(url); 
        request.load = function(type, data, request) { 
            handler.@com.google.gwt.user.client.ResponseTextHandler::onCompletion(Ljava/lang/String;)(data); 
        }; 
        request.formNode = dojo.byId(formId); 
        request.method = "POST"; 
        $wnd.dojo.io.bind(request); 
    }-*/; 
  
    /** 
     * Make asynchronous post 
     * @param url Action url 
     * @param handler callback function 
     */ 
    public static void asyncPost(String url, ResponseTextHandler handler) { 
        Struts2GWTHelper.asyncPost(url, handler); 
    } 
} 

  


See? It wasn't that bad.
Write your GWT entry point
Main.java

 

package org.apache.struts.gwt.client; 
  
import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.json.client.JSONObject; 
import com.google.gwt.json.client.JSONParser; 
import com.google.gwt.json.client.JSONString; 
import com.google.gwt.user.client.ResponseTextHandler; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.ClickListener; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.Widget; 
  
/** 
 * Entry point classes define <code>onModuleLoad()</code>. 
 */ 
public class Main implements EntryPoint { 
    final Label label = new Label(); 
  
    /** 
     * This is the entry point method. 
     */ 
    public void onModuleLoad() { 
        final Button button = new Button("Click me"); 
  
        button.addClickListener(new ClickListener() { 
            public void onClick(Widget sender) { 
                makeRequest(); 
            } 
        }); 
  
        RootPanel.get("slot1").add(button); 
        RootPanel.get("slot2").add(label); 
    } 
  
    private void makeRequest() { 
        Struts2GWTHelper.asyncPost("Hello.action", "form1", new ResponseTextHandler() { 
            public void onCompletion(String responseText) { 
                JSONObject obj = (JSONObject)JSONParser.parse(responseText); 
                JSONString firstName = (JSONString)obj.get("firstName"); 
                JSONString lastName = (JSONString)obj.get("lastName"); 
                label.setText("Welcome " + firstName.stringValue() + " " + lastName.stringValue()); 
            } 
        }); 
    } 
} 

 

The makeRequest() method will make a request to the "Hello" action that we created before, and will pass the fields of the form "form1" as parameters. Which will be populated on the action, and serialized back as JSON. Using JSONParser the JSON string is parsed into a JSON object. It is definitely not type safe as GWT Remoting, but it works.
Create Main.gwt.xml
Nothing new on this file, just as reference:
Main.gwt.xml

 

<module> 
    <!-- Inherit the core Web Toolkit stuff.                  --> 
    <inherits name='com.google.gwt.user.User'/> 
    <inherits name='com.google.gwt.json.JSON'/> 

    <!-- Specify the app entry point class.                   --> 
    <entry-point class='org.apache.struts.gwt.client.Main'/> 

</module> 

 Deployment structure


Folder                                                              Notes
AppRoot                                                          The application deployment folder
AppRoot/index.html                                         Welcome Page
AppRoot/org.apache.struts.gwt.Main              Content generated by GWT                                                                                                               (usually it gets generated into a folder named 'www')
AppRoot/WEB-INF                                            Regular webapp files and classes

分享到:
评论

相关推荐

    EJB3+Struts2+GWT Demo

    NULL 博文链接:https://webqq.iteye.com/blog/1039230

    Ext + Gwt + Struts2.0开发2

    Ext + Gwt + Struts2.0 介绍完了各自技术的实现,使用 google plugin 创建一个与struts2.0互通的实例。

    Ext + Gwt + Struts2.0开发5

    Ext + Gwt + Struts2.0 介绍完了各自技术的实现,使用 google plugin 创建一个与struts2.0互通的实例。

    Ext + Gwt + Struts2.0开发3

    Ext + Gwt + Struts2.0 介绍完了各自技术的实现,现在使用 google plugin 创建一个与struts2.0互通的实例。

    Ext + Gwt + Struts2.0开发4

    Ext + Gwt + Struts2.0 介绍完了各自技术的实现,现在使用 google plugin 创建一个与struts2.0互通的实例。

    Ext + Gwt + Struts2.0开发1

    Ext + Gwt + Struts2.0介绍各自技术的实现,使用 google plugin 创建一个与struts2.0互通的实例。

    GWT+EXT+STRUTS2+Eclipse完整范例.rar

    整合 GWT EXT STRUTS2 Eclipse 范例

    gwt+struts2 使用 struts2gwtplugin 例子

    一个示例 展示 struts2 和gwt 的结合 gwt struts2 struts2gwtplugin-0.2.1.jar

    浅论struts2与gwt

    NULL 博文链接:https://hgflybird.iteye.com/blog/389152

    struts2与gwt的整合

    NULL 博文链接:https://hgflybird.iteye.com/blog/353636

    gwtext无缝整合struts2

    研究gwt+ext+ssh框架整合编写的一个实例,实例中包括一个说明文档(google plugin创建gwt实例说明、gwt-ext实例的创建、gwt-ext与struts2整合实例说明);还包括文档对应的myeclipse项目。相关的包稍微有点大,没有...

    一个smart+struts2的例子

    一个smart+struts2的例子,希望对于学习smartGWT如何和现有的框架整合开发的人有帮助。

    GWT_2BEXT_2BSTRUTS2完整实例

    GWT_2BEXT_2BSTRUTS2完整实例 学习gwt非常有用,希望对你有所帮助

    struts2gwtplugin-1.02.jar

    struts2gwtplugin-1.02.jar 插件,找了半天才找到

    Maven2 来完成Struts2.0项目的打包实例

    mvn install:install-file -D groupId=org.zenika.widget -D artifactId=gwt-datepicker -D version=r29 -D packaging=jar -D file=C:\gwt-datepicker-r29.jar 命令参数详解: mvn install:install-file: maven 安装...

    gwtplugin

    GWT 的struts2支持

    8种Java Web框架安装手记及HelloWorld

    8种Java Web框架安装手记,分别是Grails,GWT,JSF,Play,Spring,Struts,Vaadin,Wacket。全部是截止2013-12-19最新的框架版本,文档最后有链接可以下载所有相关资料和jar包以及示例程序,任何问题可以联系...

    eclipse/Myeclipse插件一键生成

    一件生成SSH/SSI另外支持gwt配置,完全支持eclipse,Myeclipse

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

Global site tag (gtag.js) - Google Analytics