How to Refresh ADF jsf page components by pressing a button? - jsf

I have a fusion web application that contains an af:query panel (I created it query panel with table), and af:table and af:panelFormLayout that are related with each other. When I search an entry in the query panel results are shown both in table and in panelFormLayout. When I press reset button in the query panel, only the query panel is reset. I want to all the page to reset. How can I do that by using the easiness of ADF?

Basically you want to override the reset functionality of the af:query. In that case, you should:
1. Set the QueryListener property of the af:query to a managed bean method. You can refer to this example which describes all the steps required: Programmatically RESET query panel
Inside it, you'll see this call: AdfFacesContext.getCurrentInstance().addPartialTarget(t1);
It is responsible for the refresh of the table. Now, if you have all the content inside an af:panelGroupLayout for example (or any other payout type component), you can refresh it instead (so you need to bind it with a field on the bean and use it instead of t1 in this call. Otherwise, if you still wish the full page refresh, follow step 2.
2. Add the needed code to make the page refresh:
FacesContext context = FacesContext.getCurrentInstance();
String currentView = context.getViewRoot().getViewId();
ViewHandler vh = context.getApplication().getViewHandler();
UIViewRoot x = vh.createView(context, currentView);
x.setViewId(currentView);
context.setViewRoot(x);
Just put it inside the method described on the above link.

Related

ADF using EL in Java code

I've got a main page that displays number of records, when I click on create, it should navigate to create form (another JSF), where on Submitting the new record, it should navigate back to main page and display all the records including the new one.
I've been able to achieve the navigation using navigation rules in adfc-config file. And I've created Action method (beans) that returns expected string used in navigation.
What challenge I'm facing now is on button click, I can invoke only one method (action), which has to return the expected string for navigation. Or I can use EL that does the refresh. So I'm either able to Refresh the page after creating a new record, or able to Navigate. Can't do both. (Usage of actionListener won't work, because actionListener works before action, my requirement needs sequential execution.
Is there a way I can use EL in my Java code? So that I can put it right after the record creation and before return string?
Some method that executes method specified by EL, where I just have to pass the EL as a string?
Update: Both Query (display) and Insert are API calls.
From what you're saying, you're using the Unbounded task flow adfc-config to build your navigation business logic. This is not right! The Unbounded task flow's primary purpose is to define the base structure of your site. For example, on your Homepage, if you have a link for "Create Department" and another one for "Add Employee", there would be only 2 simple navigation rules to link to those independent pages.
To achieve your goal, what you need is a Bounded task flow and a few page fragments. The picture below is an actual Bounded taskflow in one of the applications I worked on. Let's take it as an example.
The main feature of a Bounded task flow is that all fragments in the same task flow will share a common data control (i.e. all fragments will see the same set of data). As you can see from the picture above, my starting page is a Search page for Corporate cards, where I'll display all records based on what users search for.
On this Search page, I also have a Create button to allow users to create a new record, which would lead to the Details page (which is also the page to edit current records). Once users commit the transaction on the Details page, they will be redirected back to the Search page by following the viewCorporateCard navigation rule. Since both the Search page and the Details page share the same data control (the same iterator to be precise), users will automatically see the new record on top of the Search page when they're back here. You don't have to do anything manually to achieve this.
Hope this helps! :)
To pass EL value as string
this.setvalueToExpression("#{bindings.Orderno.inputValue}",
"sample");//pass string value
public void setvalueToExpression(String el, Object val) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory expressionFactory =
facesContext.getApplication().getExpressionFactory();
ValueExpression exp =
expressionFactory.createValueExpression(elContext, el,
Object.class);
exp.setValue(elContext, val);
}

ADF Refresh page jsf with page fragments jsff after set session variable

I have a template which includes a button that let you select a profile, you push the button and appear the available profiles, choose one and push accept. After that I set a variable session successfully.
I have a "First" jsf page with two jsff page fragments from a View Link. The view link is composed by a headerView and detailView. The headerView had a bind variable. What I need is that parameter (bindVariableParameter) can be set by the session variable of the template.
This is what I get:
I am in a home page (separate Application Module), I push the template button before I load de "First" jsf page and after that I go to the "First" jsf page the information is loaded successfully. What I do in the Application Module is something like that:
protected void prepareSession(Session session) {
Map sessionScope = ADFContext.getCurrent().getSessionScope();
String company = (String)sessionScope.get("compId");
System.out.println("Default Comapny in BC is: " + company);
super.prepareSession(session);
this.getSession().getUserData().put("Company", company);
System.out.println("After setting value in userData map of BC");
}
And in the bind variable expression of the headerView I use:
adf.userSession.userData.Company
It works great!!!! But!!!!
When I press the button again and I choose another profile, the info is not updated. Neither in the headerView neither in the detailView.
Also, when I go to the "First" jsf page (without previously push the template button), I got no info, which is right, because I don't have any session variable. After that I push the template button and select the profile, but the page is not refreshed.
I tried several ways to to this but I'm lost.
Could you help me?
Regards.
You have two options for this:
Option one: tune your AM as follows:
jbo.doconnectionpooling=true
jbo.txn.disconnect_level = 1
This will ensure prepareSession() method is being called before each operation. This happens to be a best practice in ADF productions systems, increasing scalability (see here )
Option two: Better than using prepareSession(), you can pass the Http Session data to ADF BC through a custom DataControlFactory.
You can find an example here: http://andrejusb.blogspot.co.uk/2012/05/solution-for-sharing-global-user-data.html

passing value while using view scope in jsf

I have a table with few rows and one of the columns consists a button,now when i click on the edit button it takes me to a new JSF page.The details in the edit page are not getting populated.I am using view scope for my Managed Bean.I have gone through some of the posts and understood that view scope will be lost once the user leaves from that page.
I have gone through various other posts which suggested me to pass value to another bean and then get it into new jsf or by using f:viewparam. I wanted to know how i could achieve this functionality:
I want this flow to be achieved using view scoped managed bean JSF1-->on click of edit button in table-->View Scoped Managed Bean-->JSF2(details need to be populated but shows null values)
In the edit details page the value is shown null.
Could you let me know how I can achieve this functionality.Thanks.

ViewScope beans behaves like it has application scope

I am doing work on a project using primefaces 3.5 and my problem is that...
I have a search form I enter some criteria in the form and press Search Button...Result is displayed...suppose using FireFox
Now If I open application same page in some other browser suppose IE there I will see the form with same values and same search result returned earlier...even this is a new session
More over suppose in the same browser if I logout and then login and navigate to same page I see the search form with same values and same result returned.
More or less this behavior is close to application scope Beans where as I have not any application scope Bean and have only one Bean with session scope for login purpose...rest of the beans are #ViewScoped
If I use #Scope("request")...Bean is created on each request but in this case I am unable to set parameter to the confirm dialog for deleting the record because when i click on dialog delete button previous values gets nullified due to new request.
I am in great difficulty and have done too much workaround but all in vain....

Populating a page from Data table in modal panel

I'm trying to get some data from a datatable in rich:modal panel
The whole flow is as follows
When clicking on search button on main page, a modal panel pops up with appropriate data & check box
Till this point the application is working fine
After clicking on ok button, selected data should be populated into main page. This is where the code fails
I tried stuff like getRowData, getValues, etc. but in vain. This could be done by keeping the bean in session scope but I have to keep this bean in request scope using Apache MyFaces JSF 1.2
Two ways comes to mind:
Pass an extra request parameter (the search string and the page number?) so that the bean knows which data to preload.
Make use of MyFaces Orchestra to create a conversation scope which lies in between request and session scope and is exactly the scope you're looking for this particular functional requirement.

Resources