Validierung

KalleM

Aktives Mitglied
Hallo,
habe eine view index.jsp und in diese view importiere ich eine andere, eingabe.jsp. die importierte eingabe.jsp hat ein paar eingabefelder. die index.jsp hat einen controller und die eingabe.jsp hat einen controller.
die eingabe.jsp sieht ungefähr so aus:
Java:
<form:form method="POST" commandName="user" action="eingabe.htm" >
       <form:input path="vorname" /><form:errors path="vorname" cssClass="error" id="error" />
       <form:input pathe="nachname" /><form:errors path="nachname" cssClass="error" id="error" />
</form:form>
nun ruft der controller für die eingabe.jsp die serviceklasse EingabeValidator auf:
Java:
public class EingabeValidator implements Validator{

    @Override
    public boolean supports(Class clazz){
        return User.class.isAssignableFrom(clazz);
    }

     @Override
    public void validate(Object target, Errors errors){
        
        User user = (User)target;

        ValidationUtils.rejectIfEmpty(errors, "vorname", "vorname", "Angabe ist erforderlich");
        ValidationUtils.rejectIfEmpty(errors, "nachme", "nachname", "Angabe ist erforderlich");
       }
}

in dem eingabecontroller sage ich dann, sollte die eingabe falsch sein, also:

Java:
 @RequestMapping(method = RequestMethod.POST)
     public String handleRequestPost(@ModelAttribute("user")User user,
                BindingResult result){

         /**Gucke, ob die Eingabe ok ist*/
          userHinzufuegenValidator.validate(user, result);

          if(result.hasErrors()){
              return "redirect:index.htm?content=eingabe.htm";
          }else{
            this.addUserServiceImpl.addUser(user);
            return "redirect:index.htm?content=eingabe.htm";
        }
    }
nun ist es aber so, sollten die eingabedaten fehlerhaft sein, werden mir die fehlermeldungen nicht mehr angezeigt. kann mir jemand sagen was ich falsch mache?
 

pizza1234

Mitglied
Hi,

du redirectest ja auch bei Fehlern trotzdem wieder neu auf die gleiche Seite:
Java:
return "redirect:index.htm?content=eingabe.htm";

Ich kenne mich mit Spring 3 nicht aus, aber ich denke, das "redirect" muss weg. Ehrlich gesagt, wundere ich mich sowieso, das du die Validierung explizit machen mußt. In Spring 2.5 brauche ich nur den Validator injecten und den Rest erledigt Spring für mich.

Grüße
Peter
 

KalleM

Aktives Mitglied
das mit dem redirect stimmt natürlich. das liegt aber daran, dass ich mir eine index.jsp gebaut habe, die so aussieht:
Java:
</head>
    <body>
       <div class="top">
          <c:import url="kopf.jsp"/>
       </div>               
       <div class="wrapper">
         <div class="links">                
            <c:import url="${content}" />
         </div>      
         <div class="rechts">
            <c:import url="infoContent.jsp" />
         </div>            
      </div>
   </body>
</html>
für diese URL habe ich jetzt einen controller und dieser controller sorgt dafür, dass der entsprechende content in den platzhalter ${content} geladen wird. das heisst hier lade ich dann zum beispiel die eingabe.jsp, die ja einen eigenen controller hat. darum suche ich nach einer lösung wie ich die fehlermeldungen diesem return "redirect:index.htm?content=eingabe.htm"; mitgeben kann.
da ich da noch recht unerfahren bin kann ich echt hilfe gebrauchen. vielleicht ist mein vorgehen mit dem platzhalter ${content} ja auch nicht gut?
 
Zuletzt bearbeitet:

pizza1234

Mitglied
Hi,

warum machst du das? Die Seite "eingabe.html" soll doch die Daten für deinen User validieren. Bei Fehlern bleibst du auf der Seite und zeigst den Fehler an, wenn alles ok ist, redirectest du. Dein "Indexcontroller" ist nur für die Seite "index.html" zuständig, bzw. normalerweise redirectet die "index.html" nur zu den Seiten innerhalb deines WEB-INF-Ordners und besitzt (z. bei mir) gar keinen Controller. Normalerweise hast du für jede Seite einen Controller, der (auch) für die Validerung mit den passenden Validatoren da ist. Kann es sein, das du eigentlich ein Templateframework suchst?
Vielleicht hilft dir das weiter?

Grüße
Peter
 

KalleM

Aktives Mitglied
hallo nochmal,
habe ein kleine beispielanwendung mit tiles in dem buch spring pro 2.5 gefunden und versuche dieses beispiel zum laufen zu bringen.

dispatcher-servlet
Java:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans-2.5.xsd[/url]
       [url=http://www.springframework.org/schema/aop]Index of /schema/aop[/url] [url]http://www.springframework.org/schema/aop/spring-aop-2.5.xsd[/url]
[url=http://www.springframework.org/schema/tx]Index of /schema/tx[/url] http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <bean name="/index.htm" class="web.IndexController" />
          
</beans>

applicationContext.xml
Java:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans-2.5.xsd[/url]
       [url=http://www.springframework.org/schema/aop]Index of /schema/aop[/url] [url]http://www.springframework.org/schema/aop/spring-aop-2.5.xsd[/url]
       [url=http://www.springframework.org/schema/tx]Index of /schema/tx[/url] http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
          p:location="/WEB-INF/view.properties" />


  <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions">
      <list>
        <value>/WEB-INF/tiles-layout.xml</value>
      </list>
    </property>
  </bean>
  

  <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <property name="suffix" value=".jsp"></property>

</bean>

</beans>

root.jsp
Java:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@taglib  uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>

<%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
        <c:set var="css"><spring:theme code="css" /></c:set>
        <c:if test="${not empty css}">
            <link rel="stylesheet" href="<c:url value="${css}" />" type="text/css" />
        </c:if>

            <tiles:insertAttribute name="meta" />
            <title><tiles:getAsString name="title"/></title>

    </head>
    <body>

        <table cellspacing="0" cellpadding="0" width="700px" align="center">
            
            <tr> 
                <td colspan="2"><tiles:insertAttribute name="header"/></td>
            </tr>
            
            <tr> 
                <td colspan="2"><tiles:insertAttribute name="toolbar"/> </td>
            </tr>
            
            <tr heigth="400px"> <td width="150px" valign="top"><tiles:insertAttribute name="menu"/></td>
                <td width="550px" valign="top"><tiles:insertAttribute name="body"/></td>
            </tr>

            <tr>
                <td colspan="2"><tiles:insertAttribute name="footer"/></td>
            </tr>
        </table>

    </body>
</html>

view.properties
Java:
#index
index.class=org.springframework.web.servlet.view.tiles2.TilesView
index.url=.index

und den IndexController
Java:
public class IndexController extends AbstractController{

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest hsr, HttpServletResponse hsr1) throws Exception {
        return new ModelAndView("index");
    }

}

mein problem ist , dass ich eine welcome seite habe "redirect.jsp" von dieser seite aus, leite ich weiter an die index.htm. nun wird beim aufruf der index.htm der IndexController aufgerufen und gibt mir die index.jsp aus. eigentlich soll das properties file dafür sorgen, dass die root.jsp mit dem entsprechenden inhalt aufgerufen werden soll. kann mir da noch mal jemand helfen, stehe da voll auf dem schlauch
 
Zuletzt bearbeitet:

KalleM

Aktives Mitglied
Java:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
    <definition name=".root" template="/WEB-INF/jsp/root.jsp">
        <put-attribute name="title" value="CHANGE-ME" />
        <put-attribute name="meta" value="/WEB-INF/jsp/meta.jsp" />
        <put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />
        <put-attribute name="menu" value="/WEB-INF/jsp/menu.jsp" />
        <put-attribute name="toolbar" value="/WEB-INF/jsp/toolbar.jsp" />
        <put-attribute name="footer" value="/WEB-INF/jsp/footer.jsp" />
    </definitions>


    <definition name=".index" extends=".root">
        <put-attribute name="title" value="Main Page" />
        <put-attribute name="body" value="/WEB-INF/jsp/index.jsp"/>
    </definition>

    <definition name=".status" extends=".root">
        <put-attribute name="title" value="Status"/>
        <put-attribute name="body" value="/tile/status.title"/>
    </definition>

</tiles-definitions>
 

pizza1234

Mitglied
Hm,
sieht für mich alles korrekt aus. Die Indexseite muss ja auch aufgerufen werden. Die stellt den Inhalt deiner index.jsp dar und den Inhalt deines root-templates. (sofern deine jsp-Templates korrekt sind).
 

KalleM

Aktives Mitglied
das sind ganz normale standard jsp, die netbeans erzeugt:

Java:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello World!</h1>
    </body>
</html>
 

pizza1234

Mitglied
Hi,

aber du mußt die Tiles doch auch integrieren!

root:
Code:
<%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">        
<HTML>
<HEAD>
</HEAD>
<BODY>

   <div><tiles:insertAttribute name='header'/></div>
   <div><tiles:insertAttribute name='menu'/></div>
<div><tiles:insertAttribute name='body'/></div>
	<!--usw...->


</BODY>
</HTML>

[XML] <definition name=".root" template="/WEB-INF/jsp/root.jsp">
<put-attribute name="title" value="CHANGE-ME" />
<put-attribute name="meta" value="/WEB-INF/jsp/meta.jsp" />
<put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />
<put-attribute name="menu" value="/WEB-INF/jsp/menu.jsp" />
<put-attribute name="toolbar" value="/WEB-INF/jsp/toolbar.jsp" />
<put-attribute name="body" value="/WEB-INF/jsp/whateveryouwant.jsp" />
</definitions>
[/XML]

Seite root ist dein Template, alle anderen "body"-Seiten werden dann in die root -Seiteintegriert, die "index"-Seite erbt sozusagen den Inhalt von root und ersetzt den body mit seinem eigenem body.

Grüße
Peter
 

Neue Themen


Oben