如何读出(<c:out value =“...”>)JSP中的taglib属性</c:out>

时间:2012-11-26 22:44:39

标签: jsp attributes taglib

我只想读出之前在JSP中设置的属性(在.tld中)。我只是不知道如何输出它们。在尝试How to use <c:out value=...> taglib文章中的建议后,我得到一个空值输出。所以变量(例如“instanzVar1”)似乎在某种程度上超出了范围。

这里是我的.java:

public class BirolName extends SimpleTagSupport implements SimpleTag {
String instanzVar1;
Boolean instanzVar2;
int instanzVar3;    

@Override
public void doTag() throws JspException, IOException {
    //Zum Schreiben in die JSP "JSPWriter"
    JspWriter outputJSP = getJspContext().getOut();
    outputJSP.println("Birol was here :-) (Taglib von Java -nach-> JSP hat funktionniert!)");
    outputJSP.println("Die eingegebenen Paramter über die JSP waren:");
    outputJSP.println("<br /><b>");
    outputJSP.println("Paramter 1:"+instanzVar1);
    outputJSP.println("<br />");
    outputJSP.println("Paramter 2:"+instanzVar2);
    outputJSP.println("<br />");
    outputJSP.println("Paramter 3:"+instanzVar3);
    outputJSP.println("</b><br />");
}

public String getInstanzVar1() {
    return instanzVar1;
}


public void setInstanzVar1(String instanzVar1) {
    this.instanzVar1 = instanzVar1;
}
......
}

我的.tld:

 <?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
    <tlib-version>1.0</tlib-version>
    <short-name>st</short-name>
    <tag>
        <name>birolNameTag</name>
        <tag-class>st.BirolName</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>instanzVar1</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>instanzVar2</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>instanzVar3</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

至少是.jsp:

   <!-- Einbindung des Taglibs -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/st.tld" prefix="st"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<p>
    Aufruf der Taglib mit "taglibPrefix:NameDesTag"
    <br /> <st:birolNameTag instanzVar1="BirolString" instanzVar2="true" instanzVar3="1"/>
    <br /><br />

    <jsp:useBean id="a" class="st.BirolName"/>
    Ausgabe des Paramters: <c:out value = "${a.instanzVar1}" />
</p>

解决方案很可能非常简单。我仍然没有得到我想要的东西。

2 个答案:

答案 0 :(得分:0)

你做的事情毫无意义。您应该将JSP标记视为Java方法,并使用参数。一旦调用了该方法,就无法获得该方法的句柄,并询问该参数是最后一次调用它的参数。

容器将有一个BirolName实例池,并将在几个页面中的几个线程中使用它们。

当你做的时候

<jsp:useBean id="a" class="st.BirolName"/>,

它相当于做

st.BirolName a = new st.BirolName();

所以你不能指望从这个新的标记类实例中找到你之前使用的标记的参数。

将值传递给标记的instanzVar1属性时,您没有设置任何JSP属性。你只是将一个参数传递给你的标签。要设置页面范围属性,您必须使用c:set标记:

<c:set var="someAttribute" value="someValue"/>
${someAttribute} <%-- prints someValue --%>

答案 1 :(得分:0)

我找到了一个很好的解决方案。 只需在.java标记类中使用此代码:

JspContext pcontext = getJspContext();    
pcontext.setAttribute("myAttribute", this.instanzVar1.concat(this.instanzVar1), Util.getScope("request"));

setAttribute()”让我在属性中保存一个值(此处为:“myAttribute”)。 描述: 在我的例子中,我使用我的taglib属性在JSP中设置属性。然后我可以在我的.java中设置它们,只需将它们作为setAttribute中的第二个参数(这里:“ this.instanzVar1.concat(this.instanzVar1 ”))。现在我有了我的东西想要,因为在.java中设置的这个新属性“myAttribute”可以在JSP中用$ {myAttribute}调用。