Play Framework: Controller action runs every load - java

Does anyone know why my action runs every time I reload a page. I have a page with a button that should run when I click on it. But now it seems to run when I load the page.
Here is my button and javascript in file deliverables.scala.html
<input type="button" class="btn success" id="add" value="Export to Excel" onclick="JavaScript:generateExcelClick()" />
<script>
function generateExcelClick(event)
{
window.location = "#Application.generateExcel(currentPage)";
}
</script>
And my controller:
public static void generateExcel(List<Infoobject> list) {
...creating a file (works)
...No return
}
How can I change this code so it only runs when I click on the button? The action should not render an another page or something like that. I only want to generate a file.
Thanks!
Edit
I've tried #controllers.Application.generateExcel(currentPage); and #Application.generateExcel(currentPage); in my Javascript function, but it's still creating the file even if I don't click the button.
I have also checked that #Application.generateExcel(currentPage); doesn't runs from an another site och function.
Someone, please?

A little explanation:
When writing in your Scala view and you say
#Application.generateExcel(currentPage)
It runs the function generateExcel in controller Application
What to do
You don't want it to run the function immediately. You want it to go there onClick
So use
#routes.Application.generateExcel(currentPage)
This outputs a link to that function
However for this to work there has to be a (GET) link to that function in your routes
Add this to routes
GET /whatever/:thing controllers.Application.generateExcel(thing: List<path.InfoObject> list)
HOWEVER
This is a bad idea.Why?
Because putting your entire list in a URL just isn't nice.
Do you ever see a complex list in a URL
URLs have to be less than 2000 characters
WHAT TO DO INSTEAD
Send the list as a POST data. Depending on how you take in your data you'll have to figure it out

If you are trying to just call a controller when clicking on a button, you could try :
<button>Mybutton</button>
I don't think you need javascript here (if I understood your situation).
Edit: The idea of this answer is to say that the less javascript in your page, the better.
Edit2 : Can't comment the discussion below, so I put it here:
As I said here : link, your have to declare your object like this :
controllers.Application.method(list : java.util.List[your.package.Infoobject])
Replace your.package with the package in which your object is (maybe models)
But you will get an errror : No QueryString binder found for type
This is because you can only put Strings and numerals in URLS, so the framework tells you to transform your Object (List) in a String (with the QueryStringBinder).

I would call routes-> /generateExcelReport from the button/link and make it return the file
How to send a file to browser for downloading?
How to download a file with Play Framework 2.0

Related

call a java method when Click on a html button without using javascript

i work on JSP and i want to call a java method(Function) on Click on a html button without using<script></script>.how?
i try to write this code:
<button onclick="<%po.killThread();%>">
<font size="4">Kill</font>
</button>
but it doesn't work... so please help me.
thanks
You're misunderstanding how server-side programming works. When you load that page, the webserver will get to the line <button onclick="<%po.killThread();%>"> and will immediately parse and execute the JSP snippet, in your case po.killThread(), and replace everything between the <% and %> with the return value of that method, if any. And all these happens on server side, before client receives any thing. (Note that this will only happen if that page is not already been loaded and compiled into a Servlet by the server.)
Thus, the HTML that client receives, will be something like, <button onclick="some return value or nothing">, which means that nothing will happen when you press the button. If you want to execute further JSP commands on the button press you will need to make a new request to the server - for example, by redirecting the page.
This will call the function killThread when you open the website.
Try to redirect to another jsp which calls the function.
this will not run at all because after the jsp page is compiled it will return the po.killThread() value but will not call this method
You can see this by viewing the page source
JSP is a server-side technology. Did I say server-side?
In order to understand how JSP works and to clear any misconception, JavaRanch Journal (Vol. 4, No. 2): The Secret Life of JavaServer Pages is a very good read.
An excerpt from the same,
JSP is a templating technology best-suited to the delivery of dynamic text documents in a format that is white-space agnostic.
Template text within a JSP page (which is anything that is not a dynamic element), to include all white-space and line terminators, becomes part of the final document.
All dynamic elements in a JSP are interpreted on the server and once the document is sent to the client, no further dynamic interaction is possible (short of requesting the same or another document).
If you are using JSPs, then to perform some method calles, you will have to write a servlet and then call the method in doPost or doGet method of servlet.
On the other hand, if you want to make things simpler, use JSF framework which will help you achieve your objective as JSF supports event handling.

How do I inject another JSP page into a <div> when clicking a link?

I have two different divisions in a JSP page. One contains a menu of links, when clicked the div2 (id-content) loads different pages accordingly. I am doing something like -
<div id="menu">
<ul class="navbar">
<li><a name="login" href="Login.jsp" onclick="changeContent()">Login</a>
</li></div>
and in the script I have something as -
<script language="JavaScript">
function changeContent() {
document.getElementById('content').load('Login.jsp');
}
</script>
I also tried -
document.getElementById('content').innerHTML=
"<jsp:include page="Login.jsp">";
None of the ways worked. Please suggest how should I
Try jquery..
function changeContent() {
$('#content').load('Login.jsp');
}
The solution is to use Ajax, which will asynchronously retrieve your page content that can be pasted in with the innerHTML method. See my answer to a similar question of how an Ajax call works and some introductory links.
As to why your examples in your answer don't work, in the first case there is no load() method on an Element object (unless you've defined one yourself and not shown it). In the second example, as one of the question comments says, there is probably something causing a syntax error in the javascript.
As an FYI, when there is a syntax error in some javascript in a web page, the current expression being parsed and the rest of the <script></script> block will be ignored. Since this is inside a function declaration, that function will never get defined.
For instance, an embedded quote in the included page will end the string for the innerHTML assignment. Then the javascript parser will try to parse the remainder of the HTML causing a syntax error as the HTML will not be valid javascript.
We use jquery. Add a click event handler to the anchor elements. In the click handler call $('#content').load(your_url);. You might want to use the load(url, function() { ...}) version. More info here http://api.jquery.com/load/
Your initial page comes down from the server. It's displayed by the browser. When you click on a link (or a button) in the browser, you want to fill the second div with new HTML. This is is a perfect job for an AJAX request. What the AJAX object in the browser does, is to send a POST (or whatever) string to the server. And then the Ajax object receives the HTML response back from the server. And then you can display that response data which the AJAX object contains, anywhere you want.

Communicating between JavaScript and Servlet

In my JSP page I have DIV.
<div id="100">
ALI
</div>
When I click on this DIV...
$("#100").click(function(){
});
...I need to send the value of the id 100, to a servlet, so that the servlet makes some database java codes, and returns for example, either 1 or 0. How can I do that? and is this the proper way?
Using Ajax, you should call your server using a URL similar to this:
http://localhot:8080/youAppContext/yourServer?id=100
Then, in the servler side, you should retrieve the value that will be in the request with the name "id"
There are out there many tool as jQuery that can help you to do the Ajax petition.
Edited
Well, here you can find a very simple Ajax example using jQuery. In the example, instead call a file (test1.txt) you should invoke a URL (as I described above). Of course, you will need to write some JS code to build your URL (where id be a variable). Once task is done in servlet side, you can return whatever, for example: "done" and display or not this information the HTML as it is done in the example.
Take a look to this Web, there are many links that can help you.
get the value using
var value = $("#100").html();
and pass it to servlet using AJAX

can ajax call other ajax page?

I have index page,which contain div section.i want to call different pages into this div section on the basis of her-link click,this is done. when calling pages that may also using ajax call,in this case ajax call not work for this page.please tell me it is possible to call ajax inside an ajax.if yes then please help me.
Update Edit:
I have created a gist where i have include all used pages,script https://gist.github.com/2786811.page service_status called the view.jsp using ajax call every 5 second,on hand view.jsp interact with database and prepare view.when we do ajax call from index.jsp, service_status called but it doesn't called view.jsp file.
Thanks
You can make ajax call on page load using $(document).ready(function () {...}); in target page you are calling.
If you are trying to dump a <script> tag with innerHTML, it won't work.
However, you could (as an example) return a JSON object with two properties:
{
html: "All your <b>HTML</b> here",
js: "alert('JavaScript to be run');"
}
Then, use the html property to put content on the page, and then eval the js property.
This isn't the best solution, since it uses the evil eval, but unless you want to rewrite your whole basic structure to use callbacks properly then it's probably your best bet.

how to show "data loading" in a jsp page using servlets

we have a classic JSP + Servlets application and would like to show "Content is loading" sort of message when data in the page takes a while to load.
Is there an easy way to do this via JS?
Scenario:
Page1 (a.jsp) -> select drop downs ->
click search //data is sent back to
server for db
URL changes to (b.jsp), white page is shown, then data load after 30ish seconds
for those 30 seconds I want to show a spinner or some message.
adding ajax or jquery would require a design change which we can not do right now. Though the application already uses jQuery for other stuff but b.jsp is making the DB call from that page...
calling DB in jsp would be very much frowned upon. given the premise of the question, you could
//b.jsp
<div id="msg">data is loading...</div>
<%
out.flush();
db.performanLengthJob();
%>
<script> $("msg").remove(); </script>
<p>Data is loaded!</p>
AJAX is the way to do it. You'll need something on the server side to help you keep track of progress.
Load your data (in b.jsp) with ajax request.
Make a JS function which starts on load, let it show your message ('30 seconds left') and then let it perform ajax request to load necessary data.
I recommend you to use some js-framework, like jQuery, it'll make things much simplier.
In order to handle ajax-request on the server-side you'll need to create one more servlet and map it to some url, like your_app_name/ajaxsupport. This servlet should return data in some convenient format (it can be plain text, or xml, or JSON or whatever else). On the client you'll process received data and show it.
A quick solution can be to use onbeforeunload JS event of your base page html body s.g. like
<body onbeforeunload="$("yourComponent").show();">

Categories

Resources