2016-12-14 6 views
1

У меня есть файл system.properties с такими вещами, как системная версия и тип сборки, которые я хотел бы показать на моих страницах index.jsp (у меня есть несколько в наборе панелей инструментов). Каков наилучший способ предоставить эти свойства моим JSP?Каков наилучший способ предоставить серверную собственность JSP?

Я сейчас читаю файл свойств непосредственно из JSP, но это громоздко, потому что это несколько строк кода, и его нужно дублировать во всех моих JSP. Я действительно отвлек этот код на свой JSP, который затем включаю в мои другие JSP, но это все еще кажется громоздким.

В идеале я хотел бы сделать следующее с любой страницы:

<body data-build-type='${buildType}' data-system-version='${systemVersion}'>

Это может означать, что я использую сервлет или сервлет фильтр, но я не уверен.

Спасибо!

+0

Ну, JSP * - это нечто вроде сервлета. Но поскольку он составлен из декларативной разметки и добавляет нетривиальные операторы кода к ней, это обычно не одобряется, вы действительно можете добавить централизованный (безгосударственный) сервис для извлечения этой информации из всех ваших JSP в виде сервлета, который они может получить доступ. Я лично не могу видеть, как в этом будет задействован фильтр сервлетов. – Mena

+0

Другим вариантом является создание свойства PropertiesTag, которое затем можно включить в JSP для визуализации свойств сервера. – donlys

+0

@donlys - Можете ли вы уточнить? –

ответ

1

Вы можете использовать WebListener, который реализует ServletContextListener.
Итак, при развертывании вы можете прочитать свойства системы и установить их как атрибуты.
Либо отдельно, либо на карте.

system.properties:

Допустим, у вас есть файл system.properties с содержанием:

buildType=myType 
systemVersion=v55 

Weblistener:

Веб приемник может быть что-то вроде:

package testingThings.properties; 

import java.io.IOException; 
import java.io.InputStream; 
import java.util.HashMap; 
import java.util.Properties; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener; 

@WebListener 
public class ContextListener implements ServletContextListener { 
    public ContextListener() {} 
    public void contextDestroyed(ServletContextEvent sce) {} 

    public void contextInitialized(ServletContextEvent sce) { 
     InputStream stream = Thread.currentThread().getContextClassLoader() 
       .getResourceAsStream("testingThings/properties/system.properties"); 
     Properties props = new Properties(); 

     try { 
      props.load(stream); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     HashMap<String, String> map = new HashMap<String, String>(); 

     for (final String name : props.stringPropertyNames()) { 
      map.put(name, props.getProperty(name)); 
     } 

     sce.getServletContext().setAttribute("system", map); 
    } 
} 

JSP:

В JSP вы можете перемещаться с помощью атрибута system, как это:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<html> 
<head><title>access map of system properties</title></head> 
<body> 
    <h3>access map of system properties</h3> 
    <table> 
     <c:forEach items="${system}" var="property"> 
      <tr> 
       <td>${property.key}:</td> 
       <td>${property.value}</td> 
      </tr> 
     </c:forEach> 
     <tr> 
    </table> 

    <h3>directly access of map properties</h3> 
    <table> 
      <tr> 
       <td>buildType:</td> 
       <td>${system.buildType}</td> 
      </tr> 
      <tr> 
       <td>systemVersion:</td> 
       <td>${system.systemVersion}</td> 
      </tr> 
     <tr> 
    </table> 
</body> 

Если свойства системы изменяются динамически,
вы можете обновлять их непосредственно в атрибуте контекста (параллельно файлу system.properties)

+0

Это именно то, что я искал. У меня есть проект Maven. Можете ли вы объяснить, что я хочу объяснить вам, где разместить Java-файл WebListener? –

+0

В этом примере я помещаю файл прослушивателя и свойств в тот же пакет 'testThings.properties'. Вы можете отделить их, как хотите. Слушатель находится где-то в папке 'src'' src/main/java'. Если вы добавите аннотацию '@ WebListener' перед определением класса, она будет распознана при развертывании/синхронизации. –

+0

Я рад, я мог бы помочь. Не забудьте принять ответ и поддержать –

0

Создайте пользовательский тег JSP. Например:

public class HelloWorld extends TagSupport 
{ 
    public int doStartTag() throws JspException 
    { 
     try 
     { 
      JspWriter out = pageContext.getOut(); 
      HttpServletResponse response = (HttpServletResponse)pageContext.getResponse(); 
      out.write("Hello world!"); <!-- your property 
     } 
     catch(Exception e) 
     { 
      throw new JspException(e.getMessage()); 
     } 
     return EVAL_PAGE; 
    } 
} 
     <!-- a tab library descriptor --> 
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> 
    <tlib-version>1.0</tlib-version> 
    <jsp-version>1.2</jsp-version> 
    <short-name>Simple Tags</short-name> 

    <tag> 
    <name>HelloWorld</name> 
    <tag-class>HelloWorld</tag-class> 
    <body-content>empty</body-content> 
    </tag> 
</taglib> 

Используя его в JSP:

<html> 
    <body> 
    <hw:HelloWorld /> 
    </body> 
</html> 

Hello World является просто пример - вы можете иметь все свои атрибуты (свойства системы), определенных в теге и получить те в JSP таким образом. См.: http://docs.oracle.com/javaee/5/tutorial/doc/bnalj.html