Session State
Serverseitiger Zustand, der ueber mehrere Requests lebt.
Serverseitige Masken, Session State, Validierung, Berechtigungen und fachliche Workflows fuer Sachbearbeitung.
Eine alte JSP-, JSF- oder Struts-Oberflaeche ist nicht nur HTML mit Tabellenlayout. Sie bildet fachliche Arbeitsschritte, Rollen, Plausibilitaeten, Zwischenzustaende und Ausnahmen ab.
Viele Regeln liegen direkt in der Maske: Felder werden abhängig von Status, Rolle oder Kanal angezeigt; Validierung passiert in JavaScript, Action-Klassen, Managed Beans und Datenbankconstraints gleichzeitig.
Modernisierung sollte UI nicht 1:1 nachbauen. Besser ist, den fachlichen Workflow zu extrahieren, einen Application Service zu schaffen und danach moderne UI-Komponenten gegen stabile Use-Case-APIs zu setzen.
Serverseitiger Zustand, der ueber mehrere Requests lebt.
Struts-Formularobjekt fuer Requestdaten und Validierung.
JSF-Komponente, die UI-Zustand und Aktionen verwaltet.
Reihenfolge fachlicher Schritte, Berechtigungen und Zwischenentscheidungen.
Die Beispiele sind bewusst nicht minimalistisch. Sie zeigen typische Artefakte, die man in echten Legacy-Analysen findet: Schnittstellenverträge, Containerkonfiguration, SQL/PL-SQL, Jobdefinitionen, Queue-Regeln oder Adaptercode.
<action path="/approveInvoice"
type="com.example.legacy.ui.ApproveInvoiceAction"
name="approveInvoiceForm"
scope="session"
validate="true"
input="/invoice/edit.jsp">
<forward name="success" path="/invoice/approved.jsp"/>
<forward name="fourEyes" path="/invoice/review.jsp"/>
<forward name="error" path="/invoice/edit.jsp"/>
</action>
<c:if test="${user.hasRole('APPROVER') and invoice.status == 'READY'}">
<html:submit property="action" value="Freigeben"/>
</c:if>
<c:if test="${invoice.amount > 10000}">
<div class="warning">Vier-Augen-Pruefung erforderlich</div>
</c:if>
public class InvoiceApprovalUseCase {
public NextScreen approve(ApproveInvoiceCommand command, UserContext user) {
permissionPolicy.require(user, "APPROVE_INVOICE");
ApprovalDecision decision = approvalPolicy.decide(command.invoiceId(), user);
if (decision.requiresFourEyes()) {
reviewRepository.createReview(command.invoiceId(), user.id());
return NextScreen.reviewRequired(command.invoiceId());
}
invoiceService.approve(command.invoiceId(), user.id());
return NextScreen.approved(command.invoiceId());
}
}
| Aspekt | Beschreibung |
|---|---|
| Fachliches Risiko | Unklare Verantwortung fuer Sachbearbeitung fuehrt zu widerspruechlichen Entscheidungen zwischen Alt- und Neusystem. |
| Technisches Risiko | JSP und angrenzende Komponenten werden isoliert betrachtet; Laufzeitkopplung bleibt verborgen. |
| Betriebsrisiko | Fehlerkanal, Monitoring, Restart oder manuelle Klaerung sind nicht ausreichend dokumentiert. |
| Migrationsrisiko | Neue Architektur uebernimmt Daten oder Schnittstellen, ohne fachliche Invarianten und historische Sonderfaelle abzusichern. |
| Pattern | Einsatz in diesem System |
|---|---|
| Strangler Fig Pattern | Neue Funktionalitaet vor das Altsystem setzen und Altanteile schrittweise herausloesen. |
| Anti-Corruption Layer | Altbegriffe, technische Codes und Datenformate vom neuen Domänenmodell trennen. |
| Facade | Komplexe Legacy-Operationen hinter klaren fachlichen Use-Case-Methoden kapseln. |
| Adapter | Protokolle und Formate wie SOAP, MQ, Copybook, SQL oder File in Ports uebersetzen. |
| Golden Master Test | Bestehendes Verhalten mit Referenzdaten erfassen und gegen neue Implementierung vergleichen. |
Nimm eine Legacy-Maske und dokumentiere alle sichtbaren und unsichtbaren Regeln: Feldsichtbarkeit, Pflichtfelder, Buttonlogik, Sessiondaten, Rollen, Statusuebergaenge, Serviceaufrufe und Fehlermeldungen.