我的任务是修改一个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>
它正确显示了好奇的乔治。
有人可以就如何使用属性文件创建选择提供一些指导吗? 感谢
答案 0 :(得分:2)
我会这样做:
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应仅用于呈现信息。准备,计算,数据库操作等应该在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