【问题标题】:Accessing a managed bean from a JSP tag file从 JSP 标记文件访问托管 bean
【发布时间】:2013-08-07 12:56:29
【问题描述】:

我有以下最小测试用例:

not_working.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:not_working_tag>
  Hello
</t:not_working_tag>

WEB-INF/tags/not_working_tag.tag

<%@tag description="Main page template" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<html>
<head></head>
  <f:view>
    <h:outputText value="#{userBean.test}"/>
    <jsp:doBody/>
  </f:view>
</html>

src/java/UserBean.java

@ManagedBean(name="userBean")
@SessionScoped
public class UserBean
{
  public String getTest() { return "hello!"; }
}

现在我期望的是,当我通过浏览器访问 not_working.jsp 时,我会看到“hello!”。除了我看到的是“#{userBean.test}”。也就是我在value属性中放入的文字EL表达式。现在,当我将 "${userBean.test}" 直接放在 .对于这个简单的测试用例,这就足够了,但我当然想要在更复杂的情况下使用我的 bean 中的值(例如在 f:selectItems 中)。

我从这一切中得出的结论是,由于某种原因,延迟表达式的 EL 没有被评估。我究竟做错了什么?如何在标签文件中使用 JSF 标签的值属性所要求的延迟表达式?

我正在使用 JSF 2.2 (Mojarra 2.2.0) 和 Tomcat,如果这有什么不同的话。

【问题讨论】:

    标签: java jsp jsf


    【解决方案1】:

    要将方法显示为值,您需要在方法名称的末尾指定括号。 使用&lt;h:outputText value="#{userBean.test()}"/&gt;. jsp会将其识别为方法并显示值

    【讨论】:

      【解决方案2】:

      我已经尝试过与您相同的代码,它工作正常。 看我的代码如下

      package com.mycom.demo;
      @ManagedBean
      @SessionScoped
      public class UserBean
      {
          public String myString()
          {
                return "Hello";
          }
      }
      

      我的Html代码如下

      <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
      <%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
      <%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      </head>
      <body>
      <f:view>
      <h:outputText value="#{userBean.myString()}" />
      </f:view>
      </body>
      </html>
      

      我已经包含了 JSF 2.2.1、jstl jars 和 tomcat 服务器。 希望这能解决你的问题

      【讨论】:

      • 谢谢,但是您也尝试过使用 jsp 标签吗?你的代码也适用于我,只是当我在我的示例中使用标记文件时它不起作用。
      • 我试过你的代码,我也遇到了同样的问题。我认为这是 EL 问题,因为 jsp 和 jsf 有自己的 EL 评估器。 T 使统一的 ELResolver 读取 today.java.net/pub/a/today/2006/03/07/…
      • 是的,我想这与所使用的 JSP 和 JSF 组件之间的 EL 不同有关。在它们上面堆放各种困难的东西来让这样的基本东西发挥作用似乎不是要走的路。我已经切换到使用 JSF 模板,它可以按预期工作。感谢您的宝贵时间。
      【解决方案3】:

      尝试声明变量 test,见下文它应该可以工作....(通常您的托管 bean 类将具有 geter 和 setter)

      @ManagedBean(name="userBean")
      @SessionScoped
      public class UserBean{
        public String test = "hello!";
      
        public String getTest() {
          return test; 
        }
      }
      

      【讨论】:

      • 根本不评估 EL。如果是这样,并且 setter 有问题,你会得到一个明确的错误。
      猜你喜欢
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多