JSTL提交带有条件和相对URL的表单不起作用

时间:2012-08-31 07:46:37

标签: jsp jstl jsp-tags

以下是创建或更新Post对象的表单(我也使用spring form标签):

<sf:form method="<c:choose><c:when test="${post.id==0}">post</c:when><c:otherwise>put</c:otherwise></c:choose>" commandName="post">
    Title:<sf:input path="title" /><sf:errors path="title" /><br />
    Body:<sf:textarea path="body" cols="70" rows="6" /><sf:errors path="body" /><br />
</sf:form>

post.id==0时,表示要创建此帖子,而表单的方法应为“POST”,否则更新后方法将为“PUT”。

但上面的代码会导致异常:

org.apache.jasper.JasperException: /WEB-INF/jsp/posts/_form.jsp (line: 5, column: 41) Unterminated &lt;sf:form tag

问题是什么,如何解决?


更新

应采取的行动:

<c:url value="/posts/" /> for create and 
<c:url value="/posts/${post.id}/" /> for update.

然后,最终操作将是/appcontext/posts

/appcontext/posts/1

UPDATE2:

我可以使用:

${post.id == 0 ? '/posts/' : '/posts/${post.id}'}

但是,请注意网址中的“/”,它将与主机相关。

也就是说,表单操作将是:

http://localhost/posts

虽然我希望它是:

http://localhost/context/posts

这就是为什么我使用<c:url>来为我添加上下文。

我想这样:

${post.id == 0 ? '<c:url value="/posts/" />' : '<c:url value="/posts/${post.id}"/>'}

哪个不起作用。

1 个答案:

答案 0 :(得分:1)

您在其他标记的属性中使用标记。 "是嵌套的。

试试这个:

 <sf:form method="${post.id == 0 ? 'post' : 'put'}" commandName="post"
          action="${post.id == 0 ? './posts/' : './posts/${post.id}'}">
    ...

    <input type="submit" value="Submit" name="submit" />
    or
    <a href="#" onClick="submit();">submit with link and JavaScript</a>

 </sf:form>


 <c:url value="${post.id == 0 ? './posts/' : './posts/${post.id}'}" var="url">
 </c:url>

 <a href="${url}">Huhu ein Link</a>

如果您使用./,它将引用相同的路径。您还可以通过request.getContextPath()JSP Page中的Servlet获取上下文路径。

看看here

> ${post.id == 0 ? '<c:url value="/posts/" />' : '<c:url
> value="/posts/${post.id}"/>'}

这也行不通,它也会再次嵌套。请阅读Java Tutorial