2016-08-25 57 views
5

Buduję moją bieżącą witrynę internetową na szablonie widoku złożonego przy użyciu Java, Spring MVC i Hibernate. Oto, jak to działa:Radzenie sobie ze zdjęciami BindingResult i modelami z widokiem złożonym

Przeglądarka prosi o stronę.

Wewnętrzny Wynik Zobacz Klasa przechwytuje żądania, dostaje swoją wartość i przekierowuje do JSP szablon, który łączy się nagłówek i stopkę ze strony poprosił.

Następnie zwraca szablon jsp, tak jakby był stroną zadawaną.

Problem polega na tym, że mam problemy w czytaniu informacje na stronie głównej, jak na przykład błędy walidacji z obiektu BindingResult (patrz this pytanie bez odpowiedzi zrobiłem ten temat szczegóły).

myślę przepływ prośba pracuje tak (poprawcie mnie jeśli źle): Żądanie Strony

użytkownika> InternalResourceView przechwytuje i przekierowuje do Template.jsp> A połączyła JSP jest pokazany.

Uważam, że modele z Żądanej strony nie występują w połączonym jsp.

Martwię się, że jeśli chodzi o wyświetlanie list i formularzy dynamicznych z danych zgromadzonych w bazie danych, może się to okazać kłopotliwe. Czy myliłem się w moich kłopotach? Jeśli nie, co mogę zrobić, aby naprawić problemy, takie jak ten z błędami BindingResult?

odsyłającym, użyj linku o błędach BindingResult a klasa CompositeView poniżej:

import java.util.Map; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.web.servlet.view.InternalResourceView; 

public class CompositeView extends InternalResourceView { 

    @Override 
    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 

     String dispatcherPath = prepareForRendering(request, response); 
     String[] parts = dispatcherPath.split("/"); 
     String endpath; 
     if (parts[parts.length - 2].endsWith("views")) { 
      endpath = parts[parts.length - 1]; 
     } else { 
      endpath = parts[parts.length - 2] +"/"+ parts[parts.length - 1]; 

     } 

     request.setAttribute("partial", endpath); 


     RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/template.jsp"); 
     rd.include(request, response); 

    } 
} 

I Template.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<script type="text/javascript" src="resources/js/jquery-3.1.0.js"></script> 
<script type="text/javascript" src="resources/js/bootstrap.js"></script> 

<link rel="stylesheet" href="resources/css/bootstrap.css"> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title><spring:message code="application.title"></spring:message></title> 
</head> 
<body> 
    <div class="row"> 
     <div class="col-md-8 col-md-offset-2"> 

      <jsp:include page="navbar/header.jsp" /> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="col-md-6 col-md-offset-3"> 
      <jsp:include page="${partial}" /> 
      <jsp:include page="navbar/footer.jsp" /> 
     </div> 
    </div> 

</body> 
</html> 
+0

W pierwotnej implementacji 'metoda InternalResourceView' widzę calls' exposeModelAsRequestAttributes (model, żądanie); 'i' exposeHelpers (request); "Może użyjesz również tych połączeń? – marioosh

+0

Czy po prostu nie zgarniesz tego, co jest wewnątrz żądania i odpowiedzi? –

Odpowiedz

2

Chyba brakuje exposeModelAsRequestAttributes metodę

Expose model obiektów w podanej mapie jako atrybuty żądania. Nazwy zostaną pobrane z modelu Map. Ta metoda jest odpowiednia dla wszystkich zasobów dostępnych przez RequestDispatcher.

exposeModelAsRequestAttributes(model,request); 

powinien być umieszczony w

@Override 
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 

    //start :new code added by sanka 
    exposeModelAsRequestAttributes(model,request); 
    //end :new code added by sanka 

    String dispatcherPath = prepareForRendering(request, response); 

API

+0

Dokładnie to. Udało mi się to naprawić, zanim zobaczyłem twoją odpowiedź, ale o to chodzi. Teraz jedyny problem jaki mam, to jak sprawić, by błędy Binding Result przetrwały przez przekierowanie (atrybuty flash nie działają). –