Problem while passing value from Javascript to java(backing bean) - jsf

so I need store value of a javascript variable in my Java backing bean,as the value of variables get lost in case the page refreshes,so I used Primefaces to do that,but facing a problem..I will post my entire code to avoid confusion.
First I defined:
xmlns:p="http://primefaces.org/ui"
Then in xhtml:
<p:remoteCommand name ="svf" actionListener="#{bean.defmethod}">
In javascipt:
svf([{name="String1",value = str1}]);
In java:
public void defmethod(){
String s1=Facescontext.getexternalInstance......
}
But its throwing an error saying bean does not have the property defmethod.
Please help.

Related

Why does my Object become null when going from bean to .xhtml page in jsf

I am building a JSF 2.0 Application using primfaces. I have a managed bean that has several objects for different scenarios.
In this particular portion of the application I move from a data table/form to a managed bean with an identification number.
I pull the information from the database and even have it in the log. However when I make it to the
JSF xhtml page the object values are null and I can't seem to figure out why, any help would be great as I am getting no errors,
exceptions, or warnings in the logs and all information seems to point to the loading of the data including the log.
JSF Page that I am coming from... jobs.xhtml (I am using jsf 2.2 and primefaces to build this application) From this page the
link specifies a job number to be retrieved and the next bean will retrieve that job based on the job number I have it down to just a button
that will take you to the primary method and get the information to the next page...
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<body>
<div style="margin-bottom:350px;">
<p:column>
<h:form>
<h:commandButton id="editProject" action="#{editProjects.getProjectForm()}" value="Edit" />
</h:form>
</p:column>
</div>
</body>
</html>
EditProjects.java the backing bean for the editMailerJob.xhtml which will take in the medium id and the job number the medium id will be used
to direct the application to the next page and the job number will be used to retrieve a specific job
::::UPDATED::::
package beans;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.RossProjectManagement.rpm.objects.MailerProject;
#ManagedBean
#RequestScoped
public class EditProjects implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6680733133634363295L;
private final Log LOG = LogFactory.getLog(this.getClass().getName());
// Editable projects
private MailerProject edit_mailer = new MailerProject();
//Changed this to be a static set value
private String mailerProject = "THIS IS THE MAILER STRING";
public int getProjectForm() {
loadEditMailer();
return 1;
}
public void loadEditMailer() {
this.edit_mailer = new MailerProject("REDJ15061005",
convertDate("2015-06-29"), false, "RickD",
"RickD and the Gang", "new", true, true, "SPEC", 1, 1, 1,
"REDJ15061005", "11X17", "SPOT_COLOR", "20,000",
convertDate("2015-06-30"), convertDate("2015-07-13"),
convertDate("2015-07-06"), convertDate("2015-07-06"),
convertDate("2015-07-15"), true, "BDC",
"someone#example.com", "STANDARD", 7500.00, "CONQUEST",
"NONE", "JS DIRECT", "NONE");
//Commented this out to keep the value static
//setMailerProject(edit_mailer.toString());
LOG.debug(":::MAILER PROJECT TO STRING::: " + this.mailerProject);
}
public Date convertDate(String date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = null;
try {
date1 = df.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return date1;
}
}
JSF page that I am redirecting to editMailerJob.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<body>
<div style="margin-bottom: 350px;">
<h:outputLabel>#{editProjects.edit_mailer}</h:outputLabel>
<h:outputLabel>Mailer String::: #{editProjects.mailerProject} </h:outputLabel>
</div>
</body>
</html>
The log shows that all of the information has been received and loaded but shows no where that the information has been cleaned or the object made anew. I have tried instantiating the object in different places at different times but that didn't work.
Before I leave the bean the object has value, when I get to the page the object has no value, I don't understand why
I then tried loading the information from different places. I have tried changing the scope of the bean from request to view back to request but no luck, (I thought about doing session but I didn't see the benefit as well as I just couldn't see reasoning to put all of that information into the session).
The problem seems to be revolving directly around the bean itself and the getProjectForm Method because at one point the object is loaded and then it just loses all of its information.
All of my values seem to be correct as far as I can tell but none of the information is loading.
I can't seem to wrap my head around the issue so any help would be greatly appreciated. if any more information is needed just let me know.
I hope all of this helps Let me know if I have forgotten anything.
EDITS:::
I have created just a string to see if at any point it would be delivered either, and so far I am still getting nothing, the .xhtml page is reading that it exists but not that it has value. Still working with this if anyone else has a solution it would be awesome, or if you know the solution and could at the least point me in the right direction that would be great also.
UPDATE #2
So I found that if I set the value outside a method it will properly be displayed so it seems to me like the methods are keeping the value from the xhtml page. What is the deal with that, I have getters and setters for the variables I have them declared and defined properly, but for what ever reason the values when loaded by the method are not kept outside the method, the values are not able to be accessed by the xhtml page.
10:00 pm update
Found out that if I instantiate the MailerProject object the same way I don't get the same results I still produce an object full of null attribute values.
Any ideas guys?
Start Here - It'll make the rest of this very trivial.
The Problem
You're using a #RequestScoped bean, and what you're experiencing is the expected behaviour for beans of that scope.
Between the first and the second page, you should understand by now, that you're dealing with two different instances of the editProjects bean : a field you set on the first page, backed by one instance of editProjects will not be available on the destination page, backed by a new instance of editBean.
To Solve
While it wasn't mentioned in the answer I linked to, what you need here is the FlashScope, that serves the express purpose of being transitory in nature: use it just to transport "stuff" between two pages/beans/scopes etc. Sorta. To use:
Declare your undying love for the flash scope around the point of origination of the data. In so doing, you're storing your data in the flash scope object, as implicitly provided by JSF, after which you can then navigate away:
Flash fScope = FacesContext.getCurrentInstance().getExternalContext().getFlash();
fScope.put("editMailer",edit_mailer);
You can then refer to the variable you stored in the flash scope, on the destination page:
<h:outputLabel>#{flash.edit_mailer}</h:outputLabel>
Like I mentioned earlier, the flash scope is a transitory scope: once the destination page has been rendered and the content of the scope displayed, you can consider the data as good as gone. If you would like to hang on to it for just one page redirect longer, you can specify the keep directive:
<h:outputLabel>#{flash.keep.edit_mailer}</h:outputLabel>
Unrelated to the problem
Avoid doing any heavy lifting in a getter/accessor method (like you're doing in getProjectForm). It's bad for business
Why JSF calls getters multiple times
Initialization of List in a JSF Managed bean
What's the significance of returning "1" from that navigation method? Why not "destination_page", or "edit_page.xhtml", y'know, something easier to read? That's just a style thing anyway, no evil can come of that.

validator for input text using the backing bean method not working [duplicate]

This question already has answers here:
JSF custom validator not invoked when submitted input value is null
(2 answers)
Closed 5 years ago.
I have a form with h:inputText and have the attribute validator with the backing bean method name as value, example:
h:inputText id="poolmanagementinput" validator="#{poolManager.validatePoolManagement}"
Now I have method in backing bean named poolManager in following format:
public void validatePoolManagement(final FacesContext context, final UIComponent component,
final Object value) {
... }
I expected this method to be called in the validation phase in JSF cycle. But to my surprise this method is not being called and validation is not happening. Could anyone point out any missing point or direct me to a soultion.
Note: Just as a side note the input is placed inside a composite:implementation.
Thanks in advance.
Cheers!
Incase if you have forgot add these attributes between body and form like this
<h:body>
<h:form>
<your ui item>
</h:form>
</h:body>
sorround your UI attribute with them. <h:form> has to be parent tag for all JSF UI components that can participate in HTML form submission.
I have encountered same issue and this has resolved issue.
I know it is a old question but answering it for the people who have the same problem.
JSF is not executing the validators if the value is blank.
You need to use required=true for validation blank.
for more reference JSF custom validator not invoked when submitted input value is null

Oracle-ADF inlineFrame initializing view scoped bean twice

Oracle ADF 12.1.2, Java 1.7, Oracle WebLogic 12.1.2
I am facing strange issue related with af:inlineFrame component. Trying to display/render ADF page inside of af:popup within af:inlineFrame component. The weird thing is when the popup displayed; view scoped bean's #PostConstruct method called twice. That means bean is initialized twice. However it needed to be initialized once since bean is referenced from the page that is going to be displayed inside af:inlineFrame.
Correct flow gotta be:
Click to button openPopup() method called.
openPopup() sets URI then opens popup.
inlineFrame source property set as it's going to display framePage.jspx.
JSF scans framePage.jspx code finds out there is a reference to FrameBean inside af:outputLabel
Construct FrameBean then call #PostConstruct method.
Call appropriate getter and render page.
What happens in my case:
Click to button openPopup() method called.
openPopup() sets URI opens popup.
inlineFrame source property set as it's going to display framePage.jspx.
JSF scans framePage.jspx code finds out there is a reference to FrameBean inside af:outputLabel
Construct FrameBean then call #PostConstruct method.
Call appropriate getter and render page.
Construct FrameBean then call #PostConstruct method.
Call appropriate getter and render page.
Popup located like:
<af:popup id="mainPopup" binding="#{mainBean.mainPopup}">
<af:dialog id="mainDialog">
<af:inlineFrame source="#{mainBean.URI}">
</af:inlineFrame>
</af:dialog>
</af:popup>
Showing popup via af:button action="#{mainBean.openPopup}":
public void openPopup() {
this.setURI("http://localhost:7001/app/framePage.jspx");
RichPopup.PopupHints hints = new RichPopup.PopupHints();
this.getMainPopup().show(hints);
}
framePage.jspx:
<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<jsp:directive.page contentType="text/html;charset=UTF-8" />
<f:view>
<af:document title="Frame Demo" id="demoDocument">
<af:form id="demoForm">
<af:outputLabel value="HELLO Common user!"></af:outputLabel>
<af:outputLabel value="#{frameBean.commonId}"> </af:outputLabel>
</af:form>
</af:document>
</f:view>
</jsp:root>
FrameBean:
#ManagedBean
#ViewScoped
public class FrameBean {
private String commonId;
#PostConstruct
public void afterInit() {
}
public String getCommonId() {
return commonId;
}
public void setCommonId(String commonId) {
this.commonId = commonId;
}
}
Making FrameBean #SessionScoped solves this issue since bean is kept with session but I don't want to keep it within session. Also setting source property of af:inlineFrame in jspx as hardcoded not fixing the problem.
I don't know how 'in-depth' was CDI tested with ADF, but surely is not the most common way of using ADF - at least all ADF documentation goes old-fashion way. I tried myself to enable CDI in one of my projects, but I got errors by following this blog:
http://www.jobinesh.com/2014/08/enabling-cdi-in-adf-applications.html
Furthermore,
you are using inline frames, which is another uncharted territory. From a design best-practice perspective, you should 'think in page flows', so instead of using an inline frame, you may use a task-flow-opening-as-dialog, task flow containing framePage.jspx. More about it, here: https://blogs.oracle.com/DavidGiammona/entry/task_flow_call_activity_run_as.
I know this doesn't answer directly to your question, please take it as a general note.

Referencing ui:params with hyphens in the name

After many years of avoiding JSF, I'm finally diving in but having problems doing the simplest of things. In the JSTL world, it's easy to reference things with hyphens in the name by doing ${requestScope['big-bad-invalid-name']}. However, that doesn't seem to work with a <ui:param> (or I'm simply starting with the wrong object--the likely issue).
I have a simple file that's referencing a template:
<html xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:composition template="/WEB-INF/template/main.xhtml">
<ui:param name="require-data-main" value="/something" />
<ui:define name="content">...</ui:define>
</ui:composition>
</html>
Sadly I can't figure out how to reference my param since #{require-data-main} is going to freak out due to the hyphens. I've tried #{param['require-data-main']}, #{viewScope['require-data-main']}, #{pageScope['require-data-main']}, #{applicationScope['require-data-main']}. My param doesn't seem to exist anywhere.
Update #1 -- I created another param without hyphens (camel case). Nothing managed to resolve the value as I've tried above. A plain #{requireDataMain} did, however. I have a large number of JSPs already written. So I'm not too keen on changing my variable names. I'd still love to find out how to reference the param with the hyphens in the name.
Has anybody seen my param? Is there an alternate way to retrieve the param?
A JSF page should use Managed Bean to access your java code. If you have a controller class for your jsf page, you could inject it to jsf using EL: #{managedbean.field} where managedbean is a following class:
#ManagedBean(name = "managedbean")
public class YourBean {
private String field;
//getter and setter for field
}
Hope that I understood your problem correctly.

Jsf ui:repeat - method that populates the value is accessed even when submiting different form

In my actual project I have noticed that the method that populates the ui:repeat tag, is being invoked when there is a post call, even though the ui:repeat is not part of the submitted form.
I have been trying to check againts the jsf documentation if that is the way it should work, with no success.
Is it supposed to work this way?
Thanks in advance.
Sample code:
When the button is clicked the method anotherBean.getCollection is being invoked:
<h:form id="firstForm">
<h:commandButton action="#{someBean.someAction}"/>
</h:form>
<h:form id="secondForm">
<ui:repeat var="product" value="#{anotherBean.populatCollection}" >
<!-- CODE -->
</ui:repeat>
</h:form>
In first place, a getter method shouldn't be populating the value at all. A getter method should, as its name says, just return the already-populated value.
You're not terribly clear on the concrete functional requirement, i.e. when exactly did you intend to populate the value, but one way would be moving the populating logic to the #PostConstruct of #{anotherBean}.
#ManagedBean
#ViewScoped
public class AnotherBean {
private List<Something> getCollection; // Terrible variable name by the way.
#PostConstruct
public void init() {
getCollection = populateItSomehow();
}
public List<Something> getGetCollection() {
return getCollection; // See, just return the property, nothing more!
}
}
See also:
Why JSF calls getters multiple times
So, it looks like ui:repeat tag is invoking the methods assigned to its value argument when a post is done, no matter if the post is done from another form.
Thanks for the help.

Resources