2

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

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

<s:textfield id="username" />

或者

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

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

4

2 回答 2

3

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

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

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

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

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

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

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

于 2013-04-30T12:40:47.493 回答
0

无法使用pure HTML访问服务器数据;TagLibrariesinside aJSP的替代品不是HTMLs ,而是旧的(和坏的)s Scriptlet

最后的所有内容都将转换为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>

然后就出来了TagLibJSTL

<%@ 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 / Struts带给OGNL我们

<%@ 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内部Struts2标签类似于JSTL,但功能更强大,并且以多种方式(、等)完全集成。Struts2ValidationTheming

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

于 2013-04-30T14:00:01.393 回答