2016-12-04 79 views
0

我已经被授权修改一个jsp项目(不是Spring)。更改非常简单: 在页面上获取链接的静态列表,并将其替换为由所述链接组成的下拉列表。另一个要求是下拉的数据源是属性文件。他们希望这样做,以便该网站的最终用户(内部项目)可以修改/删除链接,而无需重新部署应用程序。我是一个JavaScript人(AngularJS,EmberJS,jQuery等),他们在10年或12年前对jsp进行了简要介绍,所以我对此非常青睐。为了让我的脚湿润,我下载了IntelliJ,设置了一个Tomcat项目,并让它读取并在属性文件中显示了一些值。哇噢!为了实现这一目标,花了几个小时的谷歌搜索。尽管我发现了使用jsp构建select的代码,但是我还没有找到任何指示如何布局属性文件并读取可用作选项/选项的值/键值对的任何内容。从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> 

并正确显示好奇的乔治。

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

回答

2

我会继续这样说:

  1. 负荷特性(像你这样)
  2. 填补了地图(因为键和值很容易与JSP-EL访问)
  3. 将地图设置为页面属性(可从JSP-EL访问)
  4. 通过地图(使用Core JSTL)
  5. 使用key和填充选项标记

像这样:

<%@ 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使用小脚本。
您应该考虑将代码从<% ... %>移到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,并访问linkMap在JSP/Servlet的所有其他请求中。它减少了代码重复并且易于维护。

在你的情况,你可以运行/前进/包括PrepareLinkList后一个的执行可以说UpdateLinksProperties -servlet

+0

谢谢,我知道了。但我不知道这意味着什么:“您应该考虑将代码从<% ... %>移到servlet中并转发到JPS” – Lazloman

+0

好吧,我现在明白了。非常感谢。 – Lazloman