在经历了PHP开发人员的大部分生活之后,我开始涉猎JSP。我对Java很熟悉,所以我开始了解Struts作为我选择的MVC框架。
我很难理解为什么我应该使用Struts标签库而不是标准的HTML?
<s:textfield id="username" />
或
<input type="text" id="username" name="username" />
概念上的区别是什么?为什么我应该使用标签库而不是HTML?在Struts和整个JSP社区中,是否有一种首选的方法?
struts2标签有两个主要目的:
- 主题(例如,"排放了什么")
- 框架集成(例如,值、验证)
Struts 2使用"themes"来决定面向视图标签的输出。例如,默认的"xhtml"主题将输入标记包装在表格行中,设置输入字段值,如果有字段验证错误,则显示字段验证错误,可能还有一些我不记得的其他事情。
如果您查看页面源代码,您可以准确地看到差异是什么,除了由后端功能确定的位,例如围绕验证消息的If/then。
一般来说,自定义标签允许您以任意方式抽象视图层功能。"首选方法"是不要手工操作,即使是最简单的功能,如设置操作的值和显示错误消息,也需要手工操作。
您可以通过查看它们的FreeMarker模板来查看自定义标记的作用(假设您没有使用Java标记)。你可以扩展这些模板,创建你自己的模板,等等,所有这些都在框架的范围内。
即使是对S2标记和主题文档的粗略检查也应该回答这个问题。
无法使用纯 HTML
访问服务器数据;JSP
中TagLibraries
的替代品是,而不是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 / 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>
在Struts2
标签中使用OGNL
与JSTL
类似,但更强大和在Struts2
中以多种方式(Validation
, Theming
等)完全集成。
也许这个例子太nàive了,无法理解为什么应该使用Struts2 Tags
而不是Scriptlets
或其他TagLibs
,但是当遇到更复杂的实际场景时,您将开始欣赏并最大限度地使用这个伟大的工具。