Struts 2 - 结果 & 结果类型



如前所述,<results> 标签在 Struts2 MVC 框架中扮演着视图的角色。Action 负责执行业务逻辑。执行业务逻辑后的下一步是使用<results> 标签显示视图。

通常,结果会附带一些导航规则。例如,如果 Action 方法用于验证用户,则可能有三种可能的结果。

  • 登录成功
  • 登录失败 - 用户名或密码错误
  • 账户锁定

在这种情况下,Action 方法将配置三种可能的结果字符串和三种不同的视图来呈现结果。我们在前面的示例中已经看到了这一点。

但是,Struts2 并没有强迫你必须使用 JSP 作为视图技术。毕竟,MVC 范式的全部目的是保持层之间的分离并使其高度可配置。例如,对于 Web2.0 客户端,你可能希望返回 XML 或 JSON 作为输出。在这种情况下,你可以为 XML 或 JSON 创建一个新的结果类型来实现这一点。

Struts 带有一系列预定义的结果类型,我们已经看到的默认结果类型是dispatcher,它用于分派到 JSP 页面。Struts 允许你使用其他标记语言作为视图技术来呈现结果,流行的选择包括Velocity、Freemaker、XSLTTiles

Dispatcher 结果类型

dispatcher 结果类型是默认类型,如果未指定其他结果类型,则使用它。它用于转发到服务器上的 servlet、JSP、HTML 页面等。它使用RequestDispatcher.forward() 方法。

我们在之前的示例中看到了“简写”版本,我们在其中将 JSP 路径作为结果标签的主体提供。

<result name = "success">
   /HelloWorld.jsp
</result>

我们还可以使用 <param name = "location"> 标签在 <result...> 元素内指定 JSP 文件,如下所示:

<result name = "success" type = "dispatcher">
   <param name = "location">
      /HelloWorld.jsp
   </param >
</result>

我们还可以提供一个parse 参数,默认值为 true。parse 参数决定是否解析 location 参数以获取 OGNL 表达式。

FreeMaker 结果类型

在这个例子中,我们将看到如何使用FreeMaker 作为视图技术。Freemaker 是一个流行的模板引擎,用于使用预定义的模板生成输出。现在让我们创建一个名为hello.fm 的 Freemaker 模板文件,内容如下:

Hello World ${name}

以上文件是一个模板,其中name 是一个参数,它将从外部使用定义的 Action 传递。你将把此文件保存在你的 CLASSPATH 中。

接下来,让我们修改struts.xml 以指定如下结果:

<?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.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success" type = "freemarker">
            <param name = "location">/hello.fm</param>
         </result>
      </action>
      
   </package>

</struts>

让我们保留 HelloWorldAction.java、HelloWorldAction.jsp 和 index.jsp 文件,就像我们在示例章节中创建它们一样。

现在右键单击项目名称并单击导出 > WAR 文件以创建 WAR 文件。

然后将此 WAR 部署到 Tomcat 的 webapps 目录中。最后,启动 Tomcat 服务器并尝试访问 URL https://127.0.0.1:8080/HelloWorldStruts2/index.jsp。这将产生以下屏幕。

Hello World Struts 4

输入值“Struts2”并提交页面。你应该看到下一页。

Hello World Struts 5

如你所见,这与 JSP 视图完全相同,只是我们没有绑定到使用 JSP 作为视图技术。在这个例子中,我们使用了 Freemaker。

重定向结果类型

redirect 结果类型调用标准response.sendRedirect() 方法,导致浏览器向给定位置创建新的请求。

我们可以在 <result...> 元素的主体中或作为 <param name = "location"> 元素提供位置。Redirect 也支持parse 参数。以下是一个使用 XML 配置的示例:

<action name = "hello" 
   class = "com.tutorialspoint.struts2.HelloWorldAction"
   method = "execute">
   <result name = "success" type = "redirect">
      <param name = "location">
         /NewWorld.jsp
      </param >
   </result>
</action>

因此,只需修改你的 struts.xml 文件以定义上面提到的重定向类型,并创建一个名为 NewWorld.jpg 的新文件,每当 hello action 返回成功时,你将被重定向到该文件。你可以查看Struts 2 重定向 Action 示例以更好地理解。

广告