Struts 2 结果类型 Result Type
如前所述,<results>
标签在 Struts2 MVC 框架中扮演视图的角色。 Action 负责执行业务逻辑。 执行业务逻辑后的下一步是使用 <results>
标记显示视图。
结果通常附带一些导航规则。 例如,如果操作方法是对用户进行身份验证,则有三种可能的结果。
- 登录成功
- 登录失败 - 用户名或密码不正确
- 帐户被锁定
在这种情况下,action 方法将配置三个可能的结果字符串和三个不同的视图来呈现结果。 我们已经在前面的示例中看到了这一点。
但是,Struts2 并不束缚我们使用 JSP 作为视图技术。 毕竟 MVC 范式的全部目的是保持层分离和高度可配置。 例如,对于 Web2.0 客户端,我们可能希望返回 XML 或 JSON 作为输出。 在这种情况下,我们可以为 XML 或 JSON 创建新的结果类型并实现此目的。
Struts 附带了许多预定义的结果类型,以及我们已经看到的默认结果类型分派器,用于分派到 JSP 页面。 Struts 允许我们为视图技术使用其他标记语言来呈现结果,流行的选择包括 Velocity
、Freemaker
、XSLT
和 Tiles
。
Dispatcher 结果类型
dispatcher 结果类型是默认类型,如果没有指定其他结果类型,则使用该类型。 它用于转发到服务器上的 servlet、JSP、HTML 页面等。 它使用 RequestDispatcher.forward()
方法。
我们在前面的示例中看到了“速记”版本,其中我们提供了一个 JSP 路径作为结果标记的主体。
<result name = "success">
/HelloWorld.jsp
</result>
我们还可以在 <result...>
元素中使用 <param name = "location">
标记指定 JSP 文件,如下所示
<result name = "success" type = "dispatcher">
<param name = "location">
/HelloWorld.jsp
</param >
</result>
我们还可以提供 parse 参数,默认情况下为 true。 parse 参数确定是否为 OGNL 表达式解析 location 参数。
FreeMaker 结果类型
在此示例中,我们将了解如何使用 FreeMaker 作为视图技术。 Freemaker 是一种流行的模板引擎,用于使用预定义的模板生成输出。 现在让我们创建一个名为 hello.fm 的 Freemaker 模板文件,其内容如下
Hello World ${name}
上面的文件是一个模板,其中 name 是一个参数,它将使用定义的操作从外部传递。 我们将把这个文件保存在 CLASSPATH 中。
接下来让我们修改struts.xml
指定 result 如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.jiyik.struts2.action.HelloWorldAction"
method = "execute">
<result name = "success" type = "freemarker">
<param name = "location">/hello.fm</param>
</result>
</action>
</package>
</struts>
让我们保留我们在示例章节中创建的 HelloWorldAction.java、HelloWorldAction.jsp 和 index.jsp 文件。
然后启动项目,在浏览器中访问页面
在输入框中输入“Struts2”并提交。 我们会看到如下的界面。
正如大家所看到的,这与 JSP 视图完全相同,只是我们不依赖于使用 JSP 作为视图技术。 我们在这个例子中使用了 Freemaker。
Redirect 结果类型
redirect 结果类型调用标准的 response.sendRedirect()
方法,导致浏览器创建到给定位置的新请求。
我们可以在 <result...>
元素的主体中或作为 <param name = "location">
元素提供位置。 重定向还支持 parse 参数。 这是一个使用 XML 配置的示例
<action name = "hello"
class = "com.jiyik.struts2.action.HelloWorldAction"
method = "execute">
<result name = "success" type = "redirect">
<param name = "location">
/NewWorld.jsp
</param >
</result>
</action>
因此,只需修改我们的 struts.xml 文件以定义上述 redirect 类型并创建一个新文件 NewWorld.jpg,只要 hello 操作返回成功,我们就会在该文件中被重定向。我们可以查看 Struts 2 重定向示例以获得更好的理解。