rokonoid
rokonoid

Reputation: 23

problem while working with spring mvc and sitemesh

I have a sitemesh with spring working. Here is my sitemesh.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>

here is decorator.xml

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

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

and here is my controller:

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");
    }
}

and here is my 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>

but when Im trying to access : http://localhost:8080/iTax/app/login

Im getting these errors:

    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>

Upvotes: 2

Views: 6779

Answers (1)

skaffman
skaffman

Reputation: 403441

This line in login.jsp looks suspicious:

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

You seem to be including your SiteMesh decorator inside the page being decorated. This looks like a misconception about how SiteMesh works. It takes the HTML output of your JSP, and it uses the decorator JSP to reformat it to your decoration rules. The page being decorated (login.jsp in this case) should have no knowledge of SiteMesh being there.

Try removing that line from login.jsp.

Upvotes: 4

Related Questions