【问题标题】:Should I use taglib or HTML? What's the purpose of Struts taglib?我应该使用 taglib 还是 HTML? Struts taglib 的目的是什么?
【发布时间】:2013-04-30 12:32:58
【问题描述】:

在经历了作为 PHP 开发人员的大部分时间之后,我开始涉足 JSP。我对 Java 很满意,所以我开始了解 Struts 作为我选择的 MVC 框架。

我无法理解为什么应该使用 Struts taglib 而不是标准 HTML?

<s:textfield id="username" />

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

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

【问题讨论】:

  • 感谢所有为这个最基本的问题提供答案和见解的人。感谢您的反馈。

标签: jsp struts2


【解决方案1】:

Struts 2 标签有两个主要用途:

  1. 主题化(例如,“发出了什么”)
  2. 框架集成(例如,值、验证)

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

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

一般来说,自定义标签允许您以任意方式抽象视图层功能。 “首选方法”是不要手动做任何事情,这是您需要做的,以便复制最简单的功能,例如从操作中设置值和显示错误消息。

您可以通过查看自定义标签的 FreeMarker 模板来了解自定义标签的作用(假设您没有使用 Java 标签)。您可以在框架范围内扩展这些模板、创建自己的模板等。

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

【讨论】:

  • 在基于 Struts 编写自己的应用程序时,事实上的方法是使用 Strut taglib,然后适当地对其应用主题吗?
  • @AndrewWeir ... 是的,您通常会使用 S2 标签,尤其是 UI 标签。转过头来:为什么您使用现有的框架功能,而是自行开发或全部手动完成?
  • 它可能是超出某些应用程序需要的语言功能。 JSP 和 Tomcat 已经定位到企业级,在遇到问题之前不需要过于复杂。顺便说一句,文档是非常随意的,并且在谈到使用 Struts 的“如何做”某事时并不是很清楚。我觉得浏览它不是很简洁或有帮助。
  • @AndrewWeir 很有趣,因为教程展示了标签的用法。您始终可以针对特定文档问题提交 JIRA 票证,或提交 CLA 并自行编辑文档以帮助解决问题。我想我并没有发现任何关于填写表单字段值或显示验证错误的“过于复杂”的东西,但是 YMMV。
  • @AndrewWeir 几乎每个 Java 风格的 Web 框架都有一组自定义标签。自定义标签允许在视图层进行抽象,而抽象通常是一件好事。几次我使用 PHP 时,我仍然使用方法来包装重复的 HTML 和样板文件,如表单标签、验证等。手动完成这种工作没有任何意义。
【解决方案2】:

pure HTML 无法访问服务器数据; JSP 内的TagLibraries 的替代品不是 HTML,而是旧的(和坏的)Scriptlets。

最后的所有内容都将转换为HTML,但您需要一个中间层来允许您处理业务数据。

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

长话短说:

曾经是Servlet,其PrintWriters 输出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>");
}

显然是一场噩梦,导致一些聪明人发明了JSPs 和Scriptlets:

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

然后TagLibs像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更强大完全集成 在几个方面(ValidationTheming 等)。

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

【讨论】:

  • Scriptlets 在你使用 jsp 标签时仍然有用,它们还没有被取消。
  • 是的,但根本问题是:为什么要使用 JSP 标签(遗留应用维护除外)?
  • 这是一个反问句,除非 JSP 规范支持它。但是如果你想在奔驰上开车,那么最好使用 taglibs。
  • Struts 标签是 JSP 标签,所以我不确定我是否遵循您的评论,@AndreaLigios。 JSTL 和 JSP EL 不如 OGNL 强大,但这并不一定是坏事。此外,JSTL 和 JSP EL 通常具有比 OGNL 更好的工具支持。
  • @AndreaLigios 哈哈!够公平的!
猜你喜欢
  • 2011-04-30
  • 2013-06-18
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多