如何为 JSP 中的下拉列表提供字符串常量



在jsp页面中,我向客户提供下拉列表以选择信用卡类型,到期月份,信用卡到期年份。我正在寻找可以放置必要的字符串的方法,而不是在 html 中硬编码它们。

谢谢

马克

<tr>
<td>
    <select id="creditCardType" title="select card type" name="creditCardType">
        <option value="M0">MasterCard</option>
        <option value="D0">Discover</option>
        <option value="J0">JCB</option>
        <option value="I0">Diners Club</option>
        <option value="A0">American Express</option>
        <option value="V0">Visa</option>
        <option value="V">Amazon.com Visa</option>
        <option value="G21">Amazon.com Store Card</option>
    </select>
</td>
</tr>
<tr>
<td>Expiration Date</td>
<td> 
                     <select id="cardexpiryMonth" name="cardexpiryMonth">
                        <option value="01" selected="selected">01</option>
                        <option value="02" >02</option>
                        <option value="03" >03</option>
                        <option value="04" >04</option>
                        <option value="05" >05</option>
                        <option value="06" >06</option>
                        <option value="07" >07</option>
                        <option value="08" >08</option>
                        <option value="09" >09</option>
                        <option value="10" >10</option>
                        <option value="11" >11</option>
                        <option value="12" >12</option>
                      </select>
</td>
<td>
                    <select id="cardexpiryYear" name="cardexpiryYear">
                        <option value="2011" >2011</option>
                        <option value="2012" selected="selected">2012</option>
                        <option value="2013" >2013</option>
                        <option value="2014" >2014</option>
                        <option value="2015" >2015</option>
                        <option value="2016" >2016</option>
                        <option value="2017" >2017</option>
                        <option value="2018" >2018</option>
                        <option value="2019" >2019</option>
                        <option value="2020" >2020</option>
                        <option value="2021" >2021</option>
                        <option value="2022" >2022</option>
                        <option value="2023" >2023</option>
                        <option value="2024" >2024</option>
                        <option value="2025" >2025</option>
                        <option value="2026" >2026</option>
                        <option value="2027" >2027</option>
                        <option value="2028" >2028</option>
                        <option value="2029" >2029</option>
                        <option value="2030" >2030</option>
                        <option value="2031" >2031</option>
                      </select>
</td>
</tr>

如果是应用程序范围的常量,只需在应用程序启动期间将它们放在应用程序范围内即可。应用程序范围由作为 ServletContext 属性的对象表示。参见 servlet 如何工作?实例化、会话、共享变量和多线程

CDI 可用吗?

如果CDI碰巧在您的环境中可用(即您正在运行普通的JEE服务器,如WildFly,Payara,TomEE等(,那么只需使用@ApplicationScoped bean而不是ServletContextListener

@Named @ApplicationScoped
public class Data {
    private Map<String, String> creditCardTypes;
    @PostConstruct
    public void init() { 
        creditCardTypes = new LinkedHashMap<String, String>();
        creditCardTypes.put("M0", "MasterCard");
        creditCardTypes.put("D0", "Discover");
        // ...
    }
    public Map<String, String> getCreditCardTypes() {
        return creditCardTypes;
    }
}

(请注意,我使用了LinkedHashMap,因为它与HashMap相反地保持了广告顺序(

这样,它可以在任何 JSP 中由 EL ${data.creditCardTypes}使用。 然后,可以使用 JSTL <c:forEach>对其进行迭代。它还支持遍历Map,每次迭代都会返回一个Map.Entry,而又具有getKey()getValue()方法,这些方法也可以在EL中访问。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<select id="creditCardType" title="select card type" name="creditCardType">
    <c:forEach items="${data.creditCardTypes}" var="creditCardType">
        <option value="${creditCardType.key}">${creditCardType.value}</option>
    </c:forEach>
</select>

没有可用的 CDI?

如果 CDI 不可用(即您没有运行普通的 JEE 服务器,例如 Tomcat、Jetty、Undertow 等,并且由于某种原因您不想安装 CDI(,那么您可以使用任意 servlet 的init()方法,或者更好的是ServletContextListener

@WebListener
public class Data implements ServletContextListener {
    private Map<String, String> creditCardTypes;
    @Override
    public void contextInitialized(ServletContextEvent event) { 
        creditCardTypes = new LinkedHashMap<String, String>();
        creditCardTypes.put("M0", "MasterCard");
        creditCardTypes.put("D0", "Discover");
        // ...
        event.getServletContext().setAttribute("data", this);
    }
    public Map<String, String> getCreditCardTypes() {
        return creditCardTypes;
    }
}

这样,它也可以在任何 JSP 中由 EL ${data.creditCardTypes}使用。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<select id="creditCardType" title="select card type" name="creditCardType">
    <c:forEach items="${data.creditCardTypes}" var="creditCardType">
        <option value="${creditCardType.key}">${creditCardType.value}</option>
    </c:forEach>
</select>

如果你使用的是 Spring (2.5/3.0(,那么看看@ModelAttribute

最新更新