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代替。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Struts</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

struts2配置文件

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Struts</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

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.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>标签声明不同的包,这里的<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文件,并用以下方式导入他们:

<?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>
<include file="my-struts1.xml"/>
<include file="my-struts2.xml"/>
</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在哪里找到属性文件,它包含提示和错误消息

示例:

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

Action动作

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

action的两个重要功能:

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

创建Action

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

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

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

public interface Action(){
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final Stirng LOGIN = "login";
public String execute() throws Exception;
}

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

packge com.kfw5264.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{
private String name; public String excute() throws Exception{
if("SECRET".equals(name)){
return SUCCESS;
}else{
return ERROR;
}
} public String getName(){
return name;
} public void setName(String name){
this.name = name;
}
}

由于继承了ActionSupport类,所以我们可以使用String常量。此时,可以将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.w3cschool.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
<result name="error">/AccessDenied.jsp</result>
</action>
</package>
</struts>

创建多个Actions

  1. 定义不同类
package com.kfw5264.struts2;
import com.opensymphony.xwork2.ActionSupport; class MyAction extends ActionSupport{
public static String GOOD = SUCCESS;
public static String BAD = ERROR;
} public class HelloWorld extends ActionSupport{
...
public String execute()
{
if ("SECRET".equals(name)) return MyAction.GOOD;
return MyAction.BAD;
}
...
} public class SomeOtherClass extends ActionSupport{
...
public String execute()
{
return MyAction.GOOD;
}
...
}
  1. xml配置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="hello"
class="cn.w3cschool.struts2.HelloWorld"
method="execute">
<result name="success">/HelloWorld.jsp</result>
<result name="error">/AccessDenied.jsp</result>
</action>
<action name="something"
class="cn.w3cschool.struts2.SomeOtherClass"
method="execute">
<result name="success">/Something.jsp</result>
<result name="error">/AccessDenied.jsp</result>
</action>
</package>
</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. 无限调用函数add(1)(2)(3)......

    无限调用函数,并且累计结果 其实这也算一道面试题吧,笔者曾经被提问过,可惜当时没能答上来...

  2. P1088 上台阶

    题目描述 楼梯有 \(n(1 \le n \le 50)\) 阶台阶,上楼时可以一步上 \(1\) 阶,也可以一步上 \(2\) 阶,也可以一步上 \(3\) 阶,编程计算共有多少种不同的走法. 输入 ...

  3. Postman:非专业的并发测试

    Postman是开发中常用的接口测试工具,也可以用来进行并发测试. 使用方法如下: 1. 直接输入url 选择GET方法,点击Send. 结果打印一个"test",如下: 2. 使 ...

  4. CUP计算资源争抢通过IIS启用处理器关联解决

    由于业务的复杂性,我们在客户环境部署的时候,采用的是预装好在一台机器然后再把机器安装到客户环境,所以为了简单方便,我们把所有的服务都安装到一台机器上面了. 在正常的使用过程中是没有任何问题的.但是当有 ...

  5. 复盘:错误理解zuul路径匹配,无法使用zuul

    场景: 项目中用到zuul时,配置url总是有问题,无法路由到对应微服务. 配置如下: zuul: routes: m2-member: path: /member/* serviceId: m2-m ...

  6. boostrap-非常好用但是容易让人忽略的地方【2】:row

    row是非常好用但是却非常容易忽略的地方. 想实现内部元素相对父级的padding=0,则在父子中间加个row.如下图 列嵌套也是同样的道理 经验之谈:学会row的用法,在手机版布局的时候会很方便,否 ...

  7. Visual Studio 2019使用docker开发(vsdbg的问题)

    前言 vsdbg在国内下载的速度真的很慢,借助迅雷也没办法起飞. 这里还是来探讨下如何用迅雷进行下载以后安装操作. 遇到的状况 在使用Visual Studio 2019进行开发调试(https:// ...

  8. Centos 7.5安装 Redis 5.0.0

    1 我的环境  1.1 linux(腾讯云) CentOS Linux release 7.5.1804 (Core)  1.2 Redis Redis 5.0.0 2 下载 官网 官网下载地址 3 ...

  9. $AT2163\ Median\ Pyramid\ Easy$ 构造

    正解:构造 解题报告: 传送门$QwQ$ 考虑如果有两个相邻格子是相同数字那么它们以上这两列就都会是这列数字(显然$QwQ$? 所以考虑只要构造出第$n-1$行的中心和中心右侧($or$左侧一样的$Q ...

  10. 电信NBIOT平台的CA证书上传-消息订阅回调地址检测503错误

    在NBIOT北向开发过程中,遇到消息订阅回调地址检测503错误,经过论坛查询与文档查阅一直都没有解决问题,大多人都说是RESTful地址格式问题,但其实不是.最终发现是我们在电信平台创建应用时,上传C ...