2011-05-06 20 views
2

我有一個sitemesh春天工作。 這裏是我的sitemesh.xml與彈簧mvc和sitemesh工作時的問題

<?xml version="1.0" encoding="UTF-8"?> 

<sitemesh> 
    <property name="decorators-file" value="/WEB-INF/decorators.xml" /> 
    <excludes file="${decorators-file}" /> 

    <page-parsers> 
     <parser content-type="text/html" 
      class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" /> 
     <parser content-type="text/html;charset=ISO-8859-1" 
      class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" /> 
    </page-parsers> 

    <decorator-mappers> 
     <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper"> 
      <param name="config" value="${decorators-file}" /> 
     </mapper> 
    </decorator-mappers> 
</sitemesh> 

這裏是decorator.xml

<?xml version="1.0" encoding="UTF-8"?> 
<decorators defaultdir="/WEB-INF/decorators"> 

    <decorator name="main" page="main.jsp"> 
     <pattern>/*</pattern> 
    </decorator> 
</decorators> 

,這裏是我的控制器:

package org.itax.calculator.web.controller; 

import org.itax.calculator.domain.Login; 
import org.itax.calculator.domain.User; 
import org.itax.calculator.service.UserService; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.validation.BindingResult; 
import org.springframework.validation.ValidationUtils; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
import java.io.IOException; 

@Controller 
public class LoginController { 
    private static final Logger log = LoggerFactory 
      .getLogger(LoginController.class); 

    @Autowired 
    UserService userService; 

    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public void showForm(ModelMap model) { 

     log.debug("entered showLoginForm"); 
     model.put("command", new Login()); 
    } 

    @RequestMapping(value = "/login", method = RequestMethod.POST) 
    public void processForm(@ModelAttribute("command") Login command, 
      BindingResult result, HttpSession session) { 
     validate(command, result); 
     if (result.hasErrors()) { 
      return; 
     } 
     User user = userService.getUserByUserNameAndPassword(
       command.getUserName(), command.getPassword()); 
     if (user != null) { 
      log.debug("user login successfully, id={}, userName={}", 
        user.getId(), user.getUserName()); 
      session.setAttribute("USER", user); 
     } 
     log.debug("entered processFormSubmission, userName={}, password={}", 
       command.getUserName(), command.getPassword()); 
    } 

    @RequestMapping(value = "/logout", method = RequestMethod.GET) 
    public void logout(HttpSession session, HttpServletResponse response) 
      throws IOException { 
     session.invalidate(); 
     response.sendRedirect("login"); 
    } 

    private void validate(Login command, BindingResult result) { 

     ValidationUtils.rejectIfEmptyOrWhitespace(result, "userName", 
       "common.required"); 
     ValidationUtils.rejectIfEmptyOrWhitespace(result, "password", 
       "common.required"); 
    } 
} 

這裏是我的web.xml

<?xml version="1.0" encoding="UTF-8"?> 

<web-app version="2.4" 
     xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>app</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>app</servlet-name> 
     <url-pattern>/app/*</url-pattern> 
    </servlet-mapping> 

    <servlet> 
     <servlet-name>visitor</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>visitor</servlet-name> 
     <url-pattern>/visitor/*</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>sitemesh</filter-name> 
     <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>sitemesh</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter> 
     <filter-name>loginFilter</filter-name> 
     <filter-class>org.itax.calculator.web.filter.LoginFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>loginFilter</filter-name> 
     <servlet-name>app</servlet-name> 
    </filter-mapping> 


    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <jsp-config> 
     <taglib> 
      <taglib-uri>/spring</taglib-uri> 
      <taglib-location>/WEB-INF/spring-form.tld</taglib-location> 
     </taglib> 

     <taglib> 
      <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri> 
      <taglib-location>/WEB-INF/c.tld</taglib-location> 
     </taglib> 

     <taglib> 
      <taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri> 
      <taglib-location>/WEB-INF/fmt.tld</taglib-location> 
     </taglib> 
    </jsp-config> 

</web-app> 

但是當Im t rying訪問:http://localhost:8080/iTax/app/login

即時得到這些錯誤:

org.apache.jasper.JasperException: java.lang.NullPointerException 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:236) 
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:257) 
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1183) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:902) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.itax.calculator.web.filter.LoginFilter.doFilter(LoginFilter.java:32) 

root cause 

java.lang.NullPointerException 
    com.opensymphony.module.sitemesh.taglib.decorator.HeadTag.doEndTag(HeadTag.java:33) 
    org.apache.jsp.WEB_002dINF.jsp.login_jsp._jspx_meth_decorator_005fhead_005f0(login_jsp.java:515) 
    org.apache.jsp.WEB_002dINF.jsp.login_jsp._jspService(login_jsp.java:144) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:236) 
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:257) 
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1183) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:902) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.itax.calculator.web.filter.LoginFilter.doFilter(LoginFilter.java:32) 

的login.jsp

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<%@ include file="/WEB-INF/decorators/main.jsp" %> 

<html> 
<head><title><fmt:message key="login.title"/></title></head> 
<body> 
<form:form> 
    <table> 
     <tr> 
      <th><fmt:message key="user.userName"/>:</th> 
      <td> 
       <form:input path="userName"/> 
       <form:errors path="userName"/> 
      </td> 
     </tr> 
     <tr> 
      <th><fmt:message key="user.password"/>:</th> 
      <td> 
       <form:password path="password"/> 
       <form:errors path="password"/> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <input type="submit" value="<fmt:message key="login.btn.label"/>"/> 
      </td> 
     </tr> 
    </table> 
</form:form> 
</body> 
</html> 
+2

您沒有顯示login.jsp,並且顯然發生了異常。 – Bozho 2011-05-06 06:12:03

回答

4

這條線login.jsp看起來很可疑:

<%@ include file="/WEB-INF/decorators/main.jsp" %> 

你似乎包括您的SiteMesh裝飾器正在裝飾頁面內。這看起來像是關於SiteMesh如何工作的誤解。它採用JSP的HTML輸出,並使用裝飾JSP將其重新格式化爲裝飾規則。正在裝飾的頁面(在這種情況下爲login.jsp)應該不知道SiteMesh在那裏。

嘗試從login.jsp中刪除該行。

+0

是的,現在它的工作,我刪除它,工作正常。非常感謝。 – rokonoid 2011-05-10 12:58:20