2013-05-30 3 views
1

Я использую JstlView Spring Tiles в моем проекте.Объекты модели не передаются jsps в Spring MVC - InternalResourceView - renderMergedOutputModel

Когда я пытаюсь отправить форму: ошибки от валидатора Jsp через контроллер, ошибки не обходилась в JSP

, когда я отладки,

1) ошибки печатаются в классе контроллера перед возвратом modelandview, из класса валидатора.

2) Затем ошибка также печатается в классе JstlView из класса контроллера.

Так что я думаю, requestDispatcher.forward (запрос, ответ) в классе jstlview не возвращает данные модели в jsp.

Потому что, когда я искал объекты HttpServletRequest или HttpServletResponse для извлечения ошибок в jsp, значения передаются в jsp.

Может ли кто-нибудь помочь мне в этом использованном.

Как я могу отправить данные модели в jsp renderMergedOutputModel-RequestDispatcher, метод перенаправления.

Мой код выглядит следующим образом,

JstlView класс:

public class JstlView extends InternalResourceView { 

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

// Determine the path for the request dispatcher. 
String dispatcherPath = prepareForRendering(request, response); 

// set original view being asked for as a request parameter 
request.setAttribute("partial", dispatcherPath.substring(dispatcherPath.lastIndexOf("/") + 1)); 

// force everything to be template.jsp 
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/jsp/template.jsp"); 
requestDispatcher.forward(request, response); 

System.out.println("**********************"+model.get("userName")); 
} 

} 

servlet.xml

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 

    <property name="viewClass" value="com.tms.web.view.JstlView" /> 

    <property name="prefix" value="/WEB-INF/jsp/" /> 

    <property name="suffix" value=".jsp" /> 
</bean> 

Контроллер:

private LoginValidator loginValidator; 
    @Autowired 
    public void setUserValidator(LoginValidator loginValidator) { 
     this.loginValidator = loginValidator; 
    } 

     final RequestHandler requestHandler = new RequestHandler(); 
     @RequestMapping(value = "/login", method = RequestMethod.GET) 
     public ModelAndView login() { 
      return new ModelAndView("login", "users", new users()); 
     } 

    @RequestMapping(value = "/logins",method = RequestMethod.POST) 
    public ModelAndView validateUser(@Valid users user, BindingResult result,@ModelAttribute("users")users users,ModelMap model,RedirectAttributes redirectAttributes,HttpServletRequest req) 
    { 
     this.loginValidator.validate(user, result); 
      if (result.hasErrors()) 
      { 
        model.putAll(result.getModel());//values not retuned to jsp 
        req.setAttribute("userName", result.getFieldError().getDefaultMessage().toString()); //working fine values retuned to jsp 
        return new ModelAndView("/login", model); 
      } 
      else 
      { 
        //succes related code 
        return new ModelAndView(redirect, model); 
      }  
     } 

Validator

@Component 
public class LoginValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> clazz) { 

    return clazz.isAssignableFrom(users.class); 
    } 
    @Override 
    public void validate(Object obj, Errors errors) { 
    users user = (users) obj; 
    String userName = user.getUserName(); 
    String password = user.getPassword(); 
    validateuserName(userName,password, errors); 
    } 

    private void validateuserName(String userName, String password,Errors errors) { 
    if (!(isValidString(userName))) { 
     errors.rejectValue("userName", "userName.required","Username should not be blank"); 
    } 
    else if(!(isValidString(password))) 
    { 
     errors.rejectValue("password", "password.required","Password should not be blank"); 
    } 
    } 

    private boolean isValidString(String str) { 
    return isNotNull(str) && (str.length() > 0) && !(str.isEmpty()); 
    } 

    private boolean isNotNull(String str) { 
    return str != null; 
    } 
} 

Jsp

<%@ page language="java" contentType="text/html;charset=UTF-8; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1" %> 
<%@ page isScriptingEnabled="true" isELIgnored="false" %> 

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

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 



    <form:form method="POST" action="/TMSWeb/logins" commandName="users" modelAttribute="users">           
           <input name="password" type="password" align="center"/> 
           <form:errors path="password" cssClass="error" element="div" /> 
           <input type="submit" class="buttonorange" value="Login"/> 
      </form:form> 

В Spring MVC, когда я могу получить доступ фасоль в JSP без JstlView, а затем, в моем JSP я могу написать ($ {ошибок). Но когда тот же JSP является частью вида плитки, эти свойства недоступны.

Может кто-нибудь помочь мне в этом вопросе?

ответ

2

Вы расширив класс org.springframework.web.servlet.view.InternalResourceView в вашем JstlView класс и переопределить renderMergedOutputModel метод, где вам не хватает, чтобы выставить объект модели. вызовите этот метод exposeModelAsRequestAttributes (model, requestToExpose); от метода переопределения, как показано ниже. Попробуйте использовать код ниже, который работает для меня.

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

// Expose the model object as request attributes. 
    exposeModelAsRequestAttributes(model,request); 

// Determine the path for the request dispatcher. 
String dispatcherPath = prepareForRendering(request, response); 

// set original view being asked for as a request parameter 
request.setAttribute("partial", dispatcherPath.substring(dispatcherPath.lastIndexOf("/") + 1)); 

// force everything to be template.jsp 
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/jsp/template.jsp"); 
requestDispatcher.forward(request, response); 

System.out.println("**********************"+model.get("userName")); 
} 

} 
+0

Этот пост 3 года, но он решил проблему, с которой я боролся больше месяца! Вверх вверх! –

Смежные вопросы