Struts 2 - 结果和结果类型


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

结果通常附带一些导航规则。例如,如果操作方法是对用户进行身份验证,则存在三种可能的结果。

  • 登录成功
  • 登录失败 - 用户名或密码不正确
  • 帐户被锁定

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

但是,Struts2 并不束缚您使用 JSP 作为视图技术。毕竟,MVC 范例的全部目的是保持各层独立且高度可配置。例如,对于 Web2.0 客户端,您可能希望返回 XML 或 JSON 作为输出。在这种情况下,您可以为 XML 或 JSON 创建新的结果类型并实现此目的。

Struts 附带了许多预定义的结果类型,无论我们已经看到什么,都是默认结果类型Dispatcher,它用于分派到 JSP 页面。Struts 允许您使用其他标记语言的视图技术来呈现结果,流行的选择包括Velocity、Freemaker、XSLTTiles

调度程序结果类型

调度程序 结果类型是默认类型,如果未指定其他结果类型,则使用该类型。它用于转发到服务器上的 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>

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

FreeMaker 结果类型

在此示例中,我们将了解如何使用FreeMaker作为视图技术。Freemaker 是一种流行的模板引擎,用于使用预定义模板生成输出。现在让我们创建一个名为hello.fm的 Freemaker 模板文件,其中包含以下内容 -

Hello World ${name}

上面的文件是一个模板,其中name是一个参数,它将使用定义的操作从外部传递。您将将此文件保留在您的 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 http://localhost:8080/HelloWorldStruts2/index.jsp。这将产生以下屏幕。

你好世界Struts 4

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

你好世界Struts 5

正如您所看到的,这与 JSP 视图完全相同,只是我们不限于使用 JSP 作为视图技术。我们在本例中使用了 Freemaker。

重定向结果类型

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

我们可以在 <result...> 元素的主体中或作为 <param name = "location"> 元素提供位置。重定向还支持解析参数。这是使用 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 操作返回成功,您就会在其中重定向。您可以查看Struts 2 Redirect Action示例以更好地理解。