Struts Validation Error

Status
Nicht offen für weitere Antworten.

lennied

Mitglied
Hallo zusammen,

stehe mal wieder vor einem Problem, was ich nicht lösen kann.
Ein paar Hintergrundinformationen:

Möchte in meiner Webanwendung Einträge editieren und validieren.
Den Eintrag aufzurufen klappt wunderbar, es werden alle Informationen korrekt angezeigt. Jedoch beim Absenden des Formulars bekomme ich folgende FM:


ERROR org.apache.struts.taglib.tiles.InsertTag - ServletException in '/pages/edit_planung.jsp': javax.servlet.jsp.JspException: Cannot find bean: "planung" in any scope
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Cannot find bean: "planung" in any scope
at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:535)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:472)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:611)
at org.apache.struts.tiles.TilesUtilImpl.doInclude(TilesUtilImpl.java:99)
at org.apache.struts.tiles.TilesUtil.doInclude(TilesUtil.java:135)
at org.apache.struts.taglib.tiles.InsertTag.doInclude(InsertTag.java:760)
at org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:892)
at org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:462)
at org.apache.jsp.startseite_jsp._jspx_meth_tiles_005finsert_005f1(startseite_jsp.java:242)
at org.apache.jsp.startseite_jsp._jspx_meth_html_005fhtml_005f0(startseite_jsp.java:135)
at org.apache.jsp.startseite_jsp._jspService(startseite_jsp.java:76)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:239)
at org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:341)
at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:988)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:207)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)


Anbei noch die Einträge der struts-config.xml

[XML]
<form-bean name="EditPlanungsForm" type="org.apache.struts.validator.DynaValidatorForm" >
<form-properties.../>
</form-bean>

<action path="/EditPlanungSpeichern" type="com.sms.struts.EditPlanungSpeichernAction"
name="EditPlanungsForm" scope="request"
validate="true" input="EP.editplanung">
<forward name="success" path="/Overview.do" />
</action>

[/XML]

Wie gesagt, der Fehler tritt beim klicken des Submitbuttons auf, der die möglichen Änderungen speichern soll.

Noch ein Hinweis: Wenn ich in der struts-config für die action validate="false" setze,
bekomme ich keine FM. Ist aber so natürlich nicht Sinn der Sache.

Irgendjemand ne Idee??

mfG Lennie
 
Zuletzt bearbeitet von einem Moderator:

HLX

Top Contributor
In der Datei 'editplanung.jsp' greifst du in deinem Insert-Tag auf ein Attribut 'planung' zu. Dieses Attribut muss an der page, am request, an der session oder am ServletContext hängen, sonst tritt o.g. Fehler auf.

Wenn du die Struts-Validierung verwendest, wird bei Validierungsfehlern noch bevor die Action aufgerufen wird, wieder an die aufrufende Seite zurückverwiesen. Möglicherweise wird dadurch bei dir das Planungs-Attribut nicht gesetzt.

In diesem Fall setzt du entweder das Attribut auch in der Validierung oder du packst das Insert-Tag in der JSP in eine Nullabfrage:
Code:
<logic:notEmpty name="planung">
      ...
</logic:notEmpty>
 

lennied

Mitglied
das Attribut "planung" setze ich an folgender Stelle:
Java:
public class EditPlanungAction extends Action {


    public ActionForward execute(org.apache.struts.action.ActionMapping actionMapping, org.apache.struts.action.ActionForm actionForm, javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse)  {
        try{
            System.out.println("EditPlanungAction");
            DBConnection db = new DBConnection();
            httpServletRequest.setAttribute("planung", db.getEditPlanung(httpServletRequest.getParameter("p_id")));
            db.verbindungschliessen();
        }catch(Exception e){
            e.printStackTrace();
        }
        return actionMapping.findForward("success");

    }

}

Ist das an dieser Stelle nicht richtig?

das Einfügen der
Code:
<logic:notEmpty name="planung">
      ...
</logic:notEmpty>
innerhalb des iteration tags hat leider nicht geholfen, oder habe ich auch hier was falsch verstanden?
 

lennied

Mitglied
habe das
Code:
<logic:notEmpty name="planung">
      ...
</logic:notEmpty>
jetzt außerhalb der iterator tag gepackt, und erhalte nach absenden der Form keine FM mehr. Allerdings auch keinen Inhalt der JSP edit_planung.jsp, nur eventuelle Validator FMs. Was kann ich denn jetzt machen, dass ich wieder an die bean "planung" komme,
soll heißen, dass die bean empty ist, sobald eine FM vom Validator zurückgegeben wird.
 
Zuletzt bearbeitet:

HLX

Top Contributor
Außerhalb des Iterate-Tags ist korrekt, da du den Zugriff des Iterate-Tags auf ein nicht exisitierendes Objekt verhindern musst.

Wenn du validierst und der Fehlerfall eintritt, wird deine oben aufgeführte Action nicht durchlaufen. Daher kann auch das Objekt nicht vorhanden sein, was zum Fehler führt.

Welche Lösung für das Problem sinnvoll ist, hängt vom Anwendungsfall ab. Eine Möglichkeit wäre das Setzen eines leeren Planungsobjektes in der Validate-Methode, z.B. mit
Code:
request.setAttribute("planung", new MyBean()");
Eine andere Möglichkeit wäre die Übertragung des Planungs-Objekts an die Session. Also in deiner obigen Action:
Code:
httpServletRequest.getSession().setAttribute("planung", db.getEditPlanung(httpServletRequest.getParameter("p_id")));
Dadurch stünde die Bean über mehrere Requests hinweg zur Verfügung - so lange bis die Benutzersitzung abläuft.
 

lennied

Mitglied
wenn ich meine Action gemäß deiner Beschreibung änder, bekomme ich ne NullPointerException:

[http-8084-3] ERROR org.apache.struts.taglib.tiles.InsertTag - ServletException in '/pages/edit_planung.jsp': null
org.apache.jasper.JasperException: java.lang.NullPointerException
at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:535)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:472)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:611)
at org.apache.struts.tiles.TilesUtilImpl.doInclude(TilesUtilImpl.java:99)
at org.apache.struts.tiles.TilesUtil.doInclude(TilesUtil.java:135)
at org.apache.struts.taglib.tiles.InsertTag.doInclude(InsertTag.java:760)
at org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:892)
at org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:462)
at org.apache.jsp.startseite_jsp._jspx_meth_tiles_005finsert_005f1(startseite_jsp.java:242)
at org.apache.jsp.startseite_jsp._jspx_meth_html_005fhtml_005f0(startseite_jsp.java:135)
at org.apache.jsp.startseite_jsp._jspService(startseite_jsp.java:76)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:239)
at org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:341)
at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:988)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:207)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
at org.apache.jsp.pages.edit_005fplanung_jsp._jspService(edit_005fplanung_jsp.java:321)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
... 61 more

eine eigene Validate Methode oder Klasse habe ich nicht erstellt. Das geschieht über die validation.xml...
 
Zuletzt bearbeitet von einem Moderator:

lennied

Mitglied
hier ein Auszug der jsp:
HTML:
<%@page import="java.util.*"%>
<%@page import="com.ideo.sweetdevria.util.DateUtils"%>
<%@page import="org.apache.commons.lang.ArrayUtils"%>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
<%@ taglib prefix="ria" uri="http://sweetdev-ria.ideotechnologies.com" %>

<!--Anzeigen der Fehlermeldungen...-->
<logic:messagesPresent>
    <bean:message key="errors.header"/>
    <ul>
        <html:messages id="error">
        <li><bean:write name="error"/></li>
        </html:messages>
    </ul><hr>
</logic:messagesPresent>
<script >
    function loschen(href){
        Check = confirm("Wollen Sie den Datensatz/Datei wirklich löschen?\n
                                Do you want to delete the data record or file?");
        if(Check == true){
            self.location = href;}
        else{}
    }
</script>


    <span class="headline3rot"><bean:message key="EditPlanung.title"/></span>

    <html:form action="/EditPlanungSpeichern" enctype="multipart/form-data" >
        <logic:empty name="planung">
            <% out.println("hallo");%>

        </logic:empty>
        <logic:notEmpty name="planung">
        <logic:iterate id="pl" name="planung" type="com.sms.engineering.Planung" >
        <html:hidden name="pl" property="p_id"/>
        <html:hidden name="pl" property="filename"/>
        <html:hidden name="pl" property="mimetype"/>
         .....
        </logic:iterate>
        </logic:notEmpty>
        </html:form>
Sobald ein Fehler beim Validieren auftaucht, geht er in das <logic:empty> tag rein.
Beim debuggen werden auch nur die jsp-Seiten gemäß tiles-defs.xml durchlaufen,
und es wird auf keine Action zugegriffen, anders als beim Valiederen ohne Fehler.

Hier nochmal die Action mit deiner Änderung:
Java:
public class EditPlanungAction extends Action {


    public ActionForward execute(org.apache.struts.action.ActionMapping
 actionMapping, org.apache.struts.action.ActionForm actionForm, 
javax.servlet.http.HttpServletRequest httpServletRequest, 
javax.servlet.http.HttpServletResponse httpServletResponse)  {
        try{
            System.out.println("EditPlanungAction");
            DBConnection db = new DBConnection();
            httpServletRequest.getSession().setAttribute("planung", 
            db.getEditPlanung(httpServletRequest.getParameter("p_id")));
            //httpServletRequest.getSession().setAttribute("planung", 
            db.getEditPlanung(httpServletRequest.getParameter("p_id")));
            //httpServletRequest.setAttribute("planung", 
            db.getEditPlanung(httpServletRequest.getParameter("p_id")));
            db.verbindungschliessen();
        }catch(Exception e){
            e.printStackTrace();
        }
        return actionMapping.findForward("success");

    }

}
 
Zuletzt bearbeitet von einem Moderator:

HLX

Top Contributor
Der Code sieht soweit ok aus. Tritt die Exception mit oder ohne Validierungsfehler oder bei beidem auf?

Ist es definitiv ausgeschlossen, dass in dem nicht geposteten Code-Teil Zugriff auf eine Variable aus dem Planungs-Objekt erfolgt, die null ist? Löst ggf. einer der getter im Planungs-Objekt eine NullPointerException auf, weil der sie Logik, statt den reinen Rückgabewert enthält?

Sind diese Punkte auszuschließen, wäre die tiles-def.xml noch interessant.
 

lennied

Mitglied
Die Exception tritt nur auf, wenn bei der Validierung etwas nicht stimmt,
ansonsten läuft es ohne Probleme durch.

Ersetze ich deinen Codevorschlag
Java:
httpServletRequest.getSession().setAttribute("planung", db.getEditPlanung(httpServletRequest.getParameter("p_id")));
durch meinen
Java:
httpServletRequest.setAttribute("planung", db.getEditPlanung(httpServletRequest.getParameter("p_id")));
bekomme ich keine exception, allerdings wie früher schonmal erwähnt, auch nur
die Validerungsfehler angezeigt, und sonst nichts von meiner Seite.

Anbei meine tiles-defs.xml
[XML]
<tiles-definitions>
<definition name="EP.startseite" path="/startseite.jsp">
<put name="body" value="/pages/startseite_body.jsp"/>
<put name="footer" value="/pages/footer.jsp"/>
<put name="navigation" value="/pages/navigation.jsp"/>
</definition>
<definition name="EP.planung" extends="EP.startseite">
<put name="body" value="/pages/startseite_planung.jsp"/>
</definition>
<definition name="EP.editplanung" extends="EP.startseite">
<put name="body" value="/pages/edit_planung.jsp"/>
</definition>
<definition name="EP.overview" extends="EP.startseite">
<put name="body" value="/pages/overview.jsp"/>
</definition>
<definition name="EP.todo" extends="EP.startseite">
<put name="body" value="/pages/todo.jsp"/>
</definition>

</tiles-definitions>
[/XML]
 

HLX

Top Contributor
Ich sehe gerade, dass du in der Struts-Config eine Weiterleitung "success" auf "/Overview.do" hast. Gibt es noch eine Overview-Action? Wenn ja, was steht darin und wie sieht das Action-Mapping dazu aus?
 

lennied

Mitglied
struts-config.xml
[XML]
<action path="/Overview" type="com.sms.struts.GesamtPlanungAction">
<forward name="success" path="EP.overview" />
</action>
[/XML]

Java:
package com.sms.struts;

import com.sms.engineering.*;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;

public class GesamtPlanungAction extends Action {


    public ActionForward execute(org.apache.struts.action.ActionMapping actionMapping, 
org.apache.struts.action.ActionForm actionForm, 
javax.servlet.http.HttpServletRequest httpServletRequest,
 javax.servlet.http.HttpServletResponse httpServletResponse)  {
        try{
            System.out.println("gesamtplanungaction");
            Planung pl = new Planung();
            httpServletRequest.setAttribute("planung", pl.getGesamtPlanung());   
        }catch(Exception e){
            e.printStackTrace();
        }
        return actionMapping.findForward("success");

    }

}

eigentlich nichts besonderes wie ich finde...
 

HLX

Top Contributor
Nichts besonderes? :shock:

Du hängst das Attribut "planung" in dieser Action an den Request. Selbst wenn du es in der anderen Action zuvor als Session-Attribut abgelegt hast, wird das aus dem Request (also aus der GesamtplanungAction) genommen, weil die Struts-Tags das erstbeste Attribut nehmen, dass sie finden und dabei zuerst im Request nachsehen. Das Session-Attribut wird also völlig ignoriert.

Wenn du "planung" in der EditPlanungAction als Requestattribut anlegst, wird es in der GesamtplanungAction überschrieben. Die Zuweisung in EditPlanungAction ist also wirkungslos.

Warum setzt du das Attribut "planung" zweimal?
 

lennied

Mitglied
Ups, das war mir nicht bewußt...

Bin aber einen Schritt weiter gekommen. Die NullPointerException kommt von ganz woanders her, so wie du das schon des öfteren vermutet hast.
Benutze für Termineinträge tags der Library SweetDevRia. Sobald ein Validierungsfehler auftritt,
und die Seite neu geladen wird, tritt bei diesen tags, bzw. bei der Zuweisung der Termine die Exception auf.

Erläuterung:
HTML:
<jsp:useBean id="myBean2" class="com.sms.engineering.Planung" scope="page">
            <jsp:setProperty name="myBean2" property="datum" />
        </jsp:useBean>
Code:
request.setAttribute("cal1", myBean2.getDatum(request.getParameter("p_id"),1));
hier belege ich "cal1" mit dem Datum aus der DB, was beim Anlegen der Planung
(wir sind ja im Editiermodus der einzelnen Planung) ausgewählt wurde.

anschließend belege ich das <ria:calendar> tag mit dem Wert "cal1"
HTML:
<ria:calendar id="cal_vergabetermin" preselectString="${cal1}" displayedMonths="3" popup="true">
                <img src="./resources/images/calendar.gif" class="calendarIcon" alt="Calendar" />
            </ria:calendar>
beim ersten Aufruf des Editiermodus klappt das auch wunderbar, nur sobald
ein Validierungsfehler auftritt, erhalte ich bei den ria:tags eine NullPointerException.

Auffällig ist des weiteren, dass wenn ein Validierungsfehler auftritt,
ich die FM für das Feld erhalte, dass diesen Fehler auslöst, dieser Falsche Wert aber
wieder mit dem Wert aus der DB überschrieben wird. Hoffe du verstehst was ich meine.

Summasumarum, einen Fehler gelöst, aber zwei neue erhalten...:toll:
 

HLX

Top Contributor
beim ersten Aufruf des Editiermodus klappt das auch wunderbar, nur sobald
ein Validierungsfehler auftritt, erhalte ich bei den ria:tags eine NullPointerException.
Vermutlich, weil nach der Validierung der Request-Parameter "p_id" nicht mehr vorhanden ist und somit der Datums-Getter null liefert.

Um zu verstehen, wo das Problem liegt, wäre es gut, die JSP-Seite mal im Gesamtzusammenhang zu sehen. Ich kann die Code-Fragmente irgendwie nicht richtig zuordnen. Wo geschieht das 'request.setAttribute("Cal"...' etc.?
 

lennied

Mitglied
Vorab erstmal vielen Dank für deine Mühen und zahlreichen Tipps,
die du mir bisher gegeben hast!!

Vermutlich, weil nach der Validierung der Request-Parameter "p_id" nicht mehr vorhanden ist und somit der Datums-Getter null liefert.
yep, das ist korrekt, habe das auch schon ansatzweise gelöst indem ich, leider nur statisch bisher, im <html:form> tag die "p_id" als Parameter übergebe
HTML:
<html:form action="/EditPlanungSpeichern?p_id=69" enctype="multipart/form-data" method="post" >

Frage für zwischendurch: Wie bekomme ich das dynamisch hin??
Sowas wie
Code:
String id = request.getParameter("p_id");
HTML:
<html:form action="/EditPlanungSpeichern?p_id=<%=id%>" enctype="multipart/form-data" method="post" >
funktioniert leider nicht...er löst die "id" nicht auf...

anbei noch die komplette jsp-seite:
HTML:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="java.util.*" %>


<%@page import="com.ideo.sweetdevria.page.Page"%>
<%@page import="com.ideo.sweetdevria.page.PageManager"%>
<%@page import="com.ideo.sweetdevria.taglib.fileUpload.model.FileUploadModel"%>
<%@page import="java.util.*"%>
<%@page import="com.ideo.sweetdevria.util.DateUtils"%>
<%@page import="org.apache.commons.lang.ArrayUtils"%>
<%@page import="com.sms.engineering.*"%>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
<%@ taglib prefix="ria" uri="http://sweetdev-ria.ideotechnologies.com" %>

<!--Anzeigen der Fehlermeldungen...-->
<logic:messagesPresent>
    <bean:message key="errors.header"/>
    <ul>
        <html:messages id="error">
        <li><bean:write name="error"/></li>
        </html:messages>
    </ul><hr>
</logic:messagesPresent>
<script >
    function loschen(href){
        Check = confirm("Wollen Sie den Datensatz/Datei wirklich löschen?\nDo you want to delete the data record or file?");
        if(Check == true){
            self.location = href;}
        else{}
    }
</script>
     <jsp:useBean id="myBean2" class="com.sms.engineering.Planung" scope="page">
            <jsp:setProperty name="myBean2" property="datum" value="06-04-2009" />
        </jsp:useBean>
        <jsp:useBean id="myBean" class="com.sms.engineering.Planung" scope="session">
            <jsp:setProperty name="myBean" property="aos"  />
        </jsp:useBean>
<%

         String cal1 = myBean2.getDatum(request.getParameter("p_id"),1);
         String cal2 = myBean2.getDatum(request.getParameter("p_id"),2);
         String cal3 = myBean2.getDatum(request.getParameter("p_id"),3);

         Calendar cal = new GregorianCalendar( TimeZone.getTimeZone("ECT") );
         out.println("cal1:"+cal1);
         
         if (cal1.equals("")){ // || cal1.equals(null)){
            cal1 = (cal.get(Calendar.MONTH)+1) +"-"+(cal.get(Calendar.DATE))+"-"+cal.get(Calendar.YEAR);
         }
         request.setAttribute("cal1", cal1);
         if (cal2.equals("")){
            cal2 = (cal.get(Calendar.MONTH)+1) +"-"+(cal.get(Calendar.DATE))+"-"+cal.get(Calendar.YEAR);
         }
         request.setAttribute("cal2", cal2);
         if (cal3.equals("")){
            cal3 = (cal.get(Calendar.MONTH)+1) +"-"+(cal.get(Calendar.DATE))+"-"+cal.get(Calendar.YEAR);
         }
         request.setAttribute("cal3", cal3);
       
         String[] s = myBean.getAos(request.getParameter("p_id"));
         String orga = s[0];
         String id = request.getParameter("p_id");
         String sparte = s[1];
         String anrede = s[3];
         String status = s[4];
    %>
       

    <span class="headline3rot"><bean:message key="EditPlanung.title"/></span>
    <logic:notEmpty name="planung">
        <logic:iterate id="pl" name="planung" type="com.sms.engineering.Planung" >
            <html:form action="/EditPlanungSpeichern?p_id=69" enctype="multipart/form-data" method="post" >
        
        <html:hidden name="pl" property="p_id"/>
        <html:hidden name="pl" property="filename"/>
        <html:hidden name="pl" property="mimetype"/>
        
    <table border="0" cellspacing="0" cellpadding="0">
    <tr><td><bean:message key="organisation"/></td><td><bean:message key="abteilung"/></td><td><bean:message key="engineering"/></td></tr>

    <tr><td align=left><html:select value="<%=orga%>" property = 'organisation' indexed="Organisation" size="1">
            <html:option value="1">Orga1</html:option>
            <html:option value="2">Orga2</html:option>
            <html:option value="3">Orga3</html:option>
        </html:select>
    </td>
    <td align=left>

        <html:text name='pl' property = 'abteilung'/>
     </td>
     <td align=left><html:select value="<%=sparte%>" property = 'engineering'size="1">
             <html:option value="1">Maschinenbau</html:option>
             <html:option value="2">Stahlbau</html:option>
             <html:option value="3">Hilfseinrichtungen</html:option>
             <html:option value="4">Antriebstechnik</html:option>
             <html:option value="5">EA</html:option>
             <html:option value="6">Fundamente</html:option>
             <html:option value="7">Hydraulik</html:option>
             <html:option value="8">Medien (sonstige)</html:option>
             <html:option value="9">Rohrleitungen</html:option>
             <html:option value="10">Sonstige</html:option>

        </html:select></td>
    <TD><font color="#FF0000" size=1>Bitte ändern Sie bei Bedarf Organisationseinheit,<br>
                                     Abteilung und Engineeringthema!!
        </font></TD>
     </tr>
     </table><p></p>
     <table border="0" cellspacing="0" cellpadding="0" width="500">
    <tr><td><bean:message key="KW/Jahr"/>:</td>
        <td><bean:message key="cadsystem"/>:</td>

    </tr>
    <tr>
        <td>
            <ria:calendar id="cal_vergabetermin" preselectString="${cal1}" displayedMonths="3" popup="true">
                <img src="./resources/images/calendar.gif" class="calendarIcon" alt="Calendar" />
            </ria:calendar>
        </td>

        <td><html:textarea name='pl' property='cad' /></td>
    </tr>
    <tr><td><bean:message key="anfang"/>:</td>
        <td><bean:message key="ende"/>:</td></tr>
    <tr><td>
            <ria:calendar id="cal_anfang" preselectString="${cal2}" displayedMonths="3" popup="true">
                <img src="./resources/images/calendar.gif" class="calendarIcon" alt="Calendar" />
            </ria:calendar>
        </td>
        <td>
            <ria:calendar id="cal_ende" preselectString="${cal3}" displayedMonths="3" popup="true">
                <img src="./resources/images/calendar.gif" class="calendarIcon" alt="Calendar" />
            </ria:calendar>
        </td>
</tr>
</table><p></p>
<table border="0" cellspacing="0" cellpadding="0" width="500">
<tr>
    <td><bean:message key="kennwort"/>:</td><td><html:text name='pl' property = 'kennwort'/></td>
    <td></td>
</tr>
<tr>
    <td><bean:message key="auftrag"/>:</td><td><html:text name='pl' property = 'auftrag' /></td>
    <td></td>
</tr>
<tr>
    <td><bean:message key="gegenstand"/>:</td><td><html:text name='pl' property = 'gegenstand' /></td>
    <td></td>
</tr>
<tr>
    <td><bean:message key="bemerkung"/>:</td><td><html:text  name='pl' property = 'bemerkung' /></td>
    <td></td>
</tr>
<tr><td>User:</td><td><html:text property = 'user'  readonly="true" value="<%=request.getRemoteUser()%>"/></td>
    <td></td>
</tr>
</table> <p></p>
<table border="0" cellspacing="0" cellpadding="0" width="500">
<tr><td><u><bean:message key="ansprechpartner"/>:</u></td><td></td></tr>
</table><p></p>
<table border="0" cellspacing="0" cellpadding="0" width="500">

<tr><td><bean:message key="anrede"/>:</td><td>
        <html:select value="<%=anrede%>" property = 'anrede'size="1">
             <html:option value="1">Herr</html:option>
             <html:option value="2">Frau</html:option>
        </html:select></td></tr>
<tr><td><bean:message key="vorname"/>:&nbsp;</td><td><html:text name='pl'  property = 'vorname'/></td>
    <td><bean:message key="nachname"/>:&nbsp;</td><td><html:text  name='pl' property = 'nachname'/></td></tr>
<tr><td><bean:message key="tel"/>:&nbsp;</td><td><html:text  name='pl'  property = 'telefon'/></td>
</table><p></p>
<table border="0" cellspacing="0" cellpadding="0" width="500">
<bean:message key="spec"/>: <font color="red"><a href="\\shilapp02.de.sms-demag.com\downloads\<bean:write name='pl' property='filename'/>"  type="<bean:write name='pl' property='mimetype'/>">
                            <bean:write name="pl" property="filename"/></a></font>
                            <logic:notEqual name="pl" property="filename" value="">
                                <a href="javascript:loschen('<html:rewrite page="/FileDelete.do" paramId='p_id' paramName='pl' paramProperty='p_id'/>')" title='löschen/delete'>
                                    <span class='headline3rot'>[x]</span></a>
                            </logic:notEqual>
        
                            <br><br>
<logic:equal name="pl" property="filename" value="">
    <html:file property="file" /><br><br>
</logic:equal>
<bean:message key="status"/>:<html:select value="<%=status%>" property = 'status_id' size="1">
            <html:option value="1">geplant</html:option>
            <html:option value="2">vergeben</html:option>
        </html:select>

</table><p></p>
     <table>
     <tr><td><html:submit value= "Änderungen speichern"/></td></tr>
     <tr><td><html:reset value="zurücksetzen"/></td></tr>
     </table>
   </html:form>
</logic:iterate>
</logic:notEmpty>
 

lennied

Mitglied
das aber funktioniert???
Code:
String id = "/EditPlanungSpeichern?p_id="+request.getParameter("p_id");
HTML:
<html:form action="<%=id%>"  enctype="multipart/form-data" method="post" >
mh, das überrascht mich jetzt aber...
 

HLX

Top Contributor
Mich auch. Müsste es nicht

/EditPlanungSpeichern.do?p_id="+request.getParameter("p_id");

heißen? (Es sei denn du hast das Servlet-Mapping des ActionServlet nicht in der web.xml gesetzt)

Die JSP-Seite enthält verdammt viel Quellcode. Das gehört eigentlich in eine Action. Du solltest die JSP-Seite zunächst ausschließlich über eine Action aufrufen. In dieser wertest du deinen Request-Parameter "p_id" aus und setzt alle nötigen Objekte (cal1, cal2 etc.) als Request-Attribute. Leite erst dann an die JSP-Seite weiter. Möglicherweise brauchst du den Request-Parameter dort sogar nicht mehr. Falls doch, setze auch ihn in der Action als Request-Attribut und verwende fortan dieses.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Struts 2 Iterator Validation Web Tier 4
G Struts 2 Validation Web Tier 5
G Struts 2 - Validation Frage Web Tier 5
I heutzutage Struts 1 oder 2 in der Praxis? Web Tier 4
K Struts Struts forwarded lokal auf fertige Webseite Web Tier 2
M Struts 2 - "There is no Action mapped for namespace..." - globale Lösung? Web Tier 3
S Tomcat 7, Struts, JPA baut keine Verbindung auf Web Tier 13
D Struts 2 , DIV Container mit verschiedner Farbe Web Tier 2
K Struts request Zugriff Web Tier 4
2 Anwendung mit Zuständen und Struts Web Tier 5
P Struts 2 Download Dateinamen Web Tier 2
ruutaiokwu struts 2 & jsf kombinieren Web Tier 2
D Struts und CSS Web Tier 4
7 Struts+AJAX- Session-Handling? Web Tier 2
7 Struts und Ajax. Problem mit Actions Web Tier 2
7 Struts iterator index JS-Funktion übergeben?? Web Tier 2
7 Struts: bei action immer ein Result nötig? Web Tier 2
7 Struts vom popup wieder zurück ins alte Fenster? Web Tier 2
7 statische Variablen in Struts-Tags nutzen? Web Tier 6
7 Struts Performance-Schwäche Web Tier 5
7 Struts Actionaufruf durch JS Web Tier 4
Tandibur Struts 2 - Startseite festlegen Web Tier 5
J Struts aus JSP ActionForm-Eigenschaft lesen Web Tier 5
7 Struts 2 nebeneinanderliegende Textfelder Web Tier 4
E Struts: Text in JSP aus Action heraus setzen Web Tier 4
F Struts Tabellen Web Tier 3
F Meinungsumfrage Struts / Javascript Web Tier 3
F Problem mit Struts Web Tier 2
T Json mit Struts 2 Web Tier 2
2 Blätterfunktion in Struts? Web Tier 2
S Struts - Http Port ändern Web Tier 11
L Struts JSTL Form Variable Übermitteln Web Tier 2
S GET in struts und JSF Web Tier 6
O JSP: HTML tags werden vor struts tags angezeigt Web Tier 3
L STRUTS: javax.servlet.jsp.JspException Web Tier 3
O struts - Gültigkeit einer Action an Session binden?! Web Tier 4
N MessageResources von Struts in Form-Bean Web Tier 4
pusteblume JavaScript mit Struts auslesen? Web Tier 3
A Struts - JSP - HTML - Visualisierungsproblem Web Tier 3
M Properties der JSP nach input-result leer (Struts 2) Web Tier 2
M Zugriff aus eigenen Tags auf Struts Value Stack Web Tier 2
M Struts 2 Submit Button lokalisieren Web Tier 5
pusteblume Struts multibox - dynamische checkboxen Web Tier 5
T Action mapping Frage (Struts) Web Tier 2
J Struts 2 session ID auslesen? Web Tier 5
G Kurze Frage zu Servlets&Struts Web Tier 4
G Performance Struts vs Faceltes vs JSP Web Tier 9
N Struts - reset, wie komme ich an das ActionMapping Web Tier 2
T In einem Struts Tag Werte mit Java einfügen Web Tier 2
B struts-blank, eclipse und tomcat6 konfigurieren Web Tier 7
O Struts Grundlagen Frage Web Tier 32
T Tabelle mit checkboxen in Struts Web Tier 19
T Button abfrage mit Struts leicht gemacht ? Web Tier 3
B Struts: html:checkbox Web Tier 2
U Problem bei Validierung mit Struts 2 Web Tier 1
A JSF und Struts unter einen Hut bringen (SingleSignOn) Web Tier 2
R Webhoster mit Struts Web Tier 13
S Struts: Validierung mit mask Web Tier 2
G radio button deselect mit struts Web Tier 7
L Validation über ManagedBeans Web Tier 7
E Struts XML validation schlägt immer fehl Web Tier 1
A JSF form absenden ohne require validation (andere schon) Web Tier 4
F JSF - Submit nach Validation-Failed Web Tier 6
K JSF Custom Validation Messages Migration von JSF 1.2 auf 2.0 Web Tier 5
J Validieren abhängiger Felder mit JEE6/Bean validation Web Tier 33
S Style bei fehlerhafter Eingabe (Bean Validation) ändern Web Tier 2
S Bean Validation (JSF 2.0) funktioniert nicht. Web Tier 4
D Ajax und Validation ohne große Umstrukturierung Web Tier 3
P Struts2 - Mehrere Methoden/Actions in einer Klasse + Validation Web Tier 2
S Facelets Form: Validation abschalten bei Abbrechen-Button Web Tier 2
J 404 Error bei Eingabe URL (Glassfish 5) Web Tier 4
L error-page mit ui:composite funktioniert nicht Web Tier 0
B GWT Compiler Error unresolved Typ Web Tier 5
M JSF Error pages Web Tier 3
5 Servlet Error - cvc-complex-type.4: Attribute 'version' must appear on element 'web-app'. Web Tier 2
B GWT + EJB + Maven - Test Error Web Tier 2
S Fehlerseiten (error-page) Web Tier 6
P No source code is available for type -GWT Error Web Tier 1
P Servlet wird nicht gefunden - HTTP Error 503 Web Tier 7
S "An error occured while initializing MyFaces" Web Tier 2
P Error 404 abfangen Web Tier 5
E rpc.StatusCodeException: Error 404, URI not found Web Tier 1
J error-page geht nicht Web Tier 12
T Error zu handleJspException Web Tier 4

Ähnliche Java Themen

Neue Themen


Oben