سؤال

هذا السؤال سبق الجواب هنا:

لدي الدرجة التي تحدد أسماء مختلفة الدورة الصفات ، مثل

class Constants {
    public static final String ATTR_CURRENT_USER = "current.user";
}

وأود أن استخدام هذه الثوابت في JSP إلى اختبار وجود هذه الصفات ، شيء من هذا القبيل:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.example.Constants" %>

<c:if test="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}">
    <%-- Do somthing --%>
</c:if>

ولكن أنا لا يمكن أن يبدو للحصول على sytax الصحيح.أيضا, تجنب تكرار طويلة نوعا ما الاختبارات أعلاه في أماكن متعددة ، أود أن تعيين نتيجة المحلية (صفحة-راقب) متغير ، وتشير إلى أنه بدلا من ذلك.أعتقد أنني يمكن أن تفعل هذا مع <c:set>, ولكن مرة أخرى أنا تكافح من أجل العثور على بناء الجملة الصحيح.

تحديث: كذلك إلى اقتراح أدناه ، حاولت:

<c:set var="nullUser" scope="session"
value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />

التي لم تنجح.لذا بدلا من ذلك ، حاولت استبدال الحرفي قيمة ثابتة.أود أيضا أن أضيف المستمر لمحتوى الصفحة حتى أتمكن من التحقق من المستمرة قيمة عند الصفحة التي يتم عرضها

<c:set var="nullUser" scope="session"
value="${sessionScope['current.user'] eq null}" />
<%= "Constant value: " + WebHelper.ATTR_CURRENT_PARTNER %>

هذا عمل جيد و طباعة القيمة المتوقعة "الحالية.المستخدم" على الصفحة.أنا في حيرة لشرح لماذا باستخدام سلسلة حرفية يعمل ، ولكن مرجع ثابت لا, عندما اثنين يبدو أن لها نفس القيمة.مساعدة.....

هل كانت مفيدة؟

المحلول

إنه لا يعمل في المثال الخاص بك لأن ATTR_CURRENT_USER ثابت غير مرئية إلى JSTL الكلمات التي تتوقع خصائص تعرض من قبل جالبة وظائف.أنا لم أجربها لكن أنظف وسيلة لفضح الثوابت يظهر unstandard الوسم المكتبة.

ETA:الارتباط القديمة أعطى لم ينجح.روابط جديدة يمكن العثور عليها في هذا الجواب: جافا الثوابت في JSP

التعليمات البرمجية المتكررة لتوضيح السلوك ترونه:العينة الطبقية:

package com.example;

public class Constants
{
    // attribute, visible to the scriptlet
    public static final String ATTR_CURRENT_USER = "current.user";

    // getter function;
    // name modified to make it clear, later on, 
    // that I am calling this function
    // and not accessing the constant
    public String getATTR_CURRENT_USER_FUNC()
    {
        return ATTR_CURRENT_USER;
    }


}    

مقتطف من صفحة JSP, عرض عينة الاستخدام:

<%-- Set up the current user --%>
<%
    session.setAttribute("current.user", "Me");
%>

<%-- scriptlets --%>
<%@ page import="com.example.Constants" %>
<h1>Using scriptlets</h1>
<h3>Constants.ATTR_CURRENT_USER</h3>
<%=Constants.ATTR_CURRENT_USER%> <br />
<h3>Session[Constants.ATTR_CURRENT_USER]</h3>
<%=session.getAttribute(Constants.ATTR_CURRENT_USER)%>

<%-- JSTL --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="cons" class="com.example.Constants" scope="session"/>

<h1>Using JSTL</h1>
<h3>Constants.getATTR_CURRENT_USER_FUNC()</h3>
<c:out value="${cons.ATTR_CURRENT_USER_FUNC}"/>
<h3>Session[Constants.getATTR_CURRENT_USER_FUNC()]</h3>
<c:out value="${sessionScope[cons.ATTR_CURRENT_USER_FUNC]}"/>
<h3>Constants.ATTR_CURRENT_USER</h3>
<c:out value="${sessionScope[Constants.ATTR_CURRENT_USER]}"/>
<%--
Commented out, because otherwise will error:
The class 'com.example.Constants' does not have the property 'ATTR_CURRENT_USER'.

<h3>cons.ATTR_CURRENT_USER</h3>
<c:out value="${sessionScope[cons.ATTR_CURRENT_USER]}"/>
--%>
<hr />

هذه النواتج:

باستخدام scriptlets

الثوابت.ATTR_CURRENT_USER

الحالي.المستخدم

الدورة[الثوابت.ATTR_CURRENT_USER]

لي


باستخدام JSTL

الثوابت.getATTR_CURRENT_USER_FUNC()

الحالي.المستخدم

الدورة[الثوابت.getATTR_CURRENT_USER_FUNC()]

لي

الثوابت.ATTR_CURRENT_USER



نصائح أخرى

الموضوع قديم جدا, ولكن على أي حال..:)

وجدت لطيفة الحل أن يكون الثوابت المتاحة من خلال JSTL.يجب إعداد خريطة باستخدام انعكاس ووضعها في أي مكان تريد.

الخريطة سوف تحتوي دائما على كل الثوابت تحدد في الثوابت الدرجة.يمكنك وضعه في ServletContext باستخدام المستمع والتمتع الثوابت في JSTL مثل:

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


الثوابت هنا هو المفتاح وضع خريطة في السياق :-)


وفيما يلي قطعة من التعليمات البرمجية بناء خريطة ثابتة المجالات:

Map<String, Object> map = new HashMap<String, Object>();
Class c = Constants.class;
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
   int modifier = field.getModifiers();
   if (Modifier.isPublic(modifier) && Modifier.isStatic(modifier) && Modifier.isFinal(modifier)) {
      try {
         map.put(field.getName(), field.get(null));//Obj param of get method is ignored for static fields
      } catch (IllegalAccessException e) { /* ignorable due to modifiers check */ }
   }
}

يمكنك تحديد الثوابت.ATTR_CURRENT_USER كمتغير مع ج:تعيين فقط على النحو التالي:

<c:set var="ATTR_CURRENT_USER" value="<%=Constants.ATTR_CURRENT_USER%>" />
<c:if test="${sessionScope[ATTR_CURRENT_USER] eq null}">     
    <%-- Do somthing --%> 
</c:if> 

خصائص ثابتة لا يمكن الوصول إليها في ش.الحل الأول هو استخدام لإنشاء غير متغير ثابت الذي يعين نفسه إلى قيمة ثابتة.

public final static String MANAGER_ROLE = 'manager';
public String manager_role = MANAGER_ROLE;

يمكنني استخدام لومبوك لتوليد جالبة واضعة لذلك هذا هو جيد جدا في ذلك.الخاص بك ش يبدو مثل هذا:

${bean.manager_role}

الكامل في http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el

أنا في وقت متأخر إلى المناقشة ، ولكن توجهي هو مختلفة قليلا.يمكنني استخدام العلامة المخصصة معالج لإعطاء صفحات JSP المستمر القيم (رقمية أو سلسلة) التي يحتاجها.هنا هو كيف فعلت ذلك:

من المفترض لدي الدرجة التي تحافظ على كل الثوابت:

public class AppJspConstants implements Serializable {
    public static final int MAXLENGTH_SIGNON_ID = 100;
    public static final int MAXLENGTH_PASSWORD = 100;
    public static final int MAXLENGTH_FULLNAME = 30;
    public static final int MAXLENGTH_PHONENUMBER = 30;
    public static final int MAXLENGTH_EXTENSION = 10;
    public static final int MAXLENGTH_EMAIL = 235;
}

أود أيضا أن يكون هذا بسيط للغاية مخصصة الوسم:

public class JspFieldAttributes extends SimpleTagSupport {
    public void doTag() throws JspException, IOException {
        getJspContext().setAttribute("maxlength_signon_id", AppJspConstants.MAXLENGTH_SIGNON_ID);
        getJspContext().setAttribute("maxlength_password", AppJspConstants.MAXLENGTH_PASSWORD);
        getJspContext().setAttribute("maxlength_fullname", AppJspConstants.MAXLENGTH_FULLNAME);
        getJspContext().setAttribute("maxlength_phonenumber", AppJspConstants.MAXLENGTH_PHONENUMBER);
        getJspContext().setAttribute("maxlength_extension", AppJspConstants.MAXLENGTH_EXTENSION);
        getJspContext().setAttribute("maxlength_email", AppJspConstants.MAXLENGTH_EMAIL);

        getJspBody().invoke(null);
    }
}

ثم لدي StringHelper.tld.داخل لدي هذا :

<tag>
    <name>fieldAttributes</name>
    <tag-class>package.path.JspFieldAttributes</tag-class>
    <body-content>scriptless</body-content>
    <info>This tag provide HTML field attributes that CCS is unable to do.</info>
</tag>

على JSP, انا تشمل StringHelper.tld بالطريقة العادية:

<%@ taglib uri="/WEB-INF/tags/StringHelper.tld" prefix="stringHelper" %>

وأخيرا يمكنني استخدام الوسم وتطبيق حاجة القيم باستخدام EL.

        <stringHelper:fieldAttributes>
[snip]
            <form:input path="emailAddress" cssClass="formeffect" cssErrorClass="formEffect error" maxlength="**${maxlength_email}**"/>&nbsp;
            <form:errors path="emailAddress" cssClass="error" element="span"/>
[snip]
        </stringHelper:fieldAttributes>

المساعد مخصص ش محلل إلى EL محلل سلسلة حل الثوابت.إل محلل هو جافا الطبقة تمتد javax.ش.ELResolver فئة.

شكرا

أولا الجملة الخاصة بك قد إضافي "]" الذي كان يسبب خطأ.

لإصلاح هذا إلى تعيين متغير يمكنك أن تفعل هذا:

<c:set var="nullUser" 
    scope="session" 
    value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />

<c:if test="${nullUser}">
     <h2>First Test</h2>
</c:if>
<c:if test="${nullUser}">
     <h2>Another Test</h2>
</c:if>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top