例子

优质
小牛编辑
126浏览
2023-12-01

正如您已经从Struts 2体系结构中学到的,当您在Struts 2 Web应用程序中单击超链接或提交HTML表单时,Controller会收集输入,并将其发送到名为Actions的Java类。 执行Action后,结果将选择一个资源来呈现响应。 资源通常是JSP,但它也可以是PDF文件,Excel电子表格或Java小程序窗口。

假设您已经构建了开发环境。 现在,让我们继续构建我们的第一个Hello World Struts2项目。 此项目的目的是构建一个Web应用程序,该应用程序收集用户的名称并显示“Hello World”,后跟用户名。

我们必须为任何Struts 2项目创建以下四个组件 -

Sr.No组件和描述
1

Action

创建一个包含完整业务逻辑的操作类,并控制用户,模型和视图之间的交互。

2

Interceptors

如果需要,创建拦截器,或使用现有的拦截器。 这是Controller的一部分。

3

View

创建JSP以与用户交互以获取输入并呈现最终消息。

4

Configuration Files

创建配置文件以耦合Action,View和Controllers。 这些文件是struts.xml,web.xml,struts.properties。

我将使用Eclipse IDE,以便在Dynamic Web Project下创建所有必需的组件。 现在让我们开始创建动态Web项目。

创建动态Web项目

启动Eclipse,然后使用File 》 New 》 Dynamic Web Project并输入项目名称HelloWorldStruts2并设置其余选项,如下面的屏幕所示:

Hello World Sturts1

在下一个屏幕中选择所有默认选项,最后选中Generate Web.xml deployment descriptor选项。 这将在Eclipse中为您创建一个动态Web项目。 现在使用Windows 》 Show View 》 Project Explorer ,您将看到项目窗口如下 -

Hello World Sturts2

现在将以下文件从struts 2 lib文件夹C:\struts-2.2.3\lib复制到我们项目的WEB-INF\lib文件夹中。 为此,您只需将以下所有文件拖放到WEB-INF\lib文件夹中即可。

  • commons-fileupload-x.y.z.jar
  • commons-io-x.y.z.jar
  • commons-lang-x.y.jar
  • commons-logging-x.y.z.jar
  • commons-logging-api-x.y.jar
  • freemarker-x.y.z.jar
  • javassist-.xy.z.GA
  • ognl-x.y.z.jar
  • struts2-core-x.y.z.jar
  • xwork-core.x.y.z.jar

创建Action类 (Create Action Class)

Action类是Struts 2应用程序的关键,我们在action类中实现了大部分业务逻辑。 因此,让我们在Java Resources 》 src下创建一个java文件HelloWorldAction.java,其包名为cn.xnip.struts2 ,其内容如下所示。

当用户单击URL时,Action类会响应用户操作。 执行一个或多个Action类的方法,并返回String结果。 根据结果​​的值,呈现特定的JSP页面。

package cn.xnip.struts2;
public class HelloWorldAction {
   private String name;
   public String execute() throws Exception {
      return "success";
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

这是一个非常简单的类,有一个名为“name”的属性。 我们有“name”属性的标准getter和setter方法以及返回字符串“success”的execute方法。

Struts 2框架将创建HelloWorldAction类的对象,并调用已执行的方法以响应用户的操作。 您将业务逻辑放在此方法中,最终返回String常量。 换句话说,对于每个URL,您必须实现一个操作类,并且可以直接使用该类名作为操作名称,也可以使用struts.xml文件映射到其他名称,如下所示。

创建一个视图 (Create a View)

我们需要一个JSP来呈现最终消息,当预定义的动作发生时,这个页面将被Struts 2框架调用,这个映射将在struts.xml文件中定义。 因此,让我们在您的eclipse项目的WebContent文件夹中创建以下jsp文件HelloWorld.jsp 。 为此,右键单击项目资源管理器中的WebContent文件夹,然后选择“ New 》JSP File

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
   <head>
      <title>Hello World</title>
   </head>
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

taglib指令告诉Servlet容器该页面将使用Struts 2标记,并且这些标记将以s开头。

s:property标签显示动作类属性“name>的值,该属性由HelloWorldAction类的getName()方法返回。

创建主页面

我们还需要在WebContent文件夹中创建index.jsp 。 此文件将用作初始操作URL,用户可以单击该URL以告知Struts 2框架调用HelloWorldAction类的已定义方法并呈现HelloWorld.jsp视图。

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <title>Hello World</title>
   </head>
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

上面的视图文件中定义的hello操作将使用struts.xml文件映射到HelloWorldAction类及其execute方法。 当用户单击Submit按钮时,它将使Struts 2框架运行HelloWorldAction类中定义的execute方法,并根据方法的返回值,选择适当的视图并将其呈现为响应。

配置文件 (Configuration Files)

我们需要一个映射来将URL,HelloWorldAction类(Model)和HelloWorld.jsp(视图)绑定在一起。 映射告诉Struts 2框架哪个类将响应用户的操作(URL),该类的哪个方法将被执行,以及基于该方法返回的String结果呈现什么视图。

那么让我们创建一个名为struts.xml的文件。 由于Struts 2要求struts.xml存在于classes文件夹中。 因此,在WebContent/WEB-INF/classes文件夹下创建struts.xml文件。 Eclipse默认情况下不会创建“classes”文件夹,因此您需要自己执行此操作。 为此,右键单击项目资源管理器中的WEB-INF文件夹,然后选择“ New 》 Folder 。 你的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 = "cn.xnip.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>

关于上述配置文件需要理解的几个词。 在这里,我们将常量struts.devMode设置为true ,因为我们在开发环境中工作,我们需要查看一些有用的日志消息。 然后,我们定义一个名为helloworld的包。

如果要将操作组合在一起,创建包非常有用。 在我们的示例中,我们将操作命名为“hello”,它对应于URL /hello.action ,并由HelloWorldAction.class备份。 HelloWorldAction.classexecute方法是在调用URL /hello.action时运行的方法。 如果execute方法的结果返回“success”,那么我们将用户带到HelloWorld.jsp

下一步是创建一个web.xml文件,该文件是对Struts 2的任何请求的入口点.Struts2应用程序的入口点将是在部署描述符(web.xml)中定义的过滤器。 因此,我们将在web.xml中定义org.apache.struts2.dispatcher.FilterDispatcher类的条目。 需要在WebContent下的WEB-INF文件夹下创建web.xml文件。 Eclipse在您创建项目时已经为您创建了一个框架web.xml文件。 所以,让我们修改如下 -

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   <display-name>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>
   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

我们已将index.jsp指定为欢迎文件。 然后我们将Struts2过滤器配置为在所有URL上运行(即,任何匹配模式/ *的url)

启用详细日志

通过在WEB-INF/classes文件夹下创建logging.properties文件,可以在使用Struts 2时启用完整的日志记录功能。 在属性文件中保留以下两行 -

org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
   java.util.logging.ConsoleHandler

默认的logging.properties指定用于将日志记录路由到stdout以及FileHandler的ConsoleHandler。 可以使用SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST或ALL设置处理程序的日志级别阈值。

而已。 我们准备使用Struts 2框架运行Hello World应用程序。

执行应用程序的过程

右键单击项目名称,然后单击“ Export 》 WAR File以创建War文件。

然后在Tomcat的webapps目录中部署此WAR。

最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp 。 这将为您提供以下屏幕 -

Hello World Struts4

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

Hello World Struts5

请注意,您可以将index定义为struts.xml文件中的操作,在这种情况下,您可以将索引页调用为http://localhost:8080/HelloWorldStruts2/index.action 。 检查下面如何将索引定义为动作 -

<?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 = "index">
         <result >/index.jsp</result>
      </action>
      <action name = "hello" 
         class = "cn.xnip.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>