2013-05-30 33 views
1

我在我的項目中使用JstlView彈簧塊。模型對象不會傳遞給Spring MVC中的jsps - InternalResourceView - renderMergedOutputModel

當我嘗試發送形式:從驗證錯誤通過控制器來JSP,誤差不被dispayed在JSP

當調試,

)正在被打印

1個錯誤在返回modelandview之前的控制器類中,來自驗證器類。

2)然後錯誤也被打印在控制器類的JstlView類中。

所以我認爲,jstlview類中的requestDispatcher.forward(request,response)沒有將模型數據返回給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); 
      }  
     } 

驗證

@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是tile view的一部分時,這些屬性是不可訪問的。

有人可以幫我解決這個問題嗎?

回答

2

你是在擴展類org.springframework.web.servlet.view.InternalResourceViewJstlView類並覆蓋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歲,但它解決了我已經爭取了一個多月的問題!起來! –

相關問題