La radice di tutto il male nell'esempio è l'attributo immediate="true"
. Se lo rimuovi, il problema verrà risolto.
Tuttavia, per spiegare il motivo, iniziamo con il componente <af:showPrintablePageBehaviour>
e il file trinidad-config.xml
(che è annidato nella cartella WEB-INF
).
Il file trinidad-config.xml
elenca un elemento, denominato <output-mode>
. Per impostazione predefinita, non è lì, ma puoi aggiungerlo manualmente. L'elemento supporta tre valori:
"default"
(o null
): il modo di uscita predefinito
"printable"
: una modalità di uscita adatto per le pagine stampabili
"email"
: una modalità di uscita adatto per l'e-mailing contenuto di una pagina
per avere un contenuto pagina visualizzata come stampabile, il output-mode
viene modificato (solitamente da quadro sottostante) per "printable"
. Pertanto, ogni volta che si fa clic sul componente <af:link>
, il valore <output-mode>
è impostato su "printable"
.
La cosa positiva di trinidad-config.xml
è che è possibile utilizzare le espressioni EL all'interno, il che significa che è possibile modificare dinamicamente il valore dell'elemento <output-mode>
. Ad esempio, il valore può essere letto da un @ManagedBean
:
<output-mode>#{printableBehaviorBean.outputMode}</output-mode>
L'qualche stessa può essere del tutto semplice (@RequestScoped
) fagiolo. Nota che sto usando le annotazioni invece della configurazione basata su XML, perché hai menzionato che stai usando ADF 12c, che è costruito sulla parte superiore di JSF-2.
@RequestScoped
@ManagedBean(name = "printableBehaviorBean")
public class PrintableBehaviorBean {
private String outputMode;
public void setOutputMode(String outputMode) {
this.outputMode = outputMode;
}
public String getOutputMode() {
return outputMode;
}
}
Poi, possiamo iniettare questo fagiolo all'interno di un'altra fagiolo, che contribuirà a navigare all'attività "search"
quando viene premuto il pulsante Search
.Il bean avrà un membro nidificato @ManagedProperty
, che conterrà un'istanza del precedente bean printableBehaviorBean
. Inoltre, lo navigationBean
introdurrà un metodo search()
, che verrà definito dall'attributo del pulsante Search
.
Il trucco è che prima di restituire effettivamente l'esito della navigazione, cambieremo il valore della proprietà outputMode
nello printableBehaviorBean
. Ricordare che questo nuovo valore sovrascriverà il valore esistente <output-mode>
e se il valore <output-mode>
è stato precedentemente impostato su "printable"
, verrà ripristinato a "default"
(e ciò avverrà ogni volta che si fa clic sul pulsante Search
).
@RequestScoped
@ManagedBean(name = "navigationBean")
public class NavigationBean {
@ManagedProperty(name = "printableBehaviorBean", value="#{printableBehaviorBean}")
private PrintableBehaviorBean printableBehaviorBean;
public void setPrintableBehaviorBean(PrintableBehaviorBean printableBehaviorBean) {
this.printableBehaviorBean = printableBehaviorBean;
}
public PrintableBehaviorBean getPrintableBehaviorBean() {
return printableBehaviorBean;
}
public String search() {
printableBehaviorBean.setOutputMode("default");
return "search";
}
}
E, infine, la definizione Search
tasto sarebbe stato leggermente modificato per:?.
<af:button text="Search" action="#{navigationBean.search}" immediate="true" id="ab1" />
Ora, un'altra questione di interesse sarebbe "Perché la rimozione immediate="true"
risolve il problema
A UICommand
componente decorato con immediate="true"
volontà fare in modo che il framework salti le fasi del ciclo di vita "Validazioni di processo", "Aggiorna valori del modello" e "Invoke application" JSF (ad es. la 3a, la 4a e la 5a fase). La mia ipotesi sul problema sarebbe che, prima della fase "Invoke application", l'implementazione ADF controlla se i componenti del comando sono decorati con un componente <af:showPrintablePageBehaviour>
e se lo è, quindi modifica a livello di codice il valore dell'elemento <output-mode>
. E poiché hai immediate="true"
sul pulsante "Search"
, questo valore verrà lasciato come "printable"
. Ecco perché quando torni al modulo, attiva una nuova scheda.
Quindi, in conclusione, sia rimuovere l'attributo immediate="true"
, o seguire la soluzione con i fagioli che ho suggerito.
Un'altra nota su questo, ho preso il 'UIComponent' nella parte posteriore terminare e stampare gli attributi, il 'targetFrame = _self' come previsto. –
Utilizzo di JDeveloper 12c –
Una domanda: si sta lavorando all'interno di un flusso di lavoro limitato? –