代码之家  ›  专栏  ›  技术社区  ›  kislo_metal

JSF 2.0 MB CDI Bean的提取和注射

  •  1
  • kislo_metal  · 技术社区  · 16 年前

    问题:托管bean未按模板注入。

    目标:我希望在模板中减速注销按钮。

    场景:我正在用JSF 2.0为Web部件构建J2EE6应用程序。

    模板文件布局/template.xhtml

    <!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:ui="http://java.sun.com/jsf/facelets"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          >
    <h:head>
    
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <link href="/resources/css/default.css" rel="stylesheet" type="text/css"/>
        <link href="/resources/css/cssLayout.css" rel="stylesheet" type="text/css"/>
        <title>Facelets Template</title>
    </h:head>
    <h:body>
        <div id="baner" class="baner" >
            <ui:insert name="baner" >
                <h:panelGrid style="color:blue; width:100%; height:100px;" border="5">
                    Baner Name go here
                </h:panelGrid>
            </ui:insert>
        </div>
        <div id="menu" class="menu">
            <ui:insert name="menu">
                some...
            </ui:insert>
        </div>
    
        <div id="top" class="top">
            <ui:insert name="top">Top Section</ui:insert>
        </div>
        <div>
            <div id="left">
                <ui:insert name="left">                
                    <h:commandButton value="Do log out" action="#{securityBacking.invalidate}" />
                    <h:commandButton value="log out" action="#{securityBacking.logout}" />
                </ui:insert>
                <!--log out-->
            </div>
            <div id="content" class="left_content">
                <ui:insert name="content">Main Content</ui:insert>
            </div>
        </div>
    </h:body>
    </html>
    

    tempalte客户端index.xhtml:

    <!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:vt="http://java.sun.com/jsf/composite/security">
    <body>
    
    <ui:composition template="layout/template.xhtml">
        <ui:define name="top">
            <h:form>
                <h:panelGrid border="4">
                    <!--TODO add i18n-->
                    <p style="color:red;">Partner`s login.</p>
                    <vt:loginPanel/>               
    
                    <f:view>
                        <h:outputLabel value="#{rulesBean.userPrincipalName}"/>
                        <h:outputLabel value="#{rulesBean.user}"/>
                        <h:outputLabel value="#{rulesBean.manager}"/>
                        <h:commandButton value="Do log out" action="#{securityBacking.invalidate}" />
                        <h:commandButton value="log out" action="#{securityBacking.logout}" />
                    </f:view>
                </h:panelGrid>
            </h:form>
        </ui:define>
    </ui:composition>
    
    </body>
    </html>
    

    web.xml中的faces声明

    <context-param>
            <param-name>javax.faces.PROJECT_STAGE</param-name>
            <param-value>Development</param-value>
        </context-param>
        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
    

    securitybacking.java:

    @Named("securityBacking")
    @RequestScoped
    public class SecurityBacking {
    
    
        public String logout() {
            String result = "/login?faces-redirect=true";
            FacesContext context = FacesContext.getCurrentInstance();
            HttpServletRequest request = (HttpServletRequest) context.
                    getExternalContext().getRequest();
            try {
                System.out.println("calling logout");
                request.logout();
                System.out.println("called logout");
            } catch (ServletException ex) {
                Logger.getLogger(SecurityBacking.class.getName()).
                        log(Level.SEVERE, null, ex);
                result = "/loginError?faces-redirect=true";
            }
            return result;
        }
    
        public boolean isInRole(String role) {
            ExternalContext external = FacesContext.getCurrentInstance().getExternalContext();
            HttpServletRequest request = (HttpServletRequest) external.getRequest();
            String user = request.getRemoteUser();
    
            return request.isUserInRole("partner");
        }
    
        public void invalidate() {
            try {
                HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
                HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
                request.getSession(false).invalidate();
                response.sendRedirect(request.getContextPath());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
    }
    

    如你所见:

    <h:commandButton value="log out" action="#{securityBacking.logout}" />
    

    <h:commandButton value="Do log out" action="#{securityBacking.invalidate}" />
    

    在layout/template.xhtml&index.xhtml中减速,但在layout/template.xhtml中减速的按钮在sam时间内不工作,它们在index.xhtml中工作。

    当我查找Safari Web Inspector时,我看到:

    用于index.xhtml中的减速

    <input xmlns="http://www.w3.org/1999/xhtml" type="submit" name="j_idt12:j_idt29" value="log out" />
    

    对于layout/template.xhtml

    <input xmlns="http://www.w3.org/1999/xhtml" type="submit" name="j_idt32" value="log out" />
    

    据我所知,bean没有在标签中注入daclets模板,但我在J2EE6教程和规范中没有找到任何相关的内容,或者可能会注意到这些信息。

    问题1:注射的问题我说得对吗?

    问题2:为什么不通过模板注入?

    问题3:在这种情况下,模板化的不同方式是什么?

    问题4:这个案例的最佳实践是什么?

    (我正在使用Glassfish v3 Web服务器)

    谢谢您!

    1 回复  |  直到 16 年前
        1
  •  1
  •   Brian Leathem    16 年前

    模板中的按钮不嵌套在 <h:form> . 移动 <h:形式& gt; 元素从index.xhtml中取出,并放入模板中,或者将模板按钮包装为辅助表单。