【问题标题】:Can't use JSTL on a simple example不能在一个简单的例子中使用 JSTL
【发布时间】:2014-08-30 04:13:07
【问题描述】:

这是我目前的情况: 我使用以下命令从我的 shell 创建了一个 Maven 项目:

mvn archetype:generate -DgroupId=it.my.current.package.example -DartifactId=Example -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
mvn package

然后我打开 Eclipse,将项目作为 Maven 导入。我将这些依赖项添加到我的 pom.xml

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    <scope>provided</scope>
</dependency>

然后我创建了一个 JSP 和一个 Servlet。

我的 servlet 只是设置了一些变量,而我的 JSP 将它们与一些 JSTL 一起使用。

我在我的 JSP 上添加了这个标签:

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

而且我的 JSP 上的代码非常简单:

<c:forEach items="${requestScope.empList}" var="emp">
    <tr>
        <td><c:out value="${emp.id}"></c:out></td>
        <td><c:out value="${emp.name}"></c:out></td>
        <td><c:out value="${emp.role}"></c:out></td>
    </tr>
</c:forEach>

我的 Servlet 正在这样做:

List<Employee> empList = new ArrayList<Employee>();
Employee emp1 = new Employee();
emp1.setId(1); emp1.setName("Sam");emp1.setRole("Developer");
Employee emp2 = new Employee();
emp2.setId(2); emp2.setName("John");emp2.setRole("Manager");
empList.add(emp1);empList.add(emp2);
request.setAttribute("empList", empList);
RequestDispatcher rd = getServletContext().getRequestDispatcher("/home.jsp");
rd.forward(request, response);

Employee 是一个简单的 Bean。

当我尝试从我的 Servlet 运行这个应用程序时,它实际上在我的 JSP 上显示了这个:

${emp.id}      ${emp.name}      ${emp.role}

它没有显示我在 Servlet 上设置的值。

我对 JSTL 完全陌生,所以我首先在 Google 上搜索了我的问题。我尝试在我的$TOMCAT_HOME/lib 目录中添加jstl-1.2.jar,但没有成功。

那有什么问题呢?

编辑:我需要对容器和项目进行哪些配置才能运行 JSTL?我做的还不够吗?

【问题讨论】:

  • 简单的&lt;td&gt;${emp.id}&lt;/td&gt;怎么样
  • @ScaryWombat 的输出是一样的。好像tomcat不能识别JSTL吧?
  • 查看我的更新答案

标签: java jsp maven tomcat jstl


【解决方案1】:

我认为这不是 JSTL 的问题。这个符号:${emp.role} 是 EL(表达式语言),它不起作用。

您没有在 JSP 文件中设置 isELIgnored="true" 吗?像这样:

<%@ page isELIgnored="true" %>

或者在web.xml:

<el-ignored>true</el-ignored>

默认应该是false,但是如果你使用的servlet版本早于2.4那么默认是true,所以在这种情况下你需要在web.xml中将它设置为false

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>true</el-ignored>
    </jsp-property-group>
</jsp-config>

您在依赖项中有版本3.1,但在web.xml 文件中使用2.3 版本。要使用 Servlet 3.1,请尝试将您的 web.xml 更改为:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    rest of the TAGs
</web-app>

同时删除:

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

(适用于2.3版本)

【讨论】:

  • 我已经尝试将您的代码添加到我的web.xml 文件中,但它不会“编译”。是因为我在这里使用的吗? &lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" &gt;
  • 看起来你使用的是默认禁用EL的旧servlet,请尝试在JSP文件的开头添加&lt;%@ page isELIgnored="false" %&gt;
  • 但是如果你注意到我在pom.xml 中添加了哪些依赖项,我使用的是 servlet 版本 3.1.0...无论如何我都会尝试一下。
  • 谢谢你,迈克,它成功了。那么一开始有什么问题呢?我第一次创建项目时是否使用了错误的原型?在我将 javax.servlet 依赖项添加到较新版本之后看到这个真的很奇怪......
  • @abierto 只需将web.xml 更改为我已发布的&lt;web-app...。没有&lt;jsp-config&gt;。它应该将servlet 版本更改为3.1,其中EL 默认是打开的,因此您不需要在每个JSP 文件中激活它。就像这里create-web-application-project-with-maven-example 他们在Moreover, we must change our web.xml file to use Servlet 3.0: 那里一样(你可以将它更改为3.1&lt;web-app&gt; 我发布了)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多