【问题标题】:Model objects are null in jsp模型对象在jsp中为空
【发布时间】:2015-09-29 14:14:13
【问题描述】:

我正在使用 Spring Framkework 4.1.6.RELEASE。

我有一个休息控制器和一个普通控制器。 普通控制器给模型添加了一个对象,但是jsp中没有这个对象。

我做错了什么?

我尝试了两种不同的方法:

@Controller
@RequestMapping(value = "/mymapping")

public class StatusController {

    private Log LOG = LogFactory.getLog(StatusController.class); 

    @RequestMapping(method = GET)
    public ModelAndView myMethod1(final HttpServletRequest aRequest, final HttpServletResponse aResponse) {

        ModelAndView tempMAV = new ModelAndView("myjsp");
        tempMAV.addObject("test","test");
        return tempMAV;
    }       

    @RequestMapping(method = GET, value="2")
    public String method2(Model model) {
        model.addAttribute("test","test");
        return "myjsp";
    }       
}

在方法1中,jsp被显示,但变量“test”没有被填充。

test: ${test}

使用方法2我得到一个404,找不到jsp myjsp,因为路径

http://localhost:{...mypath...}/mymapping/WEB-INF/jsp/myjsp.jsp

不存在。

在我的 pom.xml 中我添加了:

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
</dependency>

我的 servlet 包含:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean> 

我的 jsp 以:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" version="2.0">
<jsp:directive.page language="java"
    contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" />
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>My Title</title>
</head>
<body>

<p> test: ${test}</p>

编辑

我的 web.xml:

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

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

<display-name>My display name</display-name>
<filter>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Expose request to current thread (required for session and request-scoping) -->
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            WEB-INF/config/spring-mvc-servlet.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

</web-app>

当我将 servlet 内容更改为:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>
    <property name="viewResolvers">
        <list>
            <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
                <property name="viewClass"
                    value="org.springframework.web.servlet.view.JstlView" />
                <property name="prefix" value="/WEB-INF/jsp/" />
                <property name="suffix" value=".jsp" />
            </bean>
        </list>
    </property>
</bean>

那么至少方法2再次起作用,这意味着它显示了jsp,但仍然没有填充变量test。

【问题讨论】:

  • 将其添加到问题描述中。我无法一次发布所有内容,因为 stackoverflow 不会告诉我在哪一行我没有正确转换代码。
  • 你能发布你的 web.xml 吗?
  • 感谢您添加所需的数据,您可以尝试使用我的答案中提供的代码吗?

标签: java spring jsp maven servlets


【解决方案1】:

对于你的第二个控制器方法,这样做:

@RequestMapping(value = "/method2",method = GET)
    public String method2(Model model) {
        model.addAttribute("test",new ObjectName());
        return "myjsp";
    }       

你必须明白 addAttribute 是用来绑定的,所以你可以添加 Model 类和其他东西。试试看。

【讨论】:

  • 嗯,我就是这样做的。我只返回了一个字符串,而不是一个对象。反正对象也没有出现在jsp中。
【解决方案2】:

在您的配置中将前缀更改为“/WEB-INF/jsp/”:

<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

你应该在之前访问你的控制器:

@Controller
@RequestMapping(value = "/mymapping")
public class StatusController {

    private Log LOG = LogFactory.getLog(StatusController.class); 

    @RequestMapping(value = "/method1", method = GET)
    public ModelAndView myMethod1(final HttpServletRequest aRequest, final HttpServletResponse aResponse) {

        ModelAndView tempMAV = new ModelAndView("myjsp");
        tempMAV.addObject("test","test");
        return tempMAV;
    }       

    @RequestMapping(value = "/method2",method = GET)
    public String method2(Model model) {
        model.addAttribute("test","test");
        return "myjsp";
    }       
}

访问 method1 尝试使用以下 URL:

http://localhost:port/contextPath/mymapping/method1

【讨论】:

  • 这并不能解决问题。现在method1也找不到jsp了。它说:“HTTP 状态 404 - /contextPath/mymapping/WEB-INF/jsp/myjsp.jsp”
  • 它试图找到jsp的路径是完全错误的。是的,404。
  • 你不应该这样访问/mymapping/WEB-INF/jsp/myjsp.jsp
  • 好吧,不是我在尝试。控制器正在这样做。
【解决方案3】:

GUISSOUMA Issam 建议使用 UrlBasedViewResolver:

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

这有助于使方法 2 起作用。

另外,我将以下代码添加到我的 web.xml 中,这使得变量被填充:

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>/WEB-INF/jsp/*</url-pattern>
</servlet-mapping>

我仍然不明白为什么在这种特定情况下我需要将 JspServlet 配置添加到 web.xml 中。在我们的另外两个项目中,我看到了相同的控制器方法等,但没有在 web.xml 中声明 JspServlet,没有它也可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2014-10-15
    • 2023-03-19
    • 2020-03-05
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多