Blog

Wie kann ich Displaytag mit DWR ajax-fähig machen?

Mischa Dasberg

Aktualisiert Oktober 23, 2025
4 Minuten

Displaytag ist eine Open-Source-Suite von benutzerdefinierten Tags, mit denen Sie eine Sammlung von Objekten einfach als Tabelle anzeigen können, einschließlich direkter Unterstützung für das Blättern und Sortieren. Normalerweise führt das Auswählen einer neuen Seite oder das Sortieren der Tabellen dazu, dass die Seite komplett neu geladen wird. Es ist benutzerfreundlicher, nur die Daten in der Tabelle mit Hilfe der Ajax-Technologie zu aktualisieren, aber Displaytag bietet dies nicht direkt an. Aber wir können natürlich versuchen, dies mit einem der vielen Ajax-Frameworks, die derzeit verfügbar sind, zu unterstützen. Ein nicht Ajax-fähiges Displaytag würde für jede Aktion wie z.B. eine Sortierung oder die Auswahl der nächsten Seite eine Anfrage an einen Controller stellen. Dies würde zu einer vollständigen Aktualisierung der Seite führen (Schritt 1-8). Wenn wir das Displaytag mit Ajax aktivieren, überspringen wir die Seitenaktualisierung und aktualisieren nur einen bestimmten Teil der Seite mithilfe eines exponierten Dienstes, der das aktualisierte HTML-Fragment bereitstellt (Schritt 1a-8a).

Durchfluss

In diesem Beispiel werde ich die folgenden Technologien verwenden:

Das Szenario ist wie folgt: Wir möchten Episoden in einer Tabelle anzeigen. Wir möchten dies auf Ajax-Basis mit Hilfe von DWR tun. Aber wo sollen wir anfangen? Nun, zunächst erstellen wir ein Domänenobjekt namens Episode.

public class Episode {
  lange ID;
  String Show;
  String-Name;
  String-Episode;
  String airDate;
....
}

Als nächstes erstellen wir ein Repository.

public class EpisodeRepository extends HibernateDaoSupport {
  public List getAllEpisodes(int firstResult, int maxResults, String orderBy,
  boolean ascending) {
  Criteria criteria = getSession().createCriteria(Episode.class)
  .setFirstResult(firstResult)
  .setMaxResults(maxResults)
  .addOrder(ascending ? Order.asc(orderBy) : Order.desc(orderBy)); 
  return criteria.list();
  }
  public int getNumberOfEpisodes() {
  Criteria criteria = getSession().createCriteria(Episode.class);
  criteria.setProjection(Projections.count("id"));
  return (Integer)criteria.uniqueResult();
  }
}

Und eine Jsp, die das Displaytag für die Darstellung der Episodensammlung enthält. <display:table id="ep" name="eps" sort="external" requestURI="replaceURI" pagesize="30" partialList="true" size="${nrOfEps}"> <display:setProperty name="basic.empty.showtable" value="true" /> <display:column title="Show" property="show" sortable="true" sortName="show" /> <display:column title="Name" property="name" sortable="true" sortName="name" /> <display:column class="Episode" property="episode" sortable="true" sortName="episode" /> <display:column title="Airdate" property="airDate" sortable="true" sortName="airDate" /> </display:table> Beachten Sie, dass ich replaceURI als requestURI verwende. Das ist sehr wichtig, denn wir werden dies durch einen Aufruf einer Javascript-Methode ersetzen. Displaytag erstellt Links wie <a href="repaceURI?d-2332-o=1...."> und dies sollte durch <a href="javascript:update('d-2332-o=1...')> ersetzt werden, damit die Links auch Ajax-fähig sind. Leider ist dies nicht das einzige, was wir aktualisieren müssen. Wir müssen auch den angezeigten Bereich, die Seite, auf der wir uns gerade befinden, und die Sortierung der Daten aktualisieren. Wie machen wir das also? Nun, wir müssen einen Dienst mit DWR bereitstellen. DWR ist ein Ajax-Toolkit, das es ermöglicht, Dienste bereitzustellen, die dann von JavaScript aus aufgerufen werden können. Ich habe eine abstrakte generische Klasse erstellt, die Sie verwenden können, um jeden beliebigen Dienst zu aktivieren. Die abstrakte Klasse enthält die folgende Methode:

public abstract class AbstractExposedDisplayTagService implements InitializingBean {
  public void afterPropertiesSet() throws Exception {
  ....
  }
  public String findAllObjects(String Kriterien) {
  WebContext wctx = WebContextFactory.get();
  HttpServletRequest request = wctx.getHttpServletRequest();
  // Ergebnisse aufteilen und Werte setzen;
  int maxResults = Integer.parseInt(getCriterionValue(criteria, "maxResults", DEFAULT_MAXIMUM_RESULTS));
  int page = Integer.parseInt(getCriterionValue(criteria, displayTagPage, "1"));
  boolean ascending = Integer.parseInt(getCriterionValue(criteria, displayTagSortOrder, "1")) == 1 ? true : false; 
  String orderBy = getCriterionValue(criteria, displayTagOrderBy, "id");
  int firstResult = (Seite - 1) * maxResults;
  int numberOfObjects = getNumberOfObjects();
  // Setzen Sie die Episoden auf die Anfrage, damit dwr den jsp-Teil neu laden kann.
  request.setAttribute(getObjectsName(), getObjects(firstResult, maxResults, orderBy, ascending));
  request.setAttribute(getNumberOfObjectsName(), numberOfObjects);
  versuchen {
  String html = wctx.forwardToString(viewFragment);
  html = DisplayTagReplacementUtil.updatePagingHtml(html, page, maxResults, numberOfObjects, displayTagPage);
  html = DisplayTagReplacementUtil.updateSortOrderHtml(html, ascending, displayTagSortOrder);
  html = DisplayTagReplacementUtil.updateHtmlLinks(html);
  return html;
  } catch (ServletException e) {
  zurückgeben "";
  } catch (IOException e) {
  zurückgeben "";
  }
}
}

Und hier ist die Umsetzung.

public class EpisodeService extends AbstractExposedDisplayTagService {
  private EpisodeRepository episodeRepository;
  @Override
  public int getNumberOfObjects() {
  return episodeRepository.getNumberOfEpisodes();
  }
  @Override
  public String getNumberOfObjectsName() {
  return "numberOfEpisodes";
  }
  @Override
  public List getObjects(int firstResult, int maxResults, String orderBy, boolean ascending) {
  return episodeRepository.getAllEpisodes(firstResult, maxResults, orderBy, ascending);
  }
  @Override
  public String getObjectsName() {
  return "Episoden";
  }
  public void setEpisodeRepository(EpisodeRepository episodeRepository) {
  this.episodeRepository = episodeRepository;
  }
}

Sie sehen nun, dass die Funktion findAllObjects Methode 3 statische Aktualisierungsmethoden in der Klasse DisplayTagReplacementUtil aufruft. Diese sind für die eigentliche Ajax-Aktivierung verantwortlich. Sie verwenden reguläre Ausdrücke, um die Links, die Sortierung usw. zu aktualisieren. Schließlich müssen wir noch etwas JavaScript hinzufügen, um die exponierten Servicemethoden aufrufen zu können. Das folgende Stück Code sollte im Kopf der jsp stehen, in die Sie die jsp mit dem oben gezeigten Displaytag einbinden. <script type='text/javascript' src='<c:url value="/dwr/interface/EpisodeService.js"/>'></script> <script type='text/javascript' src='<c:url value="/dwr/engine.js"/>'></script> <script type='text/javascript' src='<c:url value="/dwr/util.js"/>'></script> <link rel="stylesheet" type="text/css" href='<c:url value="/css/displaytag.css"/>' /> und das Javascript: <script type="text/javascript"> function update(criteria) { EpisodeService.findAllObjects(criteria, function(data) { dwr.util.setValue("displayTable", data, { escapeHtml:false }); }); } update(""); </script> Jetzt müssen Sie nur noch die abstrakte Klasse erweitern und schon ist Ihr Displaytag Ajax-fähig. Ich habe das Beispielprojekt hier angehängt, damit Sie sich den Code selbst ansehen können.

Verfasst von

Mischa Dasberg

Contact

Let’s discuss how we can support your journey.