我知道类似以下三行

<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>

是一种老式的编码方式,在JSP版本2中存在一种避免JSP文件中出现Java代码的方法。什么是可选的JSP2行,这种技术叫什么?


当前回答

JSTL为条件、循环、集合、get等提供标记。例如:

<c:if test="${someAttribute == 'something'}">
   ...
</c:if>

JSTL与请求属性一起工作——它们通常由Servlet在请求中设置,Servlet转发到JSP。

其他回答

通过将JSTL标记与EL表达式一起使用,可以避免这种情况。在JSP页面中放置以下内容:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

这里的很多答案都是“使用框架”。这没有错。然而,我认为这并不能真正回答您的问题,因为框架可能使用JSP,也可能不使用JSP,它们的设计也不是以消除JSP中的java使用为主要目标。对于您的问题“我如何避免在JSP中使用Java”,唯一好的答案是:您不能。这就是JSP的用途——使用Java来呈现带有动态数据/逻辑的HTML。接下来的问题可能是,我应该在JSP中使用多少java。在我们回答这个问题之前,您还应该思考,“我需要使用JSP来使用Java构建web内容吗?”最后一个问题的答案是,不需要。使用Java开发面向web的应用程序时,有许多替代JSP的方法。举个例子,Struts并不强迫你使用JSP——别误会,你可以使用它们,很多实现也可以,但你并不一定要这样做。Struts甚至不强迫你使用任何HTML。JSP也不会,但老实说,不生成HTML的JSP有点奇怪。众所周知,Servlet允许您通过HTTP动态地提供任何类型的内容。它们是几乎所有javaweb-JSP背后的主要技术——实际上,JSP只是servlet的HTML模板。因此,您应该在JSP中放入多少java的答案是“尽可能少”。我的JSP中当然有java,但它只包含标记库定义、会话和客户端变量以及封装服务器端对象的bean。HTML中的<%%>标记几乎完全是属性调用或变量表达式。罕见的例外情况包括与单个页面相关的超特定计算,且不太可能重复使用;仅适用于一个页面的页面特定问题导致的错误修复;最后一分钟的连接和运算源于不寻常的要求,其范围仅限于单个页面;以及其他类似情况。在一个150万行、3000个JSP和5000个类的代码集中,可能有100个这样的独特片段的实例。在类或标记库定义中进行这些更改是完全可能的,但由于每种情况的特殊性,它会变得异常复杂,编写和调试需要更长的时间,因此需要更多的时间才能与我的用户联系。这是一个判断。但是不要搞错,你不能用“no java”来编写任何意义的JSP,你也不想这样做。

使用Scriptlets是一种非常古老的方法,不建议使用。如果您想在JSP页面中直接输出一些内容,只需将表达式语言(EL)与JSTL一起使用即可。

还有其他选项,例如使用Velocity、Freemark、Thymelaf等模板引擎。但在大多数情况下,将普通JSP与EL和JSTL一起使用符合我的目的,对于初学者来说,这似乎也是最简单的。

此外,请注意,在视图层中执行业务逻辑不是最佳实践。您应该在服务层中执行业务逻辑,并通过控制器将输出结果传递给视图。

您提出了一个很好的问题,虽然得到了很好的答案,但我建议您取消JSP。过时的技术终将消亡。使用现代方法,如模板引擎。您将有非常清晰的业务层和演示层的分离,并且模板中肯定没有Java代码,因此您可以直接从web演示编辑软件生成模板,在大多数情况下利用WYSIWYG。

当然,不要使用过滤器和前后处理,否则您可能会遇到支持/调试困难,因为您始终不知道变量从何处获得值。

经验表明,JSP有一些缺点,其中之一是很难避免将标记与实际代码混合。

如果可以,那么可以考虑使用专门的技术来完成您需要做的事情。在JavaEE6中有JSF2.0,它提供了许多不错的功能,包括通过#{bean.method(argument)}方法将Javabean与JSF页面粘合在一起。