Saya mencoba menulis servlet khusus (untuk AJAX / JSON) di mana saya ingin merujuk @ManagedBeans
nama saya . Saya berharap untuk memetakan:
http://host/app/myBean/myProperty
untuk:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Apakah mungkin untuk memuat kacang dengan nama dari servlet biasa? Apakah ada servlet atau pembantu JSF yang bisa saya gunakan untuk itu?
Saya tampaknya dimanjakan oleh Spring di mana semua ini terlalu jelas.
jsf
jakarta-ee
servlets
jsf-2
managed-bean
Konrad Garus
sumber
sumber
Jawaban:
Dalam artefak berbasis servlet, seperti
@WebServlet
,@WebFilter
dan@WebListener
, Anda dapat mengambil JSF "vanilla biasa"@ManagedBean @RequestScoped
dengan:dan
@ManagedBean @SessionScoped
oleh:dan
@ManagedBean @ApplicationScoped
oleh:Perhatikan bahwa ini mensyaratkan bahwa kacang sudah dibuat secara otomatis oleh JSF sebelumnya. Jika tidak, ini akan kembali
null
. Anda kemudian perlu membuat kacang dan menggunakannya secara manualsetAttribute("beanName", bean)
.Jika Anda dapat menggunakan CDI dan
@Named
bukan karena JSF 2.3 sudah tidak digunakan lagi@ManagedBean
, ini akan lebih mudah, terutama karena Anda tidak perlu lagi membuat kacang secara manual:Perhatikan bahwa ini tidak akan berfungsi saat Anda menggunakan
@Named @ViewScoped
karena kacang hanya dapat diidentifikasi oleh status tampilan JSF dan itu hanya tersedia ketikaFacesServlet
telah dipanggil. Jadi dalam filter yang berjalan sebelumnya, mengakses@Inject
ed@ViewScoped
akan selalu membuangContextNotActiveException
.Hanya ketika Anda berada di dalam
@ManagedBean
, maka Anda dapat menggunakan@ManagedProperty
:Perhatikan bahwa ini tidak berfungsi di dalam
@Named
atau@WebServlet
atau artefak lainnya. Ini benar-benar@ManagedBean
hanya berfungsi di dalam .Jika Anda tidak berada di dalam a
@ManagedBean
, tetapiFacesContext
sudah tersedia (yaituFacesContext#getCurrentInstance()
tidak kembalinull
), Anda juga dapat menggunakanApplication#evaluateExpressionGet()
:yang dapat diselenggarakan sebagai berikut:
dan dapat digunakan sebagai berikut:
Lihat juga:
sumber
PostBean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", PostBean.class);
FacesContext
tersedia meskipunstatic
metode utilitasfindBean()
ditentukan di dalam kelas Java biasa. Bagaimana ini tersedia di sana dalam kelas Java biasa yang tidak dikelola oleh JSF?Saya menggunakan metode berikut:
Ini memungkinkan saya untuk mendapatkan objek yang dikembalikan dengan cara yang diketik.
sumber
Class
argumen tidak diperlukan dalam konstruksi ini).Sudahkah Anda mencoba pendekatan seperti di tautan ini? Saya tidak yakin apakah
createValueBinding()
masih tersedia tetapi kode seperti ini harus dapat diakses dari Servlet lama biasa. Ini membutuhkan kacang untuk sudah ada.http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from
sumber
Anda bisa mendapatkan kacang yang dikelola dengan memasukkan nama:
sumber
Saya memiliki persyaratan yang sama.
Saya telah menggunakan cara di bawah ini untuk mendapatkannya.
Saya memiliki sesi kacang cakupan.
Saya telah menggunakan kode di bawah ini dalam metode servlet doPost () saya.
itu memecahkan masalah saya.
sumber
Saya menggunakan ini:
Dan kemudian hubungi:
Dengan cara ini Anda dapat memfaktor ulang kode Anda dan melacak penggunaan tanpa masalah.
sumber