我是Java EE的新手,我知道如下三行
<%= x+1 %> <%= request.getParameter("name") %> <%! counter++; %>
是一种老式的编码方式,在JSP版本2中,有一种方法可以避免JSP文件中的Java代码。什么是可选的JSP2行,这种技术叫什么?
pzfprimi1#
**如果有人真的反对使用多种语言编程,我建议使用GWT。理论上,您可以避免使用所有JavaScript和HTML元素,因为GoogleToolkit将所有客户端和共享代码转换为JavaScript。你不会有问题,所以你有一个没有任何其他语言编码的Web服务。您甚至可以使用扩展(smartGWT或Vaadin)提供的一些默认CSS。您不需要学习许多注解。
当然,如果你愿意,你可以深入到代码的深处,注入JavaScript并丰富HTML页面,但如果你愿意的话,你真的可以避免它,结果会和其他框架一样好。我认为这值得一试,而且基本的GWT有很好的文档记录。当然,许多其他程序员在此描述或推荐了几种其他解决方案。GWT适用于那些真正不想处理web部件或将其最小化的人。
cgfeq70w2#
通过将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" %>
nwwlzxa73#
正如许多答案所说,使用JSTL或创建您自己的自定义标记。Here是关于创建自定义标记的一个很好的解释。
tjjdgumg4#
这里的很多答案都是“使用框架”路线。这没有错。然而,我认为这并不能真正回答您的问题,因为框架可能使用或不使用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动态地提供您喜欢的任何类型的内容。它们是几乎所有事情背后的主要技术——java web-JSP实际上只是servlet的HTML模板。因此,您应该在JSP中放入多少java的答案是“尽可能少”。我的JSP中当然有java,但它完全由标记库定义、会话和客户端变量以及封装服务器端对象的bean组成。我的HTML中的<%>标记几乎完全是属性调用或变量表达式。罕见的例外包括与单个页面相关的超特定计算,并且不太可能重复使用;来自页面特定问题的错误修复仅适用于一个页面;最后一分钟的连接和算法源于限制在单个页面范围内的不寻常需求;以及其他类似情况。在一个由150万行、3000个JSP和5000个类组成的代码集中,可能有100个这样独特的片段示例。在类或标记库定义中进行这些更改是完全可能的,但由于每个情况的特殊性,它会非常复杂,编写和调试需要更长时间,因此需要更多时间才能到达我的用户。这是一个判断电话。但是请不要搞错,您不能用“无java”来编写任何含义的JSP,您也不想这样做。
zynd9foi5#
1.在servlet类中设置值和参数1.使用JSTL/Taglib在JSP中获取这些值和参数这种方法的好处是您的代码也是类似HTML的代码!
wnavrhmk6#
JSP2.0有一个名为**“标记文件”***的特性,您可以在不使用外部Java代码和tld的情况下编写标记。您需要创建一个.tag文件并将其放入WEB-INF\tags中。您甚至可以创建一个目录结构来打包标签。例如:
tld
.tag
WEB-INF\tags
/WEB-INF/tags/html/label.tag <%@tag description="Rensders a label with required css class" pageEncoding="UTF-8"%> <%@attribute name="name" required="true" description="The label"%> <label class="control-label control-default" id="${name}Label">${name}</label>
像这样使用它
<%@ taglib prefix="h" tagdir="/WEB-INF/tags/html"%> <h:label name="customer name" />
此外,您还可以轻松读取标记体:
/WEB-INF/tags/html/bold.tag <%@tag description="Bold tag" pageEncoding="UTF-8"%> <b> <jsp:doBody/> </b>
使用它:
<%@ taglib prefix="h" tagdir="/WEB-INF/tags/bold"%> <h:bold>Make me bold</h:bold>
示例非常简单,但是您可以在这里执行许多复杂的任务。请考虑您可以使用其他标记(例如:JSTL,它具有控制标记,如if/forEcah/chosen,文本操作,如E15D1E,甚至SQL标记select/update),在标记文件中传递所有类型的参数,例如Hashmap,访问session,request。
JSTL
if/forEcah/chosen
select/update
Hashmap
session
request
标记文件非常容易开发,因为您不需要在更改它们时重新启动服务器,就像JSP文件一样。这使得它们易于开发。
即使您使用Struts 2这样的框架,它有很多好的标记,您可能会发现拥有自己的标记可以大大减少代码。您可以将标记参数传递给struts,这样就可以自定义框架标记。使用标记不仅可以避免Java,还可以最小化HTML代码。当我看到页面中出现重复的代码时,我自己就尝试检查HTML代码并构建标记。(即使您最终在JSP代码中使用Java(我希望不是这样),您也可以将代码封装在标记中。)
0mkxixxg7#
我的朋友,这些都没用了。我的建议是将视图(CSS、HTML、JavaScript等)与服务器分离。在我的例子中,我使用Angular处理视图,所有需要的数据都是使用REST服务从服务器获取的。相信我,这将改变你的设计方式。
rvpgvaaj8#
使用 Backbone.js 。js或类似AngularJS的JavaScript框架,用于UI设计并使用REST API获取数据。这将从UI中完全删除Java依赖项。
w6mmgewl9#
使用Scriptlet是一种非常古老的方法,不推荐使用。如果您想在JSP页面中直接输出内容,只需使用表达式语言(EL)和JSTL。还有其他选项,例如使用模板引擎,如Velocity、Freemarker、Thymeleaf等。但使用简单的JSP和EL和JSTL在大多数情况下都符合我的目的,对于初学者来说,这似乎也是最简单的。此外,请注意,在视图层中执行业务逻辑不是最佳实践。您应该在服务层中执行业务逻辑,并通过控制器将输出结果传递给视图。
bpzcxfmw10#
如果在Java web应用程序中使用以下内容,则可以从JSP文件的前台删除Java代码。1.将MVC架构用于web应用程序1.使用JSP标记a、 标准标签b、 自定义标签1.表达语言
qlvxas9a11#
如何避免JSP文件中的Java代码
除了表达式语言(EL),您还可以使用标签库标记,如JSTL。但是EL不能很好地与JSP配合使用。因此,最好完全删除JSP并使用Facelets。
Facelets是为**JSF(Java服务器Faces)**设计的第一种非JSP页面声明语言,与JSP相比,它为JSF开发人员提供了更简单、更强大的编程模型。它解决了用于web应用程序开发的JSP中出现的不同问题。
Source
qaxu7uf212#
从技术上讲,JSP在运行时都转换为servlet。
JSP最初是为了将业务逻辑和设计逻辑解耦而创建的,遵循MVC模式。因此,从技术上讲,JSP是运行时的所有Java代码。但为了回答这个问题,标记库通常用于将逻辑(删除Java代码)应用到JSP页面。
ppcbkaq513#
当然,将<%! counter++; %>替换为事件生产者-消费者体系结构,在该体系结构中,业务层被通知需要增加计数器,并做出相应React,并通知演示者,以便他们更新视图。涉及到许多数据库事务,因为将来我们需要知道计数器的新值和旧值,谁增加了它,以及考虑了什么目的。显然,这涉及到序列化,因为层是完全解耦的。您将能够通过RMI、IIOP和SOAP增加计数器。但只需要HTML,您不需要实现,因为这是一个非常普通的情况。您的新目标是在新的闪亮E7 64GB RAM服务器上达到每秒250个增量。我有超过20年的编程经验,大多数项目在第六节之前都失败了:可重用性、可替换性、面向对象能力、可调试性、可测试性、可维护性甚至都是必要的。其他项目,由只关心功能的人运行,非常成功。此外,在项目中过早实现的僵硬对象结构使代码无法适应规范中的剧烈变化(也称为敏捷)。因此,我认为在项目早期或在没有特别要求时定义“层”或冗余数据结构的活动是拖延。
<%! counter++; %>
bbuxkriu14#
Python世界的一个好主意是:模板属性语言;TAL是由Zope引入的(因此也称为“Zope页面模板”,ZPT),是一个标准,在PHP、XSLT和Java中也有实现(我使用了Python/Zope和PHP版本)。在这类模板语言中,上面的一个示例可能如下所示:
<table> <tr tal:repeat="product products"> <td tal:content="product/name">Example product</td> <td tal:content="product/description">A nice description</td> <td tal:content="product/price">1.23</td> </tr> </table>
代码看起来像普通的HTML(或XHTML),加上XML名称空间中的一些特殊属性;它可以通过浏览器查看,并由设计师进行安全调整。支持宏和internationalisation and localisation:
<h1 i18n:translate="">Our special offers</h1> <table> <tr tal:repeat="product products"> <td tal:content="product/name" i18n:translate="">Example product</td> <td tal:content="product/description" i18n:translate="">A nice description</td> <td tal:content="product/price">1.23</td> </tr> </table>
如果内容的翻译可用,则使用它们。不过,我对Java implementation不太了解。
ia2d9nvy15#
在JSP中使用Scriptlet不是一个好的实践。相反,您可以使用:1.JSTL标签1.EL表达式1.自定义标签-您可以定义自己要使用的标签。请参阅:1.http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html1.EL
30条答案
按热度按时间pzfprimi1#
**如果有人真的反对使用多种语言编程,我建议使用GWT。理论上,您可以避免使用所有JavaScript和HTML元素,因为GoogleToolkit将所有客户端和共享代码转换为JavaScript。你不会有问题,所以你有一个没有任何其他语言编码的Web服务。您甚至可以使用扩展(smartGWT或Vaadin)提供的一些默认CSS。您不需要学习许多注解。
当然,如果你愿意,你可以深入到代码的深处,注入JavaScript并丰富HTML页面,但如果你愿意的话,你真的可以避免它,结果会和其他框架一样好。我认为这值得一试,而且基本的GWT有很好的文档记录。
当然,许多其他程序员在此描述或推荐了几种其他解决方案。GWT适用于那些真正不想处理web部件或将其最小化的人。
cgfeq70w2#
通过将JSTL标记与EL表达式一起使用,可以避免这种情况。在JSP页面中放置以下内容:
nwwlzxa73#
正如许多答案所说,使用JSTL或创建您自己的自定义标记。Here是关于创建自定义标记的一个很好的解释。
tjjdgumg4#
这里的很多答案都是“使用框架”路线。这没有错。然而,我认为这并不能真正回答您的问题,因为框架可能使用或不使用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动态地提供您喜欢的任何类型的内容。它们是几乎所有事情背后的主要技术——java web-JSP实际上只是servlet的HTML模板。
因此,您应该在JSP中放入多少java的答案是“尽可能少”。我的JSP中当然有java,但它完全由标记库定义、会话和客户端变量以及封装服务器端对象的bean组成。我的HTML中的<%>标记几乎完全是属性调用或变量表达式。罕见的例外包括与单个页面相关的超特定计算,并且不太可能重复使用;来自页面特定问题的错误修复仅适用于一个页面;最后一分钟的连接和算法源于限制在单个页面范围内的不寻常需求;以及其他类似情况。在一个由150万行、3000个JSP和5000个类组成的代码集中,可能有100个这样独特的片段示例。在类或标记库定义中进行这些更改是完全可能的,但由于每个情况的特殊性,它会非常复杂,编写和调试需要更长时间,因此需要更多时间才能到达我的用户。这是一个判断电话。但是请不要搞错,您不能用“无java”来编写任何含义的JSP,您也不想这样做。
zynd9foi5#
1.在servlet类中设置值和参数
1.使用JSTL/Taglib在JSP中获取这些值和参数
这种方法的好处是您的代码也是类似HTML的代码!
wnavrhmk6#
JSP2.0有一个名为**“标记文件”***的特性,您可以在不使用外部Java代码和
tld
的情况下编写标记。您需要创建一个.tag
文件并将其放入WEB-INF\tags
中。您甚至可以创建一个目录结构来打包标签。例如:
像这样使用它
此外,您还可以轻松读取标记体:
使用它:
示例非常简单,但是您可以在这里执行许多复杂的任务。请考虑您可以使用其他标记(例如:
JSTL
,它具有控制标记,如if/forEcah/chosen
,文本操作,如E15D1E,甚至SQL标记select/update
),在标记文件中传递所有类型的参数,例如Hashmap
,访问session
,request
。标记文件非常容易开发,因为您不需要在更改它们时重新启动服务器,就像JSP文件一样。这使得它们易于开发。
即使您使用Struts 2这样的框架,它有很多好的标记,您可能会发现拥有自己的标记可以大大减少代码。您可以将标记参数传递给struts,这样就可以自定义框架标记。
使用标记不仅可以避免Java,还可以最小化HTML代码。当我看到页面中出现重复的代码时,我自己就尝试检查HTML代码并构建标记。
(即使您最终在JSP代码中使用Java(我希望不是这样),您也可以将代码封装在标记中。)
0mkxixxg7#
我的朋友,这些都没用了。我的建议是将视图(CSS、HTML、JavaScript等)与服务器分离。
在我的例子中,我使用Angular处理视图,所有需要的数据都是使用REST服务从服务器获取的。
相信我,这将改变你的设计方式。
rvpgvaaj8#
使用 Backbone.js 。js或类似AngularJS的JavaScript框架,用于UI设计并使用REST API获取数据。这将从UI中完全删除Java依赖项。
w6mmgewl9#
使用Scriptlet是一种非常古老的方法,不推荐使用。如果您想在JSP页面中直接输出内容,只需使用表达式语言(EL)和JSTL。
还有其他选项,例如使用模板引擎,如Velocity、Freemarker、Thymeleaf等。但使用简单的JSP和EL和JSTL在大多数情况下都符合我的目的,对于初学者来说,这似乎也是最简单的。
此外,请注意,在视图层中执行业务逻辑不是最佳实践。您应该在服务层中执行业务逻辑,并通过控制器将输出结果传递给视图。
bpzcxfmw10#
如果在Java web应用程序中使用以下内容,则可以从JSP文件的前台删除Java代码。
1.将MVC架构用于web应用程序
1.使用JSP标记
a、 标准标签
b、 自定义标签
1.表达语言
qlvxas9a11#
如何避免JSP文件中的Java代码
除了表达式语言(EL),您还可以使用标签库标记,如JSTL。但是EL不能很好地与JSP配合使用。因此,最好完全删除JSP并使用Facelets。
Facelets是为**JSF(Java服务器Faces)**设计的第一种非JSP页面声明语言,与JSP相比,它为JSF开发人员提供了更简单、更强大的编程模型。它解决了用于web应用程序开发的JSP中出现的不同问题。
Source
qaxu7uf212#
从技术上讲,JSP在运行时都转换为servlet。
JSP最初是为了将业务逻辑和设计逻辑解耦而创建的,遵循MVC模式。因此,从技术上讲,JSP是运行时的所有Java代码。
但为了回答这个问题,标记库通常用于将逻辑(删除Java代码)应用到JSP页面。
ppcbkaq513#
当然,将
<%! counter++; %>
替换为事件生产者-消费者体系结构,在该体系结构中,业务层被通知需要增加计数器,并做出相应React,并通知演示者,以便他们更新视图。涉及到许多数据库事务,因为将来我们需要知道计数器的新值和旧值,谁增加了它,以及考虑了什么目的。显然,这涉及到序列化,因为层是完全解耦的。您将能够通过RMI、IIOP和SOAP增加计数器。但只需要HTML,您不需要实现,因为这是一个非常普通的情况。您的新目标是在新的闪亮E7 64GB RAM服务器上达到每秒250个增量。我有超过20年的编程经验,大多数项目在第六节之前都失败了:可重用性、可替换性、面向对象能力、可调试性、可测试性、可维护性甚至都是必要的。其他项目,由只关心功能的人运行,非常成功。此外,在项目中过早实现的僵硬对象结构使代码无法适应规范中的剧烈变化(也称为敏捷)。
因此,我认为在项目早期或在没有特别要求时定义“层”或冗余数据结构的活动是拖延。
bbuxkriu14#
Python世界的一个好主意是:模板属性语言;TAL是由Zope引入的(因此也称为“Zope页面模板”,ZPT),是一个标准,在PHP、XSLT和Java中也有实现(我使用了Python/Zope和PHP版本)。在这类模板语言中,上面的一个示例可能如下所示:
代码看起来像普通的HTML(或XHTML),加上XML名称空间中的一些特殊属性;它可以通过浏览器查看,并由设计师进行安全调整。
支持宏和internationalisation and localisation:
如果内容的翻译可用,则使用它们。
不过,我对Java implementation不太了解。
ia2d9nvy15#
在JSP中使用Scriptlet不是一个好的实践。
相反,您可以使用:
1.JSTL标签
1.EL表达式
1.自定义标签-您可以定义自己要使用的标签。
请参阅:
1.http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
1.EL