w3cschool-Struts2 概述

Struts2 概述

Struts2 是目前较为普及和成熟的基于MVC设计模式的web应用程序框架,它不仅仅是Struts1 的升级版本,更是一个全新的Struts架构。最初,是以WebWork框架和Struts框架为基础,通过提供增强和改进的Struts框架,进而实现简化web技术人员开发工作的目标。不久之后,Webwork框架和Struts社区联合创造了现在流行的Struts2框架。

 Struts2 框架的优点

了解了这几个主要的优点,会促使你考虑使用Struts2 :
  • POJO表单及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分。在Struts2框架下,你可以用任何一POJO来接收表单输入,同样的,你可以把任一POJO视为一个Action类。
  • 标签支持 - Struts2 改进了标签表单,而新的标签可让开发人员减少代码编写量。
  • AJAX支持 - Struts2 被认可接收进Web 2.0技术,并创建了功能非常类似于标准的Struts2 标签的AJAX标签,把AJAX支持整合进其结果中。
  • 易于整合 - Struts有多种整合方式可使用,现在与其他类型的框架,如Spring、Tiles、SiteMesh之类的,整合更为容易了。
  • 模板支持 - 支持使用模板生成视图。
  • 插件支持 - 有大量的插件可用于Struts2,而使用插件可以增强和扩大Struts2 核心行为。
  • 性能分析 - Struts2 为调试和配置应用程序提供综合的性能分析,此外,Struts也以嵌入调试工具的形式提供集成调试。
  • 易于修改标签 - 在Struts2 中,可使用Freemarker的模板对标签标记进行调整,而修改标签不需要JSP或是Java知识,基本的HTML、XML和CSS知识就足够了。
  • 促进减少配置 - Struts2 使用各种设置的默认值促进减少配置,而你不需要再配置什么除非是偏离了Struts2 设定的默认设置。
  • 视图技术 - Struts2 为多种视图选项(JSP、Freemarker、Velocity、XSLT等)提供支持。
以上是使Struts2 成为准企业框架的十大优点。

Struts2 框架的缺点

需不断改进的缺点:

  • 更大的学习曲线 - 使用Struts MVC,你必须要熟悉JSP、Servlet APIs标准以及一个大型、复杂的框架。
  • 文档缺乏 - 相比于Servlet和JSP APIs标准,Struts的在线资源较少,许多初学者会发现Apache在线文档混乱并缺乏整理。
  • 不够透明 - 相比于使用正常的基于Java的Web应用程序,使用Struts的应用程序有许多是进行在后台,这使得框架不易于理解。

Struts2 MVC架构

模型(Model)-视图(View)-控制器(Controller),通常简称MVC,是一种开发web应用程序的软件设计模式。该软件设计模式由以下三部分组成:  

  • 模型——属于软件设计模式的底层基础,主要负责数据维护。  
  • 视图——这部分是负责向用户呈现全部或部分数据。 
  • 控制器——通过软件代码控制模型和视图之间的交互。
MVC普及的原因在于它区分了应用程序的逻辑层和用户界面层,并支持开发关注点的分离。在MVC模式下,控制器接收了所有来自应用程序的请求后,调用模型去准备视图所需要的数据,然后视图使用由控制器提供的数据最终生成一个可视的响应。MVC的抽象概念可通过以下图形进行表述:

 

Struts MVC

 模型


模型主要负责管理应用程序的数据,它通过响应视图的请求和控制器的指令来更新自身的数据。

视图


通过控制器的指令触发所展现的一种特殊的数据格式。它们是基于像JSP、ASP、PHP之类模板系统的脚本,较易与AJAX技术进行整合。

控制器


控制器负责响应用户输入并执行数据模型对象的交互。控制器在接收、确认输入后执行修改数据模型状态的业务操作。

通过以下五个核心部分进行实现的:

  • 操作(Actions)
  • 拦截器(Interceptors)
  • 值栈(Value Stack)/OGNL
  • 结果(Result)/结果类型
  • 视图技术
而Struts2 与传统的MVC框架略有不同,因为它由Action扮演模型的角色,而不是控制器,虽然这样会有一些重叠。

 

Struts 2的架构

 

上图描述了Struts2 高级系统架构下的模型、视图及控制器。控制器是通过Struts2 分派servlet过滤器以及拦截器进行实现,模型是通过Actions进行实现,而视图则是结果类型和结果的结合。值栈和OGNL提供共同的路线、链接以及与其他组件之间的集成。
除了上述部分,还有许多组件相关的信息。web应用程序组件、Actions组件、拦截器组件、结果组件等等。
这些是Struts2 MVC模式的体系结构概述,在随后的章节中,我们将详细了解各个部分。

请求生命周期

通过上述图片的描述,我们可以依照下面几点解释在Struts2 中用户的请求生命周期:
  • 用户发送一个资源需求的请求到服务器(例如:页面)。
  • 核心控制器查看请求后确定适当的动作。
  • 使用验证、文件上传等配置拦截器功能。
  • 执行选择的动作来完成请求的操作。
  • 另外,如果需要的话,配置的拦截器可做任何后期处理。
  • 最后,由视图显示结果并返回给用户。

Struts2 配置文件

配置文件中:web.xmlstruts.xmlstruts-config.xml以及struts.properties

web.xml文件

WebContent/WEB-INF文件夹下创建

<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>

struts.xml文件

struts>
   <constant name="struts.devMode" value="true" />
   <package name="helloworld" extends="struts-default">
      <action name="hello" 
            class="cn.w3cschool.struts2.HelloWorldAction" 
            method="execute">
            <result name="success">/HelloWorld.jsp</result>
      </action>
      <-- more actions can be listed here -->
   </package>
   <-- more packages can be listed here -->
</struts>

<package>标签具有以下属性:

属性描述
name(必需) 为package的唯一标识
extends 指定package继承另一package的所有配置。通常情况下,我们使用struts-default作为package的基础。
abstract 定义package为抽象的。如果标记为true,则package不能被最终用户使用。
namespace Actions的唯一命名空间

<constant>标签以及name和value属性将用于覆盖default.properties中定义的任一属性,就像我们设置的struts.devMode属性一样。

<struts>
     <include file="my-struts1.xml"/>
     <include file="my-struts2.xml"/>
</struts>

struts-config.xml文件

struts-config.xml配置文件是Web Client中View和Model组件之间的链接,但在你99.99%的项目里你不必使用这些设置。 struts-config.xml配置文件包含以下主要元素:

序号拦截器和说明
1 struts-config

这是配置文件的根节点。

2 form-beans

这是你将ActionForm子类映射到name的位置,你可以在struts-config.xml文件的其余部分,甚至在JSP页面上,将这个name用作ActionForm的别名。

3 global forwards

此部分将你在webapp上的页面映射到name,你可以使用这个name来引用实际页面。这避免了对你网页上的URL进行硬编码。

4 action-mappings

这是你声明表单处理程序的地方,也被称为操作映射(action mappings)

5 controller

这部分是配置Struts的内部,在实际情况中很少使用。

6 plug-in

这部分告诉Struts在哪里找到属性文件,它包含提示和错误消息。

下面是struts-config.xml文件的示例:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">

<struts-config>

   <!-- ========== Form Bean Definitions ============ -->
   <form-beans>
      <form-bean name="login" type="test.struts.LoginForm" />
   </form-beans>

   <!-- ========== Global Forward Definitions ========= -->
   <global-forwards>
   </global-forwards>

   <!-- ========== Action Mapping Definitions ======== -->
   <action-mappings>
      <action
         path="/login"
         type="test.struts.LoginAction" >

         <forward name="valid" path="/jsp/MainMenu.jsp" />
         <forward name="invalid" path="/jsp/LoginView.jsp" />
      </action>
   </action-mappings>

   <!-- ========== Controller Definitions ======== -->
   <controller 
      contentType="text/html;charset=UTF-8"
      debug="3"
      maxFileSize="1.618M"
      locale="true"
      nocache="true"/>

</struts-config>

有关struts-config.xml文件的更多详细内容,可查看Struts Documentation。

struts.properties文件

这个配置文件提供了一种机制来改变框架的默认行为。实际上,struts.properties配置文件中包含的所有属性也可以在web.xml中配置使用init-param,以及在struts.xml配置文件中使用constant标签。 但如果你想保持事件独立以及保留更多struts细节,那么你可以在WEB-INF/classes文件夹下创建这个文件。

struts.properties

文件中配置的值将覆盖

default.properties

中配置的默认值,这些值包含在struts2-core-x.y.z.jar分布中。有一些属性,你可以考虑改为使用

struts.properties

文件:

### When set to true, Struts will act much more friendly for developers
struts.devMode = true
### Enables reloading of internationalization files
struts.i18n.reload = true
### Enables reloading of XML configuration files
struts.configuration.xml.reload = true
### Sets the port that the server is run on
struts.url.http.port = 8080

Struts2 Actions动作

public class HelloWorldAction extends ActionSupport{
<struts>
      <constant name="struts.devMode" value="true" />
      <package name="helloworld" extends="struts-default">
         <action name="hello" 
            class="cn.w3cschool.struts2.HelloWorldAction"
            method="execute">
            <result name="success">/HelloWorld.jsp</result>
            <result name="error">/AccessDenied.jsp</result>
         </action>
      </package>
</struts>

Struts2框架拦截器

Struts 2框架提供了一个良好的开箱即用的拦截器列表,这些拦截器预先配置好并可以使用。 下面列出了几个重要的拦截器:

序号拦截器和说明
1 alias

允许参数在请求之间使用不同的别名。

2 checkbox

通过为未检查的复选框添加参数值false,以辅助管理复选框。

3 conversionError

将字符串转换为参数类型的错误信息放置到action的错误字段中。

4 createSession

自动创建HTTP会话(如果尚不存在)。

5 debugging

为开发人员提供一些不同的调试屏幕。

6 execAndWait

当action在后台执行时,将用户发送到中间的等待页面。

7 exception

映射从action到结果抛出的异常,允许通过重定向自动处理异常。

8 fileUpload

便于文件上传。

9

i18n

在用户会话期间跟踪选定的区域。

10 logger

通过输出正在执行的action的名称提供简单的日志记录。

11 params

设置action上的请求参数。

12 prepare

这通常用于执行预处理工作,例如设置数据库连接。

13 profile

允许记录action的简单分析信息。

14 scope

在会话或应用程序范围内存储和检索action的状态。

15 ServletConfig

提供可访问各种基于servlet信息的action。

16 timer

以action执行时间的形式提供简单的分析信息。

17 token

检查action的有效性,以防止重复提交表单。

18 validation

提供action的验证支持。

你可以阅读Struts 2文档,了解上述拦截器的完整信息。接下来我们会告诉你如何在Struts应用程序中使用拦截器。

<struts>
   <constant name="struts.devMode" value="true" />
   <package name="helloworld" extends="struts-default">

      <interceptors>
         <interceptor name="myinterceptor"
            class="cn.w3cschool.struts2.MyInterceptor" />
      </interceptors>

      <action name="hello" 
         class="cn.w3cschool.struts2.HelloWorldAction" 
         method="execute">
         <interceptor-ref name="params"/>
         <interceptor-ref name="myinterceptor" />
         <result name="success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Struts2 值栈/OGNL

值栈是一组对象,按照提供的顺序存储以下这些对象:

序号对象和说明
1 Temporary对象

实际中存在各种在页面执行期间创建的temporary对象。例如,JSP标签循环集合的当前迭代值。

2 Model对象

如果在struts应用程序中使用Model对象,则当前Model对象放在值堆栈上的action之前。

3 Action对象

这是指正在执行的当前action对象。

4 命名对象

这些对象包括#application,#session,#request,#attr和#parameters以及所引用的相应的servlet作用域。

Struts2 文件上传

表单的enctype设置为multipart/form-data

uploadFile.java是一个非常简单的类。要注意的重点是,FileUpload拦截器和Parameters拦截器为我们承担了所有的重工作量。默认情况下,FileUpload拦截器为你提供三个参数,它们分别按以下方式命名:

  • [文件名参数] - 这是用户已上传的实际文件。在这个例子中它将是“myFile”

  • [文件名参数]ContentType - 这是上传的文件的内容类型。在这个例子中,它将是“myFileContentType”

  • [文件名参数]FileName - 这是上传的文件的名称。在这个例子中,它将是“myFileFileName”

配置文件

以下是控制文件上传过程的Struts2 配置属性:

序号属性和说明
1 struts.multipart.maxSize

可接受的上传文件的最大值(以字节为单位),默认值为250M。

2 struts.multipart.parser

用于上传多部分表单的库,默认为jakarta

3 struts.multipart.saveDir

存储临时文件的位置,默认是javax.servlet.context.tempdir。

Struts2 数据库访问

String URL = "jdbc:mysql://localhost/struts_tutorial";
         Class.forName("com.mysql.jdbc.Driver");
         conn = DriverManager.getConnection(URL, "root", "root123");
         String sql = "SELECT name FROM login WHERE";
         sql+=" user = ? AND password = ?";
         PreparedStatement ps = conn.prepareStatement(sql);
         ps.setString(1, user);
         ps.setString(2, password);
         ResultSet rs = ps.executeQuery();

Struts2 发送电子邮件

Session session = Session.getDefaultInstance(properties,  
            new javax.mail.Authenticator() {
            protected PasswordAuthentication 
            getPasswordAuthentication() {
            return new 
            PasswordAuthentication(from, password);
            }});

         Message message = new MimeMessage(session);
         message.setFrom(new InternetAddress(from));
         message.setRecipients(Message.RecipientType.TO, 
            InternetAddress.parse(to));
         message.setSubject(subject);
         message.setText(body);
         Transport.send(message);

Struts2 验证框架

创建Action

那么,让我们定义一个小的action类:Employee,然后添加一个名为validate()的方法,如下Employee.java文件所示。确保action类扩展了ActionSupport类,否则将不会执行validate方法。

XML验证

第二种进行验证的方法是在action类旁边放置一个xml文件。Struts2 基于XML的验证提供了更多的验证方式,如email验证、integer range验证、form验证、expression验证、regex验证、required验证、requiredstring验证、stringlength验证等。
xml文件需要命名为'[action-class]'-validation.xml。因此,在我们的示例中,创建了一个名为Employee-validation.xml的文件,其含以下内容:

<validators>
<field name="name">
<field-validator type="required">
<message>
The name is required.
</message>
</field-validator>
</field>
</validators>

Struts2 本地化/国际化(i18n)

国际化(i18n)是规划和实施产品和服务以便更好地适应特定的当地语言和文化的过程,也就是本地化过程,而国际化过程有时也被称为翻译或本地化实现。国际化缩写为i18n,单词以i开头,以n结尾,是因为在第一个i和最后一个n之间有18个字符。
Struts2使用bundle资源束、拦截器和标签库提供本地化,即国际化(i18n)支持,主要用在以下几个地方:

 

  • UI标签

  • 信息和错误。

  • Action类。

资源束

 

Struts2使用资源束为Web应用程序的用户提供多种语言和区域的设置选项。你不必担心需要用不同的语言编写页面,你需要做的只是为每种你想要的语言创建一个资源束。资源束将包含用户语言中的标题,消息和其他文本,是包含应用程序默认语言的一对key/value的文件。
资源文件最简单的命名格式是:

 

bundlename_language_country.properties

 

这里的bundlename可以是ActionClass,Interface,SuperClass,Model,Package,Global资源属性。下一部分language_country表示国家区域设置,例如西班牙语(西班牙)区域设置由es_ES表示,英语(美国)区域设置由en_US表示等。这里先跳过可选国家的部分。
当你通过key引用消息元素时,Struts框架按以下顺序搜索相应的信息束:

 

  • ActionClass.properties

  • Interface.properties

  • SuperClass.properties

  • model.properties

  • package.properties

  • struts.properties

  • global.properties

要以多种语言开发应用程序,你必须维护与这些语言/区域设置对应的多个属性文件,并根据每对key/value定义所有内容。例如,如果你要开发美国英语(默认),西班牙语和法语的应用程序,必须创建三个属性文件。这里我们将使用global.properties文件,你也可以使用不同的属性文件来分离不同类型的信息。

    • global.properties:默认情况下使用英语(美国)

    • global_fr.properties:这将用于法语环境。

    • global_es.properties:这将用于西班牙语环境。

Struts2 主题和模板

2018-01-06 11:29 更新

开始本章的内容学习之前,让我们看看http://struts.apache.org给出的几个定义:

术语描述
tag(标签) 从JSP,FreeMarker或Velocity内部执行的一小段代码。
template(模板) 一些代码,通常是写在FreeMarker上的,可以由某些标签(HTML标签)呈现。
theme(主题) 封装在一起以提供公共功能的模板集合。

Struts2 异常处理

Struts2 注释

要在项目中开始使用注释,请确保WebContent/WEB-INF/lib文件夹中包含以下jar文件:

 

  • struts2-convention-plugin-x.y.z.jar

  • asm-x.y.jar

  • antlr-x.y.z.jar

  • 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

Struts2 控制标签

Struts2 数据标签

Struts2 表单标签

Struts2 Ajax标签

Struts2 Spring集成

Struts2 Tiles集成

Struts2 Hibernate集成





posted @ 2022-03-04 22:04  hanease  阅读(46)  评论(0编辑  收藏  举报