我应该使用 taglib 还是 HTML?Struts taglib的目的是什么?



在经历了PHP开发人员的大部分生活之后,我开始涉猎JSP。我对Java很熟悉,所以我开始了解Struts作为我选择的MVC框架。

我很难理解为什么我应该使用Struts标签库而不是标准的HTML?

<s:textfield id="username" />

<input type="text" id="username" name="username" />

概念上的区别是什么?为什么我应该使用标签库而不是HTML?在Struts和整个JSP社区中,是否有一种首选的方法?

struts2标签有两个主要目的:

  1. 主题(例如,"排放了什么")
  2. 框架集成(例如,值、验证)

Struts 2使用"themes"来决定面向视图标签的输出。例如,默认的"xhtml"主题将输入标记包装在表格行中,设置输入字段值,如果有字段验证错误,则显示字段验证错误,可能还有一些我不记得的其他事情。

如果您查看页面源代码,您可以准确地看到差异是什么,除了由后端功能确定的位,例如围绕验证消息的If/then。

一般来说,自定义标签允许您以任意方式抽象视图层功能。"首选方法"是不要手工操作,即使是最简单的功能,如设置操作的值和显示错误消息,也需要手工操作。

您可以通过查看它们的FreeMarker模板来查看自定义标记的作用(假设您没有使用Java标记)。你可以扩展这些模板,创建你自己的模板,等等,所有这些都在框架的范围内。

即使是对S2标记和主题文档的粗略检查也应该回答这个问题。

无法使用 HTML访问服务器数据;JSPTagLibraries的替代品是,而不是HTML,而是旧的(坏的)Scriptlet s。

所有结尾的将被转换为HTML,但是您需要一个中间层来允许您处理业务数据。

如何使用HTML读取服务器端值

长话短说:

曾经是 Servlet ,它的PrintWriter s输出HTML:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
    String myServerSideValue = "StackOverflow";
    response.setContentType("text/html");
    PrintWriter writer = response.getWriter();        
    writer.println("<html>");
    writer.println("<head>");
    writer.println("<title>Wait, what... a Servlet in 2013?!</title>");
    writer.println("</head>");
    writer.println("<body>");
    writer.println("<span>Hello " + myServerSideValue + "</span>");
    writer.println("</body>");
    writer.println("</html>");
}

显然是一场噩梦,导致某个聪明人发明了JSP s和Scriptlet s:

<html>
   <head>
      <title>Wait, what... Scriptlets in 2013?!</title>
   </head>
   <body>
      <span>Hello <%= myServerSideValue %> </span>
   </body>
</html>

TagLib s like JSTL出来了:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
   <head>
      <title>you <i>may</i> still needs JSTL with, for example, Spring MVC</title>
   </head>
   <body>
      <span>Hello <c:out value="myServerSideValue" /> </span>
   </body>
</html>

最后WebWork / StrutsOGNL带给了我们

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
   <head>
      <title>you still needs JSTL with, for example, Spring MVC</title>
   </head>
   <body>
      <span>Hello <s:property value="myServerSideValue" /> </span>
   </body>
</html>

Struts2标签中使用OGNLJSTL类似,但更强大Struts2中以多种方式(Validation, Theming等)完全集成

也许这个例子太nàive了,无法理解为什么应该使用Struts2 Tags而不是Scriptlets或其他TagLibs,但是当遇到更复杂的实际场景时,您将开始欣赏并最大限度地使用这个伟大的工具。

最新更新