2016-08-14 50 views
0

所以,我想学习一些Spring MVC,我尝试的第一个教程有一个model.addAttribute("printme", "From spring");和JSP a ${printme}JSP EL找不到requestScope变量?

我的控制很简单:

@RequestMapping(value = "index", method = RequestMethod.GET) 
public String index(Model modelMap) { 
    System.out.println("on method"); 
    modelMap.addAttribute("printme", "Hello Spring FROM INDEX !!"); 
    return "index"; 
} 

当我运行它不工作的代码,所以我开始加入到JSP。

我结束了这个在身体:

 <h1> 
      ${param.printme} 
      <br /> 
      ${printme} 
      <br /> 
      ${requestScope.printme} 
      <br /> 
      <%=request.getParameter("printme")%> 
      <br /> 
      <%=request.getAttribute("printme")%> 
      <br /> 
      <%=pageContext.findAttribute("printme")%> 
     </h1> 

和我的输出源是这样的:

<h1> 

      <br /> 

      <br /> 
      Hello Spring FROM INDEX !! 
      <br /> 
      null 
      <br /> 
      Hello Spring FROM INDEX !! 
      <br /> 
      Hello Spring FROM INDEX !! 
     </h1> 

我预计param.printme我空字符串,以及空从request.getParameter()

不应该${printme}搜索requestScope并找到它?

不宜${printme}是相同的

  • ${requestScope.printme}
  • <%=requestScope.getAttribute("printme")%>
  • <%=pageContext.findAttribute("printme")%>

这是怎么回事,为什么不是${printme}找到属性?

我知道我可以继续使用${requestScope.printme},但它更冗长,我想知道为什么它的行为是这样的。

万一它很重要我使用Tomcat7.0.52,Spring 4.0 xsds和java ee 3.0 xsds。

回答

1

我有以下简单的项目:

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
          http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>biz.tugay</groupId> 
    <artifactId>smvcelex</artifactId> 
    <packaging>war</packaging> 

    <version>1.0-SNAPSHOT</version> 
    <name>smvcelex Maven Webapp</name> 
    <url>http://maven.apache.org</url> 

    <dependencies> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.el</groupId> 
      <artifactId>javax.el-api</artifactId> 
      <version>3.0.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.0.5.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>4.0.5.RELEASE</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>smvcelex</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.eclipse.jetty</groupId> 
       <artifactId>jetty-maven-plugin</artifactId> 
       <version>9.2.1.v20140609</version> 
      </plugin> 
     </plugins> 
    </build> 

    <properties> 
     <maven.compiler.source>1.7</maven.compiler.source> 
     <maven.compiler.target>1.7</maven.compiler.target> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

</project> 

的web.xml

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

    <servlet> 
     <servlet-name>springDispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/servletContext.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>springDispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <jsp-config> 
     <jsp-property-group> 
      <url-pattern>*.jsp</url-pattern> 
      <url-pattern>*.jspf</url-pattern> 
      <page-encoding>UTF-8</page-encoding> 
      <scripting-invalid>true</scripting-invalid> 
      <trim-directive-whitespaces>true</trim-directive-whitespaces> 
      <default-content-type>text/html</default-content-type> 
     </jsp-property-group> 
    </jsp-config> 

</web-app> 

servletContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> 

    <bean id="sampleController" class="biz.tugay.SampleController"/> 

    <bean id="viewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"/> 

</beans> 

SampleController.java

package biz.tugay; 

/* User: [email protected] Date: 2016/08/16 */ 


import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

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

    @RequestMapping(value = "", method = RequestMethod.GET) 
    public String indexController(Model model) { 
     model.addAttribute("printme", "Hello Spring FROM INDEX !!"); 
     return "index.jsp"; 
    } 
} 

最后索引。JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"/> 
    <title>Hello</title> 
</head> 
<body> 
    ${printme} 
</body> 
</html> 

当我访问本地主机:8080我会看到的文字

Hello Spring FROM INDEX !! 

就好了..

请与此一比较你的项目,提供额外的代码,并且,如果问需要。

+1

嗯,我删除了那个有缺陷的项目,所以我无法再比较我所拥有的和您提供的内容。然而,使用它,它工作得很好......我知道我没有明确声明控制器类是一个bean的配置, (注意:我用netbeans,而不是maven) 我仍然试图找出什么xml位控制什么,我有一个上下文:annotation-config(我认为我没有正确使用)上下文:组件扫描与适当的基础包和mvc:注释驱动... 标记你的是正确的,因为它得到预期的结果。 – MatrixPeckham

+0

@MatrixPeckham这可能会帮助你:http://stackoverflow.com/questions/35807056/how-many-ways-are-there-to-configure-the-弹簧框架 - 什么 - 是最differen –

-3

它看起来像我没有jstl在您的jsp文件的顶部引用。美元符号是jstl速记。确保你的jsp文件的顶部有以下内容。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 
+0

对不起,这个“答案”完全是无稽之谈。要了解JSTL和EL究竟是什么,请访问http://stackoverflow.com/tags/jstl/info和http://stackoverflow.com/tags/el/info – BalusC