我知道类似以下三行

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

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


当前回答

在servlet类中设置值和参数使用JSTL/Taglib在JSP中获取这些值和参数

这种方法的好处是代码也类似HTML密码

其他回答

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

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

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

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命名空间中的一些特殊属性;它可以用浏览器查看,也可以由设计师安全地调整。

支持宏以及国际化和本地化:

<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实现不太了解。

JSP2.0有一个名为“标记文件”的特性,您可以在没有外部Java代码和tld的情况下编写标记。您需要创建一个.tag文件并将其放入WEB-INF\tag中。您甚至可以创建一个目录结构来打包标记。

例如:

/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/selected文本操作,如format/inclusions/capital或甚至SQL标记select/update),传递所有类型的参数,例如Hashmap、访问会话、请求等。。。在您的标记文件中。

标记文件非常容易开发,因为在更改它们时不需要重新启动服务器,就像JSP文件一样。这使它们易于开发。

即使您使用Struts2这样的框架,它有很多好的标记,您可能会发现拥有自己的标记可以大大减少代码。您可以将标记参数传递给struts,并通过这种方式自定义框架标记。

您不仅可以使用标记来避免Java,还可以最小化HTML代码。当我看到页面中出现重复的代码时,我自己会尝试检查HTML代码并构建标记。

(即使您最终在JSP代码中使用Java(我希望不会),也可以将该代码封装在标记中。)

在MVC架构模式中,JSP表示视图层。在JSP中嵌入Java代码被认为是一种糟糕的做法。

您可以将JSTL、freeMarker和velocity与JSP一起用作“模板引擎”。

这些标记的数据提供者取决于您正在处理的框架。Struts 2和WebWork作为MVC模式的实现,使用OGNL“非常有趣的技术将Beans财产公开给JSP”。

无论您如何努力避免,当您与其他开发人员合作时,他们中的一些人仍然会选择scriptlet,然后将邪恶代码插入到项目中。因此,如果您真的想要减少scriptlet代码,那么在第一个标志处设置项目是非常重要的。有几种方法可以克服这个问题(包括其他提到的几种框架)。但是,如果您喜欢纯JSP方式,那么可以使用JSTL标记文件。这样做的好处是,您还可以为项目设置母版页,这样其他页面就可以继承母版页

在WEB-INF/标记下创建一个名为base.tag的母版页,内容如下

<%@tag description=“总体页面模板”pageEncoding=“UTF-8”%><%@attribute name=“title”fragment=“true”%><html><head><标题><jsp:invokefragment=“title”></jsp:invoke></title></head><body><div id=“page header”>....</div><div id=“page body”><jsp:doBody/></div><div id=“page footer”>.....</div></body></html>

在这个主页面上,我创建了一个名为“title”的片段,这样在子页面中,我可以在主页面的这个位置插入更多代码。此外,标记<jsp:doBody/>将被子页面的内容替换

在WebContent文件夹中创建子页面(child.jsp):

<%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%><t:基础><jsp:attribute name=“title”><bean:messagekey=“hello.world”/></jsp:attribute><jsp:body>[将您的孩子内容放在这里]</jsp:body></t:基础>

<t:base>用于指定要使用的母版页(此时为base.tag)。此处标记<jsp:body>中的所有内容将替换母版页上的<jsp:doBody/>。您的子页面还可以包含任何标记库,您可以像前面提到的其他页面一样正常使用它。但是,如果在这里使用任何scriptlet代码(<%=request.getParameter(“name”)%>…)并尝试运行此页面,您将得到一个JasperException,因为此处不允许脚本元素(&lt;%!,&lt;jsp:declaration,&lt!%=,&lt;jsp:expression,&lt:%,&lt,jsp:scriptlet)。因此,其他人无法将恶意代码包含到jsp文件中

从控制器调用此页面:

您可以从控制器轻松调用child.jsp文件。这也适用于struts框架