Calling a Java Method from Handwritten JavaScript

63 views
Skip to first unread message

ASlak

unread,
Aug 8, 2011, 3:58:08 PM8/8/11
to Google Web Toolkit
I have some code in my host html page that I would like to call one of
my java methods from.

The relevant part of the html looks like:
<script>
if(myCondition){
sendRequest(myVar);
}
</script>

I have a method in my java code for my gwt project that is called
sendRequest.

I am also using a method that looks like:
public native void exportMethod(myApp app)/*-{
$wnd.sendRequest =
$entry(app.@com.myCompany.myProject.client.myClass::sendRequest(Ljava/
lang/String;));
}-*/;


This is based off of what I found in the gwt documentation here:http://
code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html

The problem is that this is not working, and I am not sure why.

I would appreciate it if anyone could give me a hint.

Thanks

Jens

unread,
Aug 8, 2011, 4:12:54 PM8/8/11
to google-we...@googlegroups.com
Have you called your JSNI method once on app startup? If you do not call it once, $wnd.sendRequest won't point to your JSNI method.

-- J.

ASlak

unread,
Aug 8, 2011, 4:15:18 PM8/8/11
to Google Web Toolkit
yes I call it in onModuleLoad()

it looks like:

MyClass app = this;
exportMethod(app);

karim duran

unread,
Aug 9, 2011, 5:20:32 AM8/9/11
to google-we...@googlegroups.com
Hi ASlak,

It should work. I already  did that.

Don't forget that, finally, all your java code will be translated in optimized javascript.
I haven't enough element about your problem to really help you.

So, here's my proposition.

1) build your application as you usually do
2) run it in firefox
3) install firebug, a firefox extension wich provide a javascript debuger with breakpoint management and step debuging
4) open tab "javascript" in firebug and set a breakpoint where your javascipt method is called
5) watch your variables, fields...etc...and try  to analyse what is happening.

I used this methodology to track some jsni method behaviour, difficult to debug, from the point of view of java.

I hope it helps.

Regards.

Karim Duran

2011/8/8 ASlak <alain...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-we...@googlegroups.com.
To unsubscribe from this group, send email to google-web-tool...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.


Paul Stockley

unread,
Aug 9, 2011, 6:38:53 AM8/9/11
to google-we...@googlegroups.com
I've done what you did with  static methods. However,  I don't think you can call a non-static method in the way you are proposing.

ASlak

unread,
Aug 9, 2011, 9:44:14 AM8/9/11
to Google Web Toolkit
Thanks karim! Firebug is a great tool.

I have learned from it that my method is accessible from the html
where I am calling it from and the variable that I want included in
the call is being included, however there is still a problem.

According to firebug it looks like everything should be working fine,
but my java method is still not actually being executed. To me this
indicates a problem with the path provided by the exportMethod()
perhaps, but I have checked this many times and it seems to be
correct.

My methods are not static. I would prefer to leave them that way, but
I could possibly change them (the java method I need to call is
dependent on many other methods and variables that I would also need
to make static in order to use). I feel like this should work
regardless of whether or not the methods are static, but if someone
else can confirm what Paul said about the methods having to be static
I can try that.

Thanks everyone.

On Aug 9, 5:20 am, karim duran <karim.du...@gmail.com> wrote:
> Hi ASlak,
>
> It should work. I already  did that.
>
> Don't forget that, finally, all your java code will be translated in
> optimized javascript.
> I haven't enough element about your problem to really help you.
>
> So, here's my proposition.
>
> 1) build your application as you usually do
> 2) run it in firefox
> 3) install firebug, a firefox extension wich provide a javascript debuger
> with breakpoint management and step debuging
> 4) open tab "javascript" in firebug and set a breakpoint where your
> javascipt method is called
> 5) watch your variables, fields...etc...and try  to analyse what is
> happening.
>
> I used this methodology to track some jsni method behaviour, difficult to
> debug, from the point of view of java.
>
> I hope it helps.
>
> Regards.
>
> Karim Duran
>
> 2011/8/8 ASlak <alain.s...@gmail.com>
>
> > I have some code in my host html page that I would like to call one of
> > my java methods from.
>
> > The relevant part of the html looks like:
> > <script>
> > if(myCondition){
> > sendRequest(myVar);
> > }
> > </script>
>
> > I have a method in my java code for my gwt project that is called
> > sendRequest.
>
> > I am also using a method that looks like:
> > public native void exportMethod(myApp app)/*-{
> > $wnd.sendRequest =
> > $entry(a...@com.myCompany.myProject.client.myClass::sendRequest(Ljava/

Alain Ekambi

unread,
Aug 9, 2011, 10:06:45 AM8/9/11
to google-we...@googlegroups.com
Maybe you want to check  http://code.google.com/p/gwt-exporter/
it will take care of the exporting for you.

2011/8/9 ASlak <alain...@gmail.com>



--


ASlak

unread,
Aug 9, 2011, 10:16:52 AM8/9/11
to Google Web Toolkit


I think I have found the problem. After setting up a breakpoint with
firebug and using the "step into" ability I found a piece of code that
is generating an exception.

in *.cache.html:

_.sendRequest_0 = function sendRequest(id, pw){
$sendRequest(this, id, pw);
}

The problem is that _.sendRequest_0 is undefined. The exception is
Java.util.NoSuchElementException {castable TypeMap = $object}

This part of the code is automatically generated, so I must be making
a mistake somewhere else that is causing this.

Any ideas?

ASlak

unread,
Aug 9, 2011, 10:20:05 AM8/9/11
to Google Web Toolkit
Thanks Alain,

I would prefer to avoid adding extra dependencies to my application,
but I will look into this if I cannot find another way to resolve this
issue.

On Aug 9, 10:06 am, Alain Ekambi <jazzmatad...@googlemail.com> wrote:
> Maybe you want to check  http://code.google.com/p/gwt-exporter/
> it will take care of the exporting for you.
>
> 2011/8/9 ASlak <alain.s...@gmail.com>

Alain Ekambi

unread,
Aug 9, 2011, 10:31:15 AM8/9/11
to google-we...@googlegroups.com
You r welcome.
GwtExporter is a good solution  for the type of things you are trying to do. 
Why going through all the pain when somebody allready did it for u. 
Or maybe i m just lazy ? :)

And dont forget this is GWT. You dont use a module it wont end up in the generated code. So i dont see the problem by adding it to your project.

2011/8/9 ASlak <alain...@gmail.com>



--

ASlak

unread,
Aug 9, 2011, 10:50:58 AM8/9/11
to Google Web Toolkit
Hi Alain,

So I tried using GwtExporter. I edited my *.get.xml to include what
they had on their "getting started" guide. I also added their library
to the project.

Then I changed my class to look like:
public class myClass implements EntryPoint, Exportable{

And my method to look like this:
@Export("sendRequest")
private void sendRequest(...){

The problem is that when I try to compile i get this error:
"Could not find entry method 'onModuleLoad()' method in entry point
class"

The onModuleLoad() is right where it should be and was working before
I made the changes to include the GwtExporter.

Any idea how to fix this? I obviously can't use GwtExporter if my
project won't even compile with it.

On Aug 9, 10:31 am, Alain Ekambi <jazzmatad...@googlemail.com> wrote:
> You r welcome.
> GwtExporter is a good solution  for the type of things you are trying to
> do.
> Why going through all the pain when somebody allready did it for u.
> Or maybe i m just lazy ? :)
>
> And dont forget this is GWT. You dont use a module it wont end up in the
> generated code. So i dont see the problem by adding it to your project.
>
> 2011/8/9 ASlak <alain.s...@gmail.com>

Alain Ekambi

unread,
Aug 9, 2011, 11:02:48 AM8/9/11
to google-we...@googlegroups.com
I think you need to add 

@Export
on the class itself

Note that the method you want to export needs to be public




Try this :


@ExportPackage("test")
@Export
public class myClass implements EntryPoint, Exportable{


 @Export("sendRequest")
 public void sendRequest(...){


in the js you will need something like 

var v  = new test.MyClass();
t.sendRequest();


This should work

Best,

Alain


2011/8/9 ASlak <alain...@gmail.com>



--

ASlak

unread,
Aug 9, 2011, 11:10:07 AM8/9/11
to Google Web Toolkit
It still cannot find OnModuleLoad. I will try moving the method to a
different class(without onModuleLoad) to see if I can get it to work
from there.

On Aug 9, 11:02 am, Alain Ekambi <jazzmatad...@googlemail.com> wrote:
> I think you need to add
>
> @Export
> on the class itself
>
> Note that the method you want to export needs to be public
>
> Try this :
>
> @ExportPackage("test")
> @Export
> public class myClass implements EntryPoint, Exportable{
>
>  @Export("sendRequest")
>  public void sendRequest(...){
>
> in the js you will need something like
>
> var v  = new test.MyClass();
> t.sendRequest();
>
> This should work
>
> Best,
>
> Alain
>
> 2011/8/9 ASlak <alain.s...@gmail.com>

Alain Ekambi

unread,
Aug 9, 2011, 11:19:41 AM8/9/11
to google-we...@googlegroups.com
Yeah maybe you cant export the entry point class
i never tried that.


2011/8/9 ASlak <alain...@gmail.com>



--

Alain Ekambi

unread,
Aug 9, 2011, 11:20:34 AM8/9/11
to google-we...@googlegroups.com
Oh yeah dont forget to actually export your class
by calling ExportUtil.exportAll();

2011/8/9 Alain Ekambi <jazzma...@googlemail.com>

Manuel Carrasco Moñino

unread,
Aug 19, 2011, 3:53:28 AM8/19/11
to google-we...@googlegroups.com
When you get this error there is something more going out.
Use the latest snapshot which has several fixes, and if the problem
continues, pls open an issue in gwtexporter with detailed information.

Anyway, one of latest features in gwt-exporter is the ExportOverlay,
with it, you can create a separate gwt module importing your app, but
you do not need to annotate your original classes nor import the
library.


- Manolo

Reply all
Reply to author
Forward
0 new messages