填充jsp属性文件中的select

时间:2016-12-04 04:29:20

标签: jsp properties

我的任务是修改一个jsp项目(不是Spring)。变化很简单: 获取页面上的静态链接列表,并将其替换为包含所述链接的下拉列表。另一个要求是下拉列表的数据源是属性文件。他们想要这样,以便站点的最终用户(内部项目)可以修改/删除链接,而无需重新部署应用程序。我是一个javascript人(AngularJS,EmberJS,jQuery等),他们在大约10年或12年前对jsp进行了简要介绍,所以我对它很了解。为了让我的脚湿透,我下载了IntelliJ,设置了一个Tomcat项目并让它读取并在属性文件中显示了几个值。哇噢!为了达到这个目的,花了几个小时的谷歌搜索。虽然我发现了使用jsp构建select的代码,但我没有找到任何能告诉我如何布局属性文件并读入键/值对的内容,我可以将其用作select项的选项/值

这是我的属性文件:

fname=Courious
lname=George

这是显示值的标记:

<%@page import="java.util.Properties" %>

<%
 InputStream stream = application.getResourceAsStream("foo.properties");
 Properties props = new Properties();
 props.load(stream);
 String fname = props.getProperty("fname");
 String lname = props.getProperty("lname");
%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
out.println(fname);
out.println(lname);
%>
</body>

它正确显示了好奇的乔治。

有人可以就如何使用属性文件创建选择提供一些指导吗? 感谢

1 个答案:

答案 0 :(得分:2)

我会这样做:

  1. 加载属性(就像你一样)
  2. 填充地图(因为使用JSP-EL可以轻松访问键和值)
  3. 在页面属性中设置地图(可从JSP-EL访问)
  4. 遍历地图(使用Core JSTL)
  5. 使用keyvalue
  6. 填充选项标签

    像这样:

    <%@ page contentType="text/html; charset=UTF-8" 
      import="java.io.InputStream, java.util.HashMap, java.util.Properties" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
    <%
    // 1. load the properties
    InputStream stream = application.getResourceAsStream("foo.properties");
    Properties props = new Properties();
    props.load(stream);
    
    // 2. fill a map
    HashMap<String, String> linkMap = new HashMap<String, String>();
    for (final String name: props.stringPropertyNames()) {
         linkMap.put(name, props.getProperty(name));
    }
    
    // 3. set the map in a page attribute
    pageContext.setAttribute("linkMap", linkMap);
    %>
    <html>
    <head>
    <title>$Title$</title>
    </head>
    <body>
    <h3>select field with map</h3>
    <select name="link">
    
    <!-- 4. iterate through the map -->
    <c:forEach items="${linkMap}" var="link">
        <!-- 5. populate the option tags -->
        <option value="${link.key}">${link.value}</option>
    </c:forEach>
    </select>
    </body>
    

    在JSP中使用scriptlet是不好的做法 您应该考虑从servlet中的<% ... %>移动代码并转发到JPS。

    编辑:

    JSP应仅用于呈现信息。准备,计算,数据库操作等应该在Servlets中完成 您可以在此处阅读更多内容:How to avoid Java code in JSP files?

    在你的情况下: 您创建一个servlet,让它命名为PrepareLinkList,并从那里移动scriplet代码:

    @WebServlet("/PrepareLinkList")
    public class PrepareLinkList extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("testingThings/properties/foo.properties");
             Properties props = new Properties();
             props.load(stream);
    
             HashMap<String, String> map = new HashMap<String, String>();
    
             for (final String name: props.stringPropertyNames()) {
                 map.put(name, props.getProperty(name));
             }
    
             // make the linkMap attribute available accross the application
             getServletContext().setAttribute("linkMap", map);
             // response.sendRedirect("dropdown.jsp");
             // or
             // request.getRequestDispatcher("dropdown.jsp").forward(request, response);
        }
    
    }
    

    在JSP中只保留演示文稿:

    <%@ page contentType="text/html; charset=UTF-8" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <html>
    <head>
    <title>$Title$</title>
    </head>
    <body>
    
    <h3>with map</h3>
    
    <select name="link">
    <c:forEach items="${linkMap}" var="link">
        <option value="${link.key}">${link.value}</option>
    </c:forEach>
    </select>
    
    </body>
    

    如您所知,您可以运行一次 PrepareLinkList Servlet,并在JSP / Servlet的所有其他后续请求中访问linkMap。它减少了代码重复,易于维护。

    在你的情况下,你可以在执行一个PrepareLinkList之后运行/转发/包含UpdateLinksProperties让我说:help sentence - Servlet