Каков синтаксис для EL, который обращается к списку с объектом? - PullRequest
1 голос
/ 24 сентября 2010

Мне сложно разобраться, как отобразить свойства объекта в ArrayList с помощью выражения EL.

Во многих учебных пособиях за пределами показан простой пример, например:

List<String> test = new ArrayList<String>();
request.setAttribute("test", test);
test.add("moo");

И все работает нормально.

<p>${test[0]}</p>

Когда ArrayList содержит фактический объект со свойствами, значение не отображается.Приведенный ниже код получает результат запроса и сохраняет его в объекте передачи данных «DTOTopics», затем я добавляю объект в ArrayList.

    List<DTOTopics> list = new ArrayList<DTOTopics>();
    request.setAttribute("recentTopics", list);
    list = factory.getDAOTopics().findByLimit(5);

HTML

Каждый элемент вArrayList - это объект DTOTopics, поэтому я попытался получить доступ к одному из его свойств «title», и на странице ничего не показывалось.

<h1>${recentTopics[0].title}</h1> //why this doesn't work???

Servlet

public class ShowRecentTopicsAction implements Action {

 @Override
 public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

  DAOFactory factory = null;
  List<DTOTopics> list = new ArrayList<DTOTopics>();
  request.setAttribute("recentTopics", list);

  try {
   factory = DAOFactory.getInstance();
   list = factory.getDAOTopics().findByLimit(5);
  } 
  catch (DAOConfigurationException e) {
   Logger.log(e.getMessage() + " DAOConfEx, PostRegisterServlet.java.", e.getCause().toString());
  }
  catch (DAOException e) {
   Logger.log(e.getMessage()+ " DAOEx, PostRegisterServlet.java", e.getCause().toString());
  }

  System.out.println("getRecentTopics() list = " + list);//just check if list returns null

            //for testing
  DTOTopics t = list.get(0);
  System.out.println("TEST:::" + t.getTitle()); //ok

            //these test works fine too
  List<String> test = new ArrayList<String>();
  request.setAttribute("test", test);
  test.add("moo");
  Map<String, String> map = new HashMap<String, String>();
  request.setAttribute("mmm", map);
  map.put("this", "that");

  return "bulletinboard";
 }

}

1 Ответ

1 голос
/ 24 сентября 2010

Здесь

List<DTOTopics> list = new ArrayList<DTOTopics>();
request.setAttribute("recentTopics", list);

вы помещаете пустой массив в область запроса.

И затем,

try {
    factory = DAOFactory.getInstance();
    list = factory.getDAOTopics().findByLimit(5);

вы переназначаете list ссылка с новым массивом (вместо заполнения исходного массива с использованием метода add() или addAll()).Тот, что в области запроса, все еще ссылается на оригинальный пустой массив!

Переместить request.setAttribute("recentTopics", list); в после того, как вы получили список из DAO, и он должен работать.Ваш ЭЛ в порядке.

...