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

时间:2013-04-30 12:32:58

标签: jsp struts2

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

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

<s:textfield id="username" />

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

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

2 个答案:

答案 0 :(得分:3)

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

  1. 主题(例如,“发出的是什么”)
  2. 框架集成(例如,值,验证)
  3. Struts 2使用“themes”来确定面向视图的标记的输出。例如,默认的“xhtml”主题将输入标签包装在表格行中,设置输入字段值,显示字段验证错误(如果有),以及可能还有一些我不记得的事情。

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

    通常,自定义标记允许您以任意方式抽象视图层功能。 “首选方法”是不要手工完成,这是你需要做的,即使是复制最简单的功能,比如设置动作中的值并显示错误信息。

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

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

答案 1 :(得分:0)

无法使用 pure HTML访问服务器数据; TagLibrariesJSP的替代方法是 HTML,但是旧的(和坏的)Scriptlet

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

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

长话短说:

一次是 Servlet ,其PrintWriter输出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>");
}

显然是一场噩梦,导致一些聪明人发明了JSPScriptlet

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

然后TagLib出现了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>

OGNL标记内使用Struts2JSTL类似,但Struts2中的更强大完全集成以多种方式(ValidationTheming等)。

也许这个例子过于简单,无法理解为什么Struts2 Tags应该使用Scriptlets或其他TagLibs,但是当涉及更复杂的现实场景时,您将开始欣赏并最大限度地利用这个伟大的工具。