Struts 2基础

第2章 Struts 2

此内容是《Java Web开发教程——入门与提高篇(JSP+Servlet)》一书附赠资料的一部分。

2.1概述

Struts现在分两个版本:Struts 1.X和Struts 2.X。Struts 1.X已经有很多年了,可以说非常流行,但是因为其他框架的快速发展以及自身存在的问题,Struts 2诞生了,Struts 2与Struts 1的区别非常大,实际上Struts 2的核心思想是基于另外一个非常成功的Web框架WebWork。两者的区别如表20.1所示。下面主要针对Struts 2进行介绍。

表2.1 Struts1和Struts2的比较

Feature

Struts 1

Struts 2

Action类

在Struts 1中要求Action类继承抽象的基类。在Struts 1中一个普遍存在的问题就是面向抽象类编程,而不是面向接口编程。

Struts 2中的Action可以实现一个Action接口,同时可以实现其他的接口,这样可以使用户有选择性地使用其它自定义的服务。Struts 2提供了基础类ActionSupport,该类实现了一些通用的接口。Action接口不是必须的。任何具有execute方法的POJO对象都可以用作Struts 2的Action对象。

线程模型

Struts 1的Actions是单例的,因为只有一个类的实例来处理所有对这个Action的请求,所以必须是线程安全的。单例策略对Struts 1的Action的能够完成的功能有很大限制,有些功能需要额外的努力才能完成。Action资源必须是线程安全的或者synchronized

Struts 2的Action对象是为每个请求实例化的,因此没有线程安全的问题。(在实践中,Servlet容器会为每个请求生成多个throw-away对象,增加的对象不会对性能产生太大影响或者对垃圾回收产生影响)

Servlet依赖

Struts 1的Action依赖Servlet API,因为当调用Action的execute方法时需要传参数HttpServletRequest和HttpServletResponse。

Struts 2的Action与容器不是紧密结合在一起的。多数情况下,servlet上下文被表示为Map对象,允许对Action进行独立的测试。如果需要,Struts 2的Action仍然可以访问原始的request和response对象。 然而,其它框架元素可以减少或者消除对HttpServetRequest和 HttpServletResponse对象进行直接访问的必要。

可测试性

测试Struts 1 Action的一个主要障碍就是execute方法使用了Servlet API。1个第三方扩展Struts TestCase,为Struts 1提供了一组模拟(mock)对象。

Struts 2的Action可以通过实例化、设置属性和调用方法进行测试。依赖注入支持使测试更简单。

获取输入

Struts 1使用ActionForm对象来获取输入。像Action一样,所有的ActionForm必须继承一个基类。因为其它的JavaBean不能用作ActionForm,开发人员经常需要创建多余的类来获取输入。可以使用动态Form来替换传统的ActionForm类,但是开发人员同样可能需要重新描述已有的JavaBean。

Struts 2使用Action的属性作为输入属性,不用创建第二个输入对象。输入属性可以是复杂的对象类型,还可以有自己的属性。可以在页面中通过taglib访问Action属性。Struts 2也支持ActionForm模式,以及POJO表单对象和POJO Action。复杂对象类型,包括业务或者域对象,都可以作为输入/输出对象。模型驱动的特性简化了标签库对POJO输入对象的引用。

表达式语言

Struts 1集成了JSTL,所以可以使用JSTL的EL语言,EL提供了基本的对象结构遍历(object graph traversal),但是集合以及索引属性支持比较弱。

Struts 2可以使用JSTL,同时Struts还支持另外一种功能更强大、使用更灵活的表达式语言,这种语言是Object Graph Notation Language,简称 OGNL。

值与视图的绑定

Struts 1使用了标准的JSP机制把对象与要访问的页面上下文绑定。

Struts 2使用了一种ValueStack技术,这样标签库不用把视图与要呈现的对象类型关联就可以访问值。ValueStack策略允许重用涉及多个类型的视图,这些类型可能有相同的属性名,但是属性类型不同。

类型转换

Struts 1的ActionForm属性通常都是字符串类型。Struts 1 使用Commons-Beanutils进行类型转换。转换器是针对每个类的,而不能为每个实例配置。

Struts 2使用OGNL进行类型转换,框架包含了常用对象类型和基本数据类型的转换器。

验证

Struts 1支持手动验证,通过ActionForm的validate方法或者通过继承通用的验证器来完成。对于同一个类可以有不同的验证上下文环境,但是不能链接到对子类型的验证。

Struts 2支持通过验证方法进行手工验证和XWork验证框架。Xwork验证框架支持对子属性的链接验证,使用为属性类型定义的验证规则和上下文。

Action执行的控制

Struts 1支持为每个模块提供独立的请求处理器(生命周期),但是同一个模块中的所有Action具有相同的生命周期。

Struts 2通过拦截器栈支持为每个Action创建不同的生命周期。必要的时候,可以使用不同的Actio创建和使用自定义栈。

注:来自Struts的官方网站:http://struts.apache.org/2.0.11.2/docs/comparing-struts-1-and-2.html

Strust 2结构图如图2.1(原图来自Strust 2文档)所示:

图2.1 Struts2结构图

在处理一个请求的时候,主要使用3个类:Action、Interceptor和Result

处理流程:

u 请求到达服务器之后,首先经过一系列过滤器,有的是可选的,最主要的过滤器是FilterDispatcher。所有的请求都会提交给它处理,该过滤器是在web.xml中配置的。配置代码如下:

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

u FilterDispatcher过滤器接收到请求之后调用ActionMapper查看是否需要调用Action。ActionMapper提供了HttpRequest与Action调用请求之间的映射关系,可以决定当前请求是否需要调用Action。如果ActionMapper返回的信息表明需要调用Action。FilterDispatcher过滤器把控制前交给ActionProxy;

u ActionProxy调用配置文件管理器ConfigurationManager,该管理器从struts.xml配置文件中获取配置信息,获取的信息主要包括当前请求对应哪个Action(对用户的请求进行处理),对应哪些Result(决定了如何对用户响应),有时候还涉及拦截器。然后根据这些信息创建ActionInvocation对象,该对象负责具体的调用过程。struts.xml是用户需要提供的最主要的配置文件。下面是一个struts.xml配置文件的部分内容。

<struts>

<package name="default" extends="struts-default">

<action name="Logon" class="mailreader2.Logon">

<result name="input">/pages/Logon.jsp</result>

<result name="cancel" type="redirectAction">Welcome</result>

<result type="redirectAction">MainMenu</result>

<result name="expired" type="chain">ChangePassword</result>

</action>

<action name="Logoff" class="mailreader2.Logoff">

<result type="redirectAction">Welcome</result>

</action>

</package>

</struts>

u ActionInvocation对象按照顺序执行当前请求所对应的拦截器,拦截器能够对请求进行预处理,例如验证、文件上传等,并能够对响应内容进行再处理。通常拦截器是由系统提供的,如果需要,编程人员只需要进行配置即可。在调用Action的方法之前,会调用拦截器的预处理方法;

u ActionInvocation对象调用拦截器的预处理方法之后会调用Action的execute方法,Action中的代码主要由编程人员根据功能进行编写的,通常从数据库检索信息或者向数据库存储信息。Action的方法返回一个字符串。下面是一个简单的Action例子。

package simple;

import java.util.Map;

import javax.servlet.http.HttpSession;

import com.opensymphony.webwork.ServletActionContext;

import com.opensymphony.xwork.ActionSupport;

public class LogoutAction extends ActionSupport {

public String execute() throws Exception {

Map session = ActionContext.getContext().getSession();

session.remove("logined");

session.remove("context");

return SUCCESS;

}

}

u ActionInvocation对象根据Action方法的返回结果以及struts配置文件生成Result对象。Result对象选择一个模板文件来响应用户,模板文件可以是JSP、FreeMarker和Velocity。

u 容器加载并执行模板文件,使用在Action中获取的信息对模版中的变量进行赋值,也可能从资源文件或者其他内部对象中获取信息。最终向浏览器呈现的是HTML、PDF或者其他内容。

u 模板文件执行的结果会经过拦截器进行再处理,最后通过过滤器返回给客户端。

在该结构图中,既包含了Struts框架提供的基础接口,也包括了用户要编写的文件。其中,ActionMapper、ActionProxy、ConfigurationManager、ActionInvocation和Result是框架提供的核心类。过滤器和拦截器是框架提供的,用户可以根据需要进行配置,当然也可以编写自己的过滤器和拦截器。用户需要编写的文件是struts.xml、Action和模板文件,这些也是用户在使用Struts 2框架时需要做的工作。

2.2 开发人员的主要任务

框架为开发人员提供了大量的辅助类,用户在使用框架开发的时候只需要编写很少文件。在使用Struts 2开发的时候,首先应该把环境搭建起来,然后使用Struts 2提供的标签开发界面,然后编写Action类,最后进行配置。

环境搭建

在进行具体的开发之前,需要先搭建环境。包括如下过程:

u 创建Web工程;

u 加载Struts 2的核心类库,核心类库包括commons-logging-1.0.4.jar、freemarker-2.3.8.jar、ognl-2.6.11.jar、struts2-core-2.0.11.2.jar和xwork-2.0.5.jar,把这些类库放到Web工程的WEB-INF/lib下面;

u 配置web.xml,主要配置Struts中心控制器FilterDispatcher,下面是1个例子。

<?xml version="1.0" encoding="UTF-8"?>

<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Struts Blank</display-name>

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

<welcome-file-list>

<welcome-file>index.html</welcome-file>

</welcome-file-list>

</web-app>

u 创建struts.xml配置文件,与类文件放在一起,空白的struts文件如下所示。在使用Struts 2进行开发所有的配置基本上都在这个文件中完成。也可以根据需要创建多个配置文件,然后在这个配置文件中使用<include file="example.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.enable.DynamicMethodInvocation" value="false" />

<constant name="struts.devMode" value="false" />

<include file="example.xml"/>

<!-- Add packages here -->

</struts>

环境搭建完之后,在具体开发过程中主要完成3个方面的工作:

u 制作模板文件,可以使用JSP、FreeMarker或者Velocity等;

u 编写Action,基本上每个动作对应1个Action;

u

struts2最常用的几个类库 初学者经常会为加struts类库感到迷茫。本人自己将最常用的类库打包。希望能帮到大家! 立即下载

相关推荐

海康威视4G摄像头直连实战:不用萤石云,手把手教你用ISUP SDK搞定跨网段视频流

本文详细介绍了如何通过海康威视ISUP SDK实现4G摄像头的直连通信,提供了一套零平台费、自主可控的技术方案。文章涵盖技术选型、设备端配置、服务器端开发及高级应用场景,特别适合中小型安防项目,帮助开发者解决跨网段视频流传输难题,降低长期运营成本。

weixin_27076351的博客 471

Struts 2 完整类库  以及配置解析

完整类库列表 下载地址:http://struts.apache.org/ antlr-2.7.2.jar commons-beanutils-1.6.jar commons-chain-1.1.jar commons-logging-1.0.4.jar commons-logging-api-1.1.jar commons-validator-1.3.0.jar freemarker-2.3.

小李子不是我 1063

BUUCTF reverse题解汇总

BUUCTF平台刷题过程中做的一些逆向题解的总结归类

于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。 1万+

struts2中的几个基础类

1、Action类定义了几个常量public interface Action{ public static final String SUCESS = "success"; public static final String ERROR = "error"; public static final String NONE = "none"; public static final String...

weixin_30538029的博客 307

CANoe SOME/IP实战:从ARXML到VCODM的完整配置与调试

本文详细介绍了使用CANoe进行SOME/IP通信测试的完整流程,从硬件环境准备、ARXML文件处理到VCODM文件配置与调试。通过实战技巧和常见问题解决方案,帮助工程师高效完成从ARXML到VCODM的配置,确保SOME/IP通信的稳定性和可靠性。

weixin_29169899的博客 467

思科9117AP从零配置EWC模式实战:Wi-Fi6网络搭建避坑指南

本文详细介绍了思科9117AP在Wi-Fi6网络环境下配置EWC模式的实战指南,涵盖镜像准备、网络环境配置、模式转换步骤及高级运维技巧。通过EWC模式,企业可实现控制器与AP的一体化部署,显著降低成本和简化运维,特别适合中小企业Wi-Fi6网络搭建。

weixin_28318011的博客 333

Struts2 基础入门

什么是Struts2 Struts2 是 Apache 软件组织推出的一个基于 MVC 模式的轻量级 Web 框架,自问世以来,就受到了广大 Web 开发者的欢迎。目前,Struts2 在 Java Web 开发领域中已占据了十分重要的地位。 目前为止,Struts 框架拥有两个主要版本:Struts1.x 和 Struts2.x。Struts1 是最早的基于 MVC 模式的轻量级 Web 框架,它能够合理划分代码结构,并包含验证框架、国际化框架等多种实用工具框架。 随着技术的不断进步,Struts1 的局

李鲤驴的博客 1743

利用RFIDIOt和NFC进行Hitag2密码暴力破解: Python代码实现

RFID即无线射频识别,是一种通信技术,可以通过无线电信号读取、捕获和保存终端上的信息。这项技术在物流、零售、医疗等领域有着广泛的应用。NFC即近场通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输。Hitag2是一种常见的RFID标签,广泛应用于汽车防盗系统、门禁系统等。由于其安全性在过去被广泛认可,很多设备都采用了这种标签。但近年来随着密码破解技术的发展,Hitag2的安全性受到了一些挑战。

qq_38334677的博客 1562

Struts2权威指南总结3:Struts2基础

1,struts1的mvc实现: Struts1是世界上最古老的mvc框架,出现于2001年。由ActionServlet作为核心API。 Struts1使用ActionForm接受请求参数。   2,WebWork WebWork以ServletDispatcher为核心。使用ServletDispatcher处理用户的所有请求,它是整个WebWork框架的核心控制器。 WebWor

您已进入防沉迷系统... 1400

PCL Fast Global Registration 快速全局配准(源码版)

Fast Global Registration(FGR)是一种经典的点云粗配准算法,已集成到Open3D和CloudCompare等软件中。本文介绍了该算法的源码实现及优化方法,包括如何通过修改源码直接读取点云进行配准,而不依赖文件中读取特征描述子。文章还提供了关键参数设置(如最大迭代次数、匹配距离等)。算法实现简单高效,未来计划发布基于纯PCL的版本。源码和论文链接已附上,供开发者参考。

点云侠的博客 383

Multisim14.0仿真应用设计(十六)74LS138译码器应用仿真

74LS138为3线-8线译码器。

zhusl6688的博客 2983

Struts2基础

一、简介   struts2是一个基于MVC设计模式的web应用框架   它的本质相当于一个servlet,在MVC设计模式中,struts2作为控制器(Controller)来建立模型与视图的数据交互。   struts2以Web Work为核心,采用拦截器的机制来处理用户请求,这样的设计也使得业务逻辑控制器能够与servletAPI完全脱离开。      web框架特点:     ...

weixin_30784141的博客 108

第9集:AI 驱动的智能日志分析!用 RAG 实现秒级日志检索与异常检测

文章摘要:AI驱动的智能日志分析系统 本文介绍了一个基于RAG(检索增强生成)技术的智能日志分析解决方案,旨在解决传统日志系统中的三大痛点:机械的关键词搜索、缺乏语义理解、告警与日志割裂。系统通过以下步骤实现: 环境准备:安装必要的Python依赖库,包括日志处理、Elasticsearch/Loki连接和时序异常检测工具。 核心设计:构建日志处理流水线,分为日志采集、向量化存储和AI检索分析三个阶段,创建专门的日志分析Agent。 技术实现:使用ChromaDB存储日志向量,通过HuggingFace E

qq_2937655951的博客 80

struts2基础

待整理

garage90的专栏 281

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Struts2基础知识整理

Struts2是基于MVC设计模式的WEB框架,这个框架的的核心就是J2EE的过滤器Filter,通过Filter把所有请求转交给Struts2来处理 要使用Struts首先我们先要导入JAR包,同样的,我把完整的Struts分享给大家:                    链接:https://pan.baidu.com/s/1rQQAlusPkggK4SODJz2tNA 密码:6fi3 ...

weixin_42668719的博客 412

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Struts2.x基础

【代码】Struts2.x基础。

bishe361的博客 361

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Struts2开发基础

Struts2开发基础 struts2采用拦截器的机制来处理用户的请求,使得业务逻辑控制器能够与ServletAPI完全脱离开。 1.HelloWorld! 配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_9" version="2.4...

weixin_30838873的博客 84

Struts2基础详解

Struts2版本 登录struts的官网,然后我们就能看到如下的内容。选择相应的安装包进行下载 Struts2应用开发步骤在web.xml文件中定义核心Filter来拦截用户请求 在web.xmlwen中配置如下片段 <!--定义struts2的核心Filter--> <filter> <filter-name>str

Emily的博客 462

Struts2目录结构和基础JAR包介绍

Struts2的官方下载网址为http://struts.apache.org,在该网址中可以下载最新版本的 Struts2。 下载成功后,将压缩包进行解压,解压后的目录如图 1 所示。 图 1Struts2 的文件夹结构 下面针对图 1 中所示的目录进行简单介绍,具体如表 1 所示。 表 1 Struts2 的目录介绍 名称 作用 apps 用于存放官方提供的 Struts2 示例程序,这些程序可以作为学习者的参考资料。各示例均为 war 文件,可以通过 zip 方式进行...

段远山 618

Struts2基础标签

1、Struts2基础标签 1)输出 --value属性中写的是OGNL表达式 假设Action中有userName属性 2)循环 --value属性中写的是OGNL表达式, 该表达式访问的是Action中的集合属性。 3)控制 --test属性中写的是OGNL表达式。 2、

u012162642的专栏 522
上一篇: 《Java Web开发教程——入门与提高篇(JSP+Servlet)》前言
下一篇: JDBC程序的常见错误及调试
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值