Stuts2是基于MVC设计模式成熟的Web应用框架。不仅仅是Struts1的下一个版本,是一个全新的Struts架构。由WebWork社区跟Strut社区联手打造的。(教程来自W3Cschool

Struts2框架的特性

  • POJO表单和POJO操作——Struts2去掉了Struts中的Action Forms部分。在Struts框架中,你可以用任意pojo来接收表单输入,同样的,你可以把任意pojo是为一个Action类。
  • 标签支持——Struts2改进了标签表单,让开发人员写更少的代码。
  • AJAX支持——Struts2被认可接受进Web2.0技术,并创建了功能类似标准Struts2标签的AJAX标签,把AJAX支持整合到其结果中。
  • 易整合——可以与现在多种框架整合。
  • 模板支持——支持使用模板生成视图。
  • 插件支持——有大量的插件可用于Struts2.
  • 性能分析——Struts2 为调试和配置应用程序提供综合的性能分析,此外,Struts也以嵌入调试工具的形式提供集成调试。
  • 标签易修改——在Struts2 中,可使用Freemarker的模板对标签标记进行调整,而修改标签不需要JSP或是Java知识,基本的HTML、XML和CSS知识就足够了
  • 促进减少配置——Struts2 使用各种设置的默认值促进减少配置,而你不需要再配置什么除非是偏离了Struts2 设定的默认设置
  • 视图技术——Struts2为多种视图技术提供支持。

Struts2框架的缺点

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

Struts2架构

MVC拉动的框架,通过以下五个部分实现的。

  • 操作(Actions)
  • 拦截器(Interceptors)
  • 值栈(Value Stack)/OGNL
  • 结果(Resut)/结果类型
  • 视图技术



上图描述了Struts2 高级系统架构下的模型、视图及控制器。控制器是通过Struts2 分派servlet过滤器以及拦截器进行实现,模型是通过Actions进行实现,而视图则是结果类型和结果的结合。值栈和OGNL提供共同的路线、链接以及与其他组件之间的集成。

请求的生命周期

  • 用户发送一个资源需求的请求到服务器。
  • 核心控制器查看请求后确定适当的动作。
  • 使用验证、文件上传等配置拦截器功能。
  • 执行选择的动作来完成请求的操作。
  • 如果有需求,配置的拦截器可做任何后期处理。
  • 视图显示结果并返回给用户。

Hello World

示例查看 https://www.w3cschool.cn/struts_2/struts_examples.html

注意:W3Cschool中示例用的struts-2.2.3,在我使用struts-2.50版本的时候出异常:Class not found:FilterDisparcture

自2.1.3版本开始,ActionContextCleanUp和FilterDispatcher都由StrutsPrepareAndExecuteFilter代替。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <display-name>Struts</display-name>
  7. <welcome-file-list>
  8. <welcome-file>index.html</welcome-file>
  9. <welcome-file>index.htm</welcome-file>
  10. <welcome-file>index.jsp</welcome-file>
  11. <welcome-file>default.html</welcome-file>
  12. <welcome-file>default.htm</welcome-file>
  13. <welcome-file>default.jsp</welcome-file>
  14. </welcome-file-list>
  15. <filter>
  16. <filter-name>Struts2</filter-name>
  17. <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  18. </filter>
  19. <filter-mapping>
  20. <filter-name>Struts2</filter-name>
  21. <url-pattern>/*</url-pattern>
  22. </filter-mapping>
  23. </web-app>

struts2配置文件

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <display-name>Struts</display-name>
  7. <welcome-file-list>
  8. <welcome-file>index.html</welcome-file>
  9. <welcome-file>index.htm</welcome-file>
  10. <welcome-file>index.jsp</welcome-file>
  11. <welcome-file>default.html</welcome-file>
  12. <welcome-file>default.htm</welcome-file>
  13. <welcome-file>default.jsp</welcome-file>
  14. </welcome-file-list>
  15. <filter>
  16. <filter-name>Struts2</filter-name>
  17. <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  18. </filter>
  19. <filter-mapping>
  20. <filter-name>Struts2</filter-name>
  21. <url-pattern>/*</url-pattern>
  22. </filter-mapping>
  23. </web-app>

struts.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <constant name="struts.devMode" value="true" />
  7. <package name="helloworld" extends="struts-default">
  8. <action name="hello"
  9. class="cn.w3cschool.struts2.HelloWorldAction"
  10. method="execute">
  11. <result name="success">/HelloWorld.jsp</result>
  12. </action>
  13. <-- more actions can be listed here -->
  14. </package>
  15. <-- more packages can be listed here -->
  16. </struts>

用<package>标签声明不同的包,这里的<package>标签允许配置的分离和模块化。这在你进行一个大的项目并且项目分为多个不同的模块时,是非常有用的

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

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

<constant>标签以及name和value属性将用于覆盖default.properties中定义的任意属性,就像我们设置的struts.devMode属性一样。设置struts.devMode属性允许我们在日志文件中查看更多的调试消息。

我们定义<action>标签对应我们每一个想要访问的url,并且使用excute()方法定义一个访问相应的URL时将要访问的类。

<reuslt>(结果)确定到执行操作后返回到浏览器的内容,而从操作返回的字符串应该是结果的名称。<result>按照上述操作或作为“全局”配置结果,可用于包中的每个操作。<result>有name和type属性可选,默认的name值是“success”

struts.xml文件可以随着时间的推移而增长,因此通过包打破它是使它模块化的一种方式,但struts提供了另外一种模块化struts.xml的方法,可以将文件拆分成多个xml文件,并用以下方式导入他们:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <include file="my-struts1.xml"/>
  7. <include file="my-struts2.xml"/>
  8. </struts>

struts-default.xml文件包含struts的标准配置设置,所以不必在很多项目中重复这些配置。

struts-config.xml

struts-config.xml文件是Web Client中View和Model组件之间的链接。一般不会使用这些设置。主要包含元素:

序号 拦截器和说明
1 struts-config
这是配置文件的根节点
2 form-beans
这是你将ActionForm映射到name的位置,你可以在struts-config.xml文件的其余部分,甚至在JSP页面上,将这个name用作ActionForm的别名
3 global fowards
此部分将你web-app上的页面映射到name,你可以使用这个name来引用实际页面。这避免了你对网页上的url进行硬解码。
4 action-mappings
这是你声明表单处理程序的地方,也被称为操作映射(action mappings)。
5 controller
这部分是配置struts内部,在实际情况中很少使用。
6 plug-in
这部分是告诉struts在哪里找到属性文件,它包含提示和错误消息

示例:

  1. <?xml version="1.0" encoding="ISO-8859-1" ?>
  2. <!DOCTYPE struts-config PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
  4. "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
  5. <struts-config>
  6. <!-- ========== Form Bean Definitions ============ -->
  7. <form-beans>
  8. <form-bean name="login" type="test.struts.LoginForm" />
  9. </form-beans>
  10. <!-- ========== Global Forward Definitions ========= -->
  11. <global-forwards>
  12. </global-forwards>
  13. <!-- ========== Action Mapping Definitions ======== -->
  14. <action-mappings>
  15. <action
  16. path="/login"
  17. type="test.struts.LoginAction" >
  18. <forward name="valid" path="/jsp/MainMenu.jsp" />
  19. <forward name="invalid" path="/jsp/LoginView.jsp" />
  20. </action>
  21. </action-mappings>
  22. <!-- ========== Controller Definitions ======== -->
  23. <controller
  24. contentType="text/html;charset=UTF-8"
  25. debug="3"
  26. maxFileSize="1.618M"
  27. locale="true"
  28. nocache="true"/>
  29. </struts-config>

详细内容查看官网文档。

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文件:

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

Action动作

Action是struts2的核心,因为它们使用与所有的MVC框架。每个URL映射到特定的action,其提供处理用户请求所需的处理逻辑。

action的两个重要功能:

  1. action在将数据从请求到视图(无论是JSP还是其他类型的结果)方面起着重要的作用。
  2. action必须协助框架确定那个结果应该响应在请求的视图中。

创建Action

必须有一个无参方法返回String或者Result对象,必须是POJO。

没有指定无参方法时默认使用excute()方法。

可以扩展ActionSupport类,该类实现六个接口,包括Action接口:

  1. public interface Action(){
  2. public static final String SUCCESS = "success";
  3. public static final String NONE = "none";
  4. public static final String ERROR = "error";
  5. public static final String INPUT = "input";
  6. public static final Stirng LOGIN = "login";
  7. public String execute() throws Exception;
  8. }

可以扩展上例中的HelloWorldAction方法:

  1. packge com.kfw5264.struts2;
  2. import com.opensymphony.xwork2.ActionSupport;
  3. public class HelloWorldAction extends ActionSupport{
  4. private String name;
  5. public String excute() throws Exception{
  6. if("SECRET".equals(name)){
  7. return SUCCESS;
  8. }else{
  9. return ERROR;
  10. }
  11. }
  12. public String getName(){
  13. return name;
  14. }
  15. public void setName(String name){
  16. this.name = name;
  17. }
  18. }

由于继承了ActionSupport类,所以我们可以使用String常量。此时,可以将struts.xml修改为:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <constant name="struts.devMode" value="true" />
  7. <package name="helloworld" extends="struts-default">
  8. <action name="hello"
  9. class="cn.w3cschool.struts2.HelloWorldAction"
  10. method="execute">
  11. <result name="success">/HelloWorld.jsp</result>
  12. <result name="error">/AccessDenied.jsp</result>
  13. </action>
  14. </package>
  15. </struts>

创建多个Actions

  1. 定义不同类
  1. package com.kfw5264.struts2;
  2. import com.opensymphony.xwork2.ActionSupport;
  3. class MyAction extends ActionSupport{
  4. public static String GOOD = SUCCESS;
  5. public static String BAD = ERROR;
  6. }
  7. public class HelloWorld extends ActionSupport{
  8. ...
  9. public String execute()
  10. {
  11. if ("SECRET".equals(name)) return MyAction.GOOD;
  12. return MyAction.BAD;
  13. }
  14. ...
  15. }
  16. public class SomeOtherClass extends ActionSupport{
  17. ...
  18. public String execute()
  19. {
  20. return MyAction.GOOD;
  21. }
  22. ...
  23. }
  1. xml配置action
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. struts>
  6. <constant name="struts.devMode" value="true" />
  7. <package name="helloworld" extends="struts-default">
  8. <action name="hello"
  9. class="cn.w3cschool.struts2.HelloWorld"
  10. method="execute">
  11. <result name="success">/HelloWorld.jsp</result>
  12. <result name="error">/AccessDenied.jsp</result>
  13. </action>
  14. <action name="something"
  15. class="cn.w3cschool.struts2.SomeOtherClass"
  16. method="execute">
  17. <result name="success">/Something.jsp</result>
  18. <result name="error">/AccessDenied.jsp</result>
  19. </action>
  20. </package>
  21. </struts>

struts2学习第一天的更多相关文章

  1. 【Java EE 学习 34】【struts2学习第一天】

    一.struts2简介 struts2是一个用来开发MVC应用程序的框架.它提供了Web应用程序开发过程中的一些常见问题的解决方案. 1.struts2的作用域范围:三层架构当中的第一层,相当于MVC ...

  2. Struts2 学习第一步准备工作

    第一步:安装下载MyEclispe10 对于MyEclispe的下载安装就不再详述了. 第二步:下载Struts-2.3.15 Struts-2.3.15下载地址: http://struts.apa ...

  3. Struts2学习第一天——struts2基本流程与配置

    struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实 ...

  4. Struts2学习第一天--Struts2的概述、Struts2的入门、Struts2常见的配置、Struts2的Action的编写

    action的name要与访问路径对应.hello.action. 加到tomcat启动 访问:http://localhost:8080/struts2-1/demo1/demo1.jsp 改为su ...

  5. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Struts2学习---拦截器+struts的工作流程+struts声明式异常处理

    这一节我们来看看拦截器,在讲这个之前我是准备先看struts的声明式异常处理的,但是我发现这个声明式异常处理就是由拦截器实现的,所以就将拦截器的内容放到了前面. 这一节的内容是这样的: 拦截器的介绍 ...

  7. Magento学习第一课——目录结构介绍

    Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...

  8. YII2学习第一天

    YII2学习第一天,之前稍微看了看TP,感觉和自己的理念不是很符合,然后转学YII2了. 使用的文档是https://github.com/yiisoft/yii2/tree/master/docs/ ...

  9. Java学习第一天

    Java学习第一天 对于网络管理员或者黑客必须知道的八个cmd命令 详情请参考:http://www.2cto.com/os/201608/533964.html          nbtstat  ...

随机推荐

  1. H5 数据存储localStorage

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. P1077 子串乘积正负分类

    题目描述 给你一个序列包含 \(n\) 个元素的序列 \(a_1, a_2, \dots , a_n\) (每个元素 \(a_i \ne 0\)). 你需要计算如下两个值: 有多少对数 \((l, r ...

  3. P1065 汪老师的烟

    题目描述 汪老师有n根烟,他每吸完一根烟就把烟蒂保存起来,\(k(k>1)\) 个烟蒂可以换一个新的烟,那么 汪老师 最终能吸到多少根烟呢? 输入格式 每组测试数据一行包括两个整数 \(n,k( ...

  4. Codeforces Round #564(div2)

    Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...

  5. navicat for mysql (10038)如何解决

    1.授权(youpassword修改为你的密码) #本机登陆mysql: $:mysql -u root -p #改变数据库: mysql>use mysql; #从所有主机: mysql> ...

  6. H3C 链路聚合分类

  7. 测试驱动开发实践—从testList开始

    [内容指引]运行单元测试:装配一条数据:模拟更多数据测试列表:测试无搜索列表:测试标准查询:测试高级查询. 一.运行单元测试 我们以文档分类(Category)这个领域类为例,示范如何通过编写测试用例 ...

  8. CF1088F Ehab and a weird weight formula

    CF1088F Ehab and a weird weight formula 推性质猜结论题 第一步转化,考虑把点的贡献加到边里: $con=\sum (log_2(dis(a_u,a_b))\ti ...

  9. LuoguP3066 逃跑的BarnRunning Away From…

    LuoguP3066 先吐槽一下,这道题名字好长啊 一个非常明显的思路,利用倍增数组不断向上跳.直到数值大于\(L\),然后直接差分统计答案就好了. 这种ZROI也考过,不多赘述了. 我们来考虑主席树 ...

  10. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...