java springboot HTML Produktstruktur

smn000

Neues Mitglied
hallo. ich möchte eine html erstellen, auf der ich eine produktstruktur erstellen kann. dabei möchte ich erstmal Items erstellen , denen ich dann ItemInstances hinzufüge. diese werden unter Item.java in einer Arraylist namens "Uses" gespeichert. jetzt bin ich soweit, dass ich items erstellen kann und im Appstore mit Hilfe einer Id speichern kann. Ich habe auch was geschrieben, dass ich iteminstances den items hinzufügen kann, aber das artet in html immer in eine endlosschleife aus.
mein Appstore:
Java:
@ApplicationScope
@Component
public class AppStore {

    inginf.SampleStore sampleStore = new inginf.SampleStore();

    private java.util.ArrayList<inginf.Item> itemStore
        = new java.util.ArrayList<inginf.Item>();
    
    public AppStore() {
        itemStore = sampleStore.getItems();
    }

    public ArrayList<inginf.Item> getItemStore() {
        return itemStore;
    }       
    public int getItemCount() {
        return itemStore.size();
    }
    public inginf.Item addNewItem(inginf.Item item) {
        if (itemStore.size() == 0)
            item.Id = 1;
        else
            item.Id = itemStore.get(itemStore.size()-1).Id + 1;
        itemStore.add(item);
        return item;
    }
der controller, wobei ich das letzte postmapping nicht weiß,ob es richtig ist. der rest müsse passen
Code:
@Controller
public class ItemController {

    @Autowired
    private ApplicationContext context;
    AppStore _AppStore;
    AppStore getAppStore() {
        if (_AppStore == null)
            _AppStore = context.getBean(AppStore.class);
        return _AppStore;
    }

    @PostMapping("/items-gui")
    public String createItem(
        Model model,
        HttpSession session,
        @RequestParam Map<String, String> body )
    {       
        inginf.Item item = new inginf.Item(
            body.get("Nomenclature"),
            body.get("Description"),
            body.get("Material"));
       
        getAppStore().addNewItem(item);
        model.addAttribute(
                "id", item.Id);
        return "itemCreated";
    }

    @GetMapping("/items-gui")
    public String createItemDialog() {
        return "itemTemplate";
    }
    
    @GetMapping("/items-gui/list")
    public String listItems(Model model) {
        model.addAttribute(
            "items",
            getAppStore().getItemStore());
        return "listItems";
    }

    @GetMapping("/items-gui/{id}/delete")
    public String deleteItem(@PathVariable int id, Model model) {       
        model.addAttribute(
            "id", id);
        for (Item item : getAppStore().getItemStore())
            if (item.Id == id) {
                getAppStore().getItemStore().remove(item);
                break;
            }
        return "itemDeleted";
    }

    @GetMapping("/items-gui/{id}/show")
    public String showItem(@PathVariable int id, Model model) {       
        model.addAttribute(
            "id", id);
        for (Item item : getAppStore().getItemStore())
            if (item.Id == id) {
                model.addAttribute(
                    "item", item);
                    model.addAttribute(
                        "iteminstances", item.getUses());
                break;
            }
        return "showItem";
    }
  

    @PostMapping("/items-gui/{id}/add-iteminstances")
    public String addItemInstances(
        @PathVariable int id,
        Model model,
        HttpSession session,
        @RequestParam Map<String, String> body )
    {       
        model.addAttribute(
            "id", id);
        for (Item item : getAppStore().getItemStore())
        
            if (item.getId() == id) {
                ItemInstance itemInstance = new ItemInstance(body.get("Name"), item);
           item.getUses().add(itemInstance);
          
            }
        

            return "redirect:/items-gui/{id}/show";
}

}

und das ist das html für die ausgabe der struktur.

HTML:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Create Item</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

</head>
<body>
<h2>Show Item</h2>

<table>
    <tr>
        <td>Item Name</td>
        <td th:text="${item.nomenclature}">Item Name</td>
    </tr>
    <tr>
        <td>Item Description</td>
        <td th:text="${item.description}">Item Description</td>
    </tr>
    <tr>
        <td>Item Material</td>
        <td th:text="${item.material}">Item Material</td>
    </tr>
</table>
<form th:action="@{/items-gui/{id}/add-iteminstances(id=${item.id})}" method="post">
    <label for="Name">Name</label>
    <input type="text" id="Name" name="Name" required/>
    <button type="submit">Hinzufügen</button>
</form>

<form th:action="@{/items-gui/{id}/add-iteminstances(id=${item.id})}" method="post">
    <label for="Name">Name</label>
    <input type="text" id="Name" name="Name" required/>
    <button type="submit">Hinzufügen</button>
</form>

<!-- Formular zum Löschen einer vorhandenen ItemInstance -->
<form th:action="@{/items-gui/{id}/delete-iteminstances(id=${item.id})}" method="post">
    <label for="InstanceId">ItemInstance ID to delete</label>
    <input type="text" id="InstanceId" name="InstanceId" required/>
    <button type="submit">Löschen</button>
</form>



<h3>Produktstruktur:</h3>
<div class="tree">
    <div th:fragment="treeviewItem(item)">
        <span th:text="${item.nomenclature}">Item</span>
        <ul th:if="${item.getUses().size() > 0}">           
            <li th:each="child : ${item.getUses()}">
                <i><span th:text="${child.name}">ItemInstance</span></i>                               
                
                <div th:replace="this :: treeviewItem(${child.represents})"></div>
            </li>
        </ul>
    </div>
</div>


</body>
</html>

daneben habe ich noch ne item klasse , in der die "Arraylist<iteminstances> Uses" drinnen ist, eine iteminstances klasse mit " String name;" und "Item represents; "
zusätzlich auch noch einige andere templates und einen restcontroller, die aber weniger relevant für das problem sind.

ich weiß nicht genau wie ich jetzt eine verbindung von item zu iteminstance machen soll. ich hab das postmapping im controller geschrieben, aber das artet in eine endlosschleife aus . kann mir wer einen tipp geben?
 

KonradN

Super-Moderator
Mitarbeiter
Also Dein Code ist grausig ...

1) Zu dem Code ist Dir doch schon einmal gesagt worden, dass Du da einfach direkt injecten solltest. Also aus
Java:
    @Autowired
    private ApplicationContext context;
    AppStore _AppStore;
    AppStore getAppStore() {
        if (_AppStore == null)
            _AppStore = context.getBean(AppStore.class);
        return _AppStore;
    }
machst Du einfach:
Code:
    @Autowired
    private AppStore appStore;
und nutzt den dann einfach.

2) Der Code ist an der falschen Stelle und du machst keinen Block, obwohl mehrere Zeilen kommen?
Java:
        for (Item item : getAppStore().getItemStore())
            if (item.Id == id) {
                getAppStore().getItemStore().remove(item);
                break;
            }
Also zum einen gehört das nicht den den Controller sondern in das Repository (Also deinen AppStore) und zum anderen solltest Du der for Schleife auch { } gönnen. Das vermeidet Fehler und ist dann deutlich besser lesbar.
Also fachliche Logik gehört zum Model und damit gehört es nicht zum Controller. Der Controller ist nur sowas wie ein Bindeglied zwischen View und Model. Du rufst also Methoden auf dem Repository oder einem Service auf!

3) Wie bei 2) ist das fast komplett Code, der ins Repository gehört:
Java:
        for (Item item : getAppStore().getItemStore())
            if (item.Id == id) {
                model.addAttribute(
                    "item", item);
                    model.addAttribute(
                        "iteminstances", item.getUses());
                break;
            }
Du hast also ein Item item = appStore.getItemById(id); und dann die model.addAttribute Aufrufe.

Und zu Deinem eigentlichen Problem: Kannst Du evtl. einmal genauer Beschreiben, was Dein Problem ist? Wo kommt es zu einer Endlosschleife? Das klingt doch vom Ansatz her wie eine einfache 1:n Beziehung, die Du hier darstellen willst. Und dazu gibt es doch genügend Beispiele. Was genau willst Du denn überhaupt haben? Im Augenblick bin ich auch etwas unsicher, was Du überhaupt im HTML bezweckst. Der Aufbau sieht auf jeden Fall alles andere als vernünftig aus, und bei dem läuft es mir etwas kalt dem Rücken runter:
Java:
    @PostMapping("/items-gui/{id}/add-iteminstances")
    public String addItemInstances(
        @PathVariable int id,
        Model model,
        HttpSession session,
        @RequestParam Map<String, String> body )
    {       
        model.addAttribute(
            "id", id);
        for (Item item : getAppStore().getItemStore())
        
            if (item.getId() == id) {
                ItemInstance itemInstance = new ItemInstance(body.get("Name"), item);
           item.getUses().add(itemInstance);
          
            }
        

            return "redirect:/items-gui/{id}/show";
}

Schau Dir doch einmal paar Beispiele an, wie Du Formulardaten besser bearbeiten kannst als so auf das Name Feld zuzugreifen.
In der Regel machst Du so Datentransfers einfach per DTO Klassen und dann bekommst Du in der Controller Methode direkt die DTO Instanz.
Auf die Schnelle mal geschaut - evtl. hilft Spring Boot CRUD Application with Thymeleaf | Baeldung etwas.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Java springboot Item mit ItemInstance verbinden Frameworks - Spring, Play, Blade, Vaadin & Co 2
Zrebna SpringBoot-Project: java.sql.SQLSyntaxErrorException: Access denied for user 'gap3'@'%' to database '3306/gap3' Frameworks - Spring, Play, Blade, Vaadin & Co 3
Jose05 Java Anwendung, über den Browser steuern Frameworks - Spring, Play, Blade, Vaadin & Co 1
thor_norsk Javac nicht vorhanden in Java-17-openjdk-amd64 Frameworks - Spring, Play, Blade, Vaadin & Co 8
padde479 Cannot invoke "java.util.Map.containsKey(Object)" because "requestMap" is null Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Vaadin Pro & TypScript vs Plain Java Frameworks - Spring, Play, Blade, Vaadin & Co 4
S Java Web App oder PHP Frameworks - Spring, Play, Blade, Vaadin & Co 10
L Hilfe beim Erstellen einer Java Web Anwendung gesucht Frameworks - Spring, Play, Blade, Vaadin & Co 5
8u3631984 required a bean of type 'java.lang.String' that could not be found. Frameworks - Spring, Play, Blade, Vaadin & Co 8
M Java Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 5
OnDemand Webfrontend mit Java Backend Frameworks - Spring, Play, Blade, Vaadin & Co 26
F Server-Java-Spring Websockets Frameworks - Spring, Play, Blade, Vaadin & Co 6
L Controller Spring Boot mit Java Frameworks - Spring, Play, Blade, Vaadin & Co 20
J Spring Boot Thymleaf mit Java.Optional Frameworks - Spring, Play, Blade, Vaadin & Co 0
B Java Spring Boot - POM-Problem Frameworks - Spring, Play, Blade, Vaadin & Co 8
H OAuth2 mit Spring boot und Java Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Java EE vs. Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
K Spring Security für Java SE Frameworks - Spring, Play, Blade, Vaadin & Co 2
V Java (Eclipse) programmierung zum Springerproblem Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Java for-Schleife überspringt eine Eingabe Frameworks - Spring, Play, Blade, Vaadin & Co 11
Java.getSkill() Gemeinsam Java Spring lernen Frameworks - Spring, Play, Blade, Vaadin & Co 17
S Senior-Softwareentwickler (m/w) Java / Spring im Raum Frankfurt Frameworks - Spring, Play, Blade, Vaadin & Co 0
MQue Meine Java Spring Appl Frameworks - Spring, Play, Blade, Vaadin & Co 0
W Java Applet aus der Taskleiste springt in Vordergrund Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Java Applet:Thread.Timeout überspringt Teile des Codes Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Integrations Test in Java mit Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
A Java Bean Validation und Spring Webflow Frameworks - Spring, Play, Blade, Vaadin & Co 0
Y java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener Frameworks - Spring, Play, Blade, Vaadin & Co 14
W java Spring mit db Frameworks - Spring, Play, Blade, Vaadin & Co 1
nrg Debugger springt immer in Java SE Code Frameworks - Spring, Play, Blade, Vaadin & Co 3
B Spring / Jpa / Hibernate -> java.lang.IllegalArgumentException: Unknown entity Frameworks - Spring, Play, Blade, Vaadin & Co 1
H java web anwendung auf spring 2.0 umstellen Frameworks - Spring, Play, Blade, Vaadin & Co 3
ExceptionOfExpectation Persistierung in Hibernate(SpringBoot) Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation Desktop-Window in SpringBoot Frameworks - Spring, Play, Blade, Vaadin & Co 12
ExceptionOfExpectation @Value() für application.properties [SpringBoot] Frameworks - Spring, Play, Blade, Vaadin & Co 9
Zrebna SpringBoot: Einfache RestAPI konsumieren gelingt nicht. Frameworks - Spring, Play, Blade, Vaadin & Co 6
D SpringBoot Properties und Docker Frameworks - Spring, Play, Blade, Vaadin & Co 8
Dimax SpringBoot native Querry return ArrayList Frameworks - Spring, Play, Blade, Vaadin & Co 6
OnDemand SpringBoot Logrotation funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 6
Robertop Springboot Server kann Jakarta Persistence Root nicht installieren? Frameworks - Spring, Play, Blade, Vaadin & Co 0
G SpringBoot MVC Frameworks - Spring, Play, Blade, Vaadin & Co 1
tom.j85 SpringBoot Rest-Application funktioniert nicht - Keine Fehlermeldungen Frameworks - Spring, Play, Blade, Vaadin & Co 13
V SpringBoot/Thymeleaf ein Attribut zum Controller schicken Frameworks - Spring, Play, Blade, Vaadin & Co 10
L OpenJFX, SpringBoot und Gradle Frameworks - Spring, Play, Blade, Vaadin & Co 12
L SpringBoot Web Application Frameworks - Spring, Play, Blade, Vaadin & Co 1
S SpringBoot MySQL not run Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Springboot und LDAP - Authentifizieren gegen Gruppe Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Authentifizieren mit SpringBoot Frameworks - Spring, Play, Blade, Vaadin & Co 4
M Günstigste oder kostenlose Variante SpringBoot Application laufen zu lassen Frameworks - Spring, Play, Blade, Vaadin & Co 7
Z Springboot - Hauptklasse nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 5
A SpringCloud | SpringBoot | Eureka Frameworks - Spring, Play, Blade, Vaadin & Co 0
B Spring Boot/Html-Content/Web-Server Frameworks - Spring, Play, Blade, Vaadin & Co 2

Ähnliche Java Themen

Neue Themen


Oben