проблема при работе с пружинными mvc и sitemesh - PullRequest
2 голосов
/ 06 мая 2011

у меня ситема с пружиной работает. Вот мой сайтmesx.xml

<?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>

но когда я пытаюсь получить доступ: 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>

1 Ответ

4 голосов
/ 09 мая 2011

Эта строка в login.jsp выглядит подозрительно:

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

Вы, кажется, включили свой декоратор SiteMesh в оформляемую страницу.Это похоже на заблуждение о том, как работает SiteMesh.Он принимает вывод HTML вашего JSP и использует JSP декоратора для его преобразования в ваши правила оформления.Оформляемая страница (в данном случае login.jsp) не должна знать, что там находится SiteMesh.

Попробуйте удалить эту строку из login.jsp.

...