2012-11-05 52 views

回答

18

建議:在閱讀任何進一步看看http://showcase.omnifaces.org/components/param。 你自己做的事情可能已經過時了,看看今天如何omnifaces是一個事實上的標準。我可能沒有寫這個,如果全部在這個時候有這個

CDI並沒有解決像注入一個請求參數的專門問題。這應該通過擴展來解決。

這已經由焊料提供。 http://docs.jboss.org/seam/3/solder/latest/reference/en-US/html/injectablerefs.html

它可能會包含在Deltaspike 0.4孵化或類似的。

這就是說所需的代碼實現起來相當簡單。下面的例子:

註釋使用的注入點(例如private String myParam;

import javax.enterprise.util.Nonbinding; 
import javax.inject.Qualifier; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 

import static java.lang.annotation.ElementType.*; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 


@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER }) 
public @interface RequestParam { 
    @Nonbinding 
    public String value() default ""; 
} 

現在我們有註解,但是我們不能只要求容器依賴注入一個@RequestParam - 我們顯然需要一個實現。

import javax.enterprise.inject.Produces; 
import javax.enterprise.inject.spi.InjectionPoint; 
import javax.faces.context.FacesContext; 
import javax.inject.Inject; 

public class RequestParamProducer implements Serializable { 

    private static final long serialVersionUID = -4260202951977249652L; 
    @Inject 
    FacesContext facesContext; 

    // Producer for @RequestParam 
    @Produces 
    @RequestParam 
    String getRequestParameter(InjectionPoint ip) { 
     String name = ip.getAnnotated().getAnnotation(RequestParam.class) 
       .value(); 

     if ("".equals(name)) 
      name = ip.getMember().getName(); 

     return facesContext.getExternalContext().getRequestParameterMap() 
       .get(name); 
    } 
} 

那麼它是如何工作的?很簡單,它首先檢查你是否確定了你想要的參數,如@Requestparam("longAndTerribleFieldNameBestToSpecify");

如果你沒有它將使用fieldName。所以如果你註釋了一個名爲setMyInstance的setter,它會查找一個名爲setMyInstance的參數。

正常使用情況下,應該有一個字符串變量,其命名與您想要的參數完全相同。

請注意,我們注入FacesContext,也必須生成。一個FacesContext製片人看起來是這樣的:

class FacesContextProducer { 

    @Produces @RequestScoped FacesContext getFacesContext() { 

     return FacesContext.getCurrentInstance(); 

    } 

} 

末用法:

@Inject 
@RequestParam 
private String session_secret; 

請注意,這不會對Servlet的工作或類似的,因爲它需要訪問FacesContext中。在這些情況下,需要使用例如@RequesScoped的bean來封裝注入。您注入該豆代替。