一尘不染

从jsp属性文件填充选择

jsp

我的任务是修改一个jsp项目(不是Spring)。更改非常简单:获取页面上静态链接列表,然后将其替换为包含所述链接的下拉列表。另一个要求是,下拉列表的数据源必须是属性文件。他们希望这样做,以便站点的最终用户(内部项目)可以修改/删除链接,而不必重新部署应用程序。我是一个Java语言的人(AngularJS,EmberJS,jQuery等),他在10或12年前对jsp进行了简要介绍,所以我对此非常了解。为了弄湿我,我下载了IntelliJ,设置了一个Tomcat项目,并使其读取并在属性文件中显示几个值。呜呜!仅花了几个小时就完成了搜索。尽管我发现可以使用jsp构建选择的代码,但我

这是我的属性文件:

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>

它正确显示好奇的乔治。

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


阅读 202

收藏
2020-06-10

共1个答案

一尘不染

我将以这种方式进行:

  1. 加载属性(就像您所做的一样)
  2. 填写地图(因为键和值可通过JSP-EL轻松访问)
  3. 在页面属性中设置地图(可从JSP-EL访问)
  4. 遍历地图(使用Core JSTL)
  5. 使用key和填充选项标签value

像这样:

<%@ 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应该仅用于呈现信息。准备,计算,数据库操作等应在Servlet中完成。

在您的情况下:创建一个servlet,命名它PrepareLinkList,然后从上方移动脚本代码:

@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,然后访问linkMapJSP /
Servlet的所有其他后续请求。它减少了代码重复,并且易于维护。

在您的情况下,您可以运行/转发/包含PrepareLinkList执行后的UpdateLinksProperties-Servlet

2020-06-10