Springmvc controll 无法将值传递给 jsp



我试着学习springmvc。但当我开始的时候,我遇到了一个问题。

我认为这只是一个简单的问题。我在网上搜索,发现了很多例子。但我找不到原因。这是代码。

HomeControll.java

package cn.qingtianr.controll;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* Created by jack on 16-5-20.
*/
@Controller
public class HomeControll {
@RequestMapping("/")
public String index(ModelMap model){
String s = "hhh";
model.addAttribute("hello",s);
return "index";
}
}

index.jsp

<%--
Created by IntelliJ IDEA.
User: jack
Date: 16-5-20
Time: 下午6:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${hello}
</body>
</html>

web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>

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

hello-servlet.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<context:component-scan base-package="cn.qingtianr.controll"/>

<mvc:default-servlet-handler/>

<mvc:annotation-driven/>

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>

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>cn.qingtianr</groupId>
<artifactId>springmvctest</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>springmvctest Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>4.2.5.RELEASE</spring.version>
<spring-data.version>1.2.0.RELEASE</spring-data.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<finalName>springmvctest</finalName>
</build>
</project>

当我访问index.jsp时,我在浏览器上得到的是${hello}而不是hhh。也许我犯了一个低级错误。但我真的不知道。

有人能帮我吗?谢谢

看起来像是DispatcherServlet映射的旧SpringMVC问题。

您将servlet映射到/,这意味着它将获得其他servlet(包括默认容器servlet)无法解析的所有URL。一个常见的问题是Spring MVC DispatcherServlet永远不会接收到空的URL"/"(请参阅我的另一个答案以获得更详细的解释)。

因此,我假设您直接调用了index.jsp文件,而没有首先访问控制器。但是(当然)hello模型变量没有放入请求属性中,因此无法使用。

如何修复:

为了避免直接命中jsp文件,好的做法建议将它们放在WEB-INF文件夹下。这样,它们将永远不会被servlet容器作为服务器,并且只有在从控制器转发到时才会显示=>在WEB-INF/jsp/index.jsp下移动index.jsp,并相应地更改jspViewResolver配置中的<property name="prefix" value="/WEB-INF/jsp/"/>

然后使用参考帖子中的一个解决方案。我建议将DispatcherServlet映射到/*,并使用例如将静态资源移动到ResourceHttpRequestHandler处理的文件夹中

<mvc:resources mapping="/resources/**" location="/public-resources/"/>

当您使用xml配置时

试试这个:

之前添加此!DOCTYPE

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

打印值:

<c:out value="${hello}"></c:out>

完整的index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Title</title>
</head>
<body>
<c:out value="${hello}" ></c:out>
</body>
</html>

希望能有所帮助。

从弹簧配置中删除<mvc:default-servlet-handler/>。您不需要它,因为您的web.xml中已经有了SpringDispatcher,spring配置中也有了视图解析器

在请求映射中添加一个"/"以外的值。例如@RequestMapping("/blam")。(此url将为http://<host>/<context>/bram)。

不要使用"index.jsp"作为视图文件名。"index.jsp"是默认的欢迎文件名。

这对我有效:

  1. 在我的servlet配置中没有<mvc:default-servlet-handler/>
  2. 我的战争档案名为klabben.war(上下文为"klabben")
  3. @RequestMapping("/blam")
  4. 来自索引处理程序方法的return "blam.jsp
  5. 将index.jsp文件内容复制到blam.jsp
  6. 使用url"http://<host>/klabben/blam"显示"hello:sss"消息

注意:我对<mvc:default-servlet-handler/>的看法是错误的。它提供的价值与我想象的不同。

最新更新