struts2的深入学习(一)

本文深入解析Struts2框架的配置流程,包括配置文件加载顺序及覆盖规则,并详细介绍struts.xml配置细节与Action创建方法。同时探讨了如何在Struts2中获取Servlet API和前端参数的不同方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、struts2配置文件的调用流程

在struts2开始的学习中,我在eclipse中将StrutsPrepareAndExecuteFilter类关联了源码。查看源码,在init()方法中,找到初始化该类的核心对象Dispatcher
dispatcher = init.initDispatcher(config);
进入方法,最终找到该对象的初始化顺序

Dispactcher初始化
[1] 该方法加载default.properties这个文件。这个文件主要记录struts2运行时所需要的参数
[2] 该方法加载:struts-default.xml/struts-plugin.xml(struts2引入的插件的配置文件)/struts.xml三个文件
[3] 加载struts.properties文件,与struts.xml选其一即可,一般选用struts.xml
[5] struts自定义配置文件
[6] web.xml文件的加载
[7] 加载struts框架的bean

目标:现阶段了解[1]、[2]、[6]阶段

后加载的配置文件中的属性可以覆盖先加载的配置文件中的属性。
就是说,如果想修改default.properties这里定义的变量的值,可以在struts.xml或者是web.xml中修改。
default.properties文件中的定义的变量都是常量,下面尝试把访问action的url的后缀中的action,修改为do后缀

default.properties中的常量及其注解
url结尾方式

1.在struts.xml文件中修改
struts.xml修改1

2.在web.xml中修改
web.xml修改1

以上两种方法,都成功的更改了url的后缀
url修改1

二、struts2的struts.xml文件的详细配置和Action的创建

action的相关配置,比基础篇更加详细

1.增加method属性

重新更改struts.xml,同包下新增两个action,action标签中增加method属性,method的值会决定Action类中哪个方法去执行请求,如果不写method则默认,method=“execute”
增加method方法

新建一个SecondAction类
SecondAction

进行测试
前台成功跳转
前台测试
后台成功打印“add…”
后台测试
此时我的理解是一个action标签对应一个Action类中的一个方法

2.加深action理解

action就是mvc中的控制器(controller)
在创建action时,要继承ActionSupport类,我关联该类的源码,可以看到这个类是struts2提供的action的基类,主要是因为实现了com.opensymphony.xwork2.Action接口
ActionSupport类
从这里看,我们可以自己编写一个类,去实现这个接口,就能创建Action,但不建议。因为ActionSupport中已经定义了很多方法,我们只要创建一个类,继承ActionSupprt即可。这样固然开发方便,但是编写的Action和struts2紧紧的后耦合在一起。

3.result标签

从action跳转到指定的页面,默认情况是使用转发,即默认省略type=“dispatcher”
其中type属性的五种常见值,chain(转发)转发到Action、dispatcher(转发)转发到jsp、redirectAction(重定向)重定向到Action、redirect(重定向)重定向到jsp、stream(下载)

<action name="loginAction" class="com.zl.action.LoginAction">
            <result type="dispatcher">/index.jsp</result>
</action>
三、获取servlet原生的api

在struts2中如何获取servlet原生的api(request、response、session)

1.可以使用ServletActionContext这个类
原生api

2.实现接口
方法2

两种方式相比较,第一种方式较为简便

注意,使用ActionContext这个对象获取的apllication不是原生的api,只是一个Map集合
ActionContext

四、struts2如何获取前台传递的参数

当然可以使用servelt原生api获取参数,不仅如此,struts2还提供了两种封装参数的方法。

1.属性驱动:

把参数作为action的属性,把Action作为model处理。此时Action既是controller,又是model。注意:使用这种方式的前提是,前台产地的参数名称和后台对应属性的名称保持一致

属性驱动方式一

新建前台login.jsp文件
login.jsp
新建一个User实体类,私有username和password属性,添加无参构造器,添加get/set方法(实体类以后博客不会附图)
User实体类
struts.xml文件
struts.xml
新建LoginAction类
LoginAction
配置完成,开始测试,后台成功输出,此时的LoginAction类显得特别臃肿

属性驱动方式二
修改login.jsp
login.jsp
修改LoginAction
LoginAction
经测试成功获得参数。此时login.jsp中input标签的name属性为user.password,是ognl表达式。虽然struts2框架支持ognl表达式,但很多框架不支持,使用ognl表达式会使jsp页面不通用,建议使用el表达式

2.模型驱动:

1.要求Action实现ModelDriven接口,这个接口需要传入泛型,传入需要封装的对象,然后实现接口的方法返回对象和传入泛型一致
2.创建返回的对象作为Action的属性,注意,返回的对象一定要实例化

修改login.jsp
login.jsp
让LoginAction类实现ModelDriven接口
LoginAction
经测试,成功获得参数。这种方式的缺点显而易见,就是ModelDriven的泛型只可能是一个

通过上面的几个测试,发现每一种方式都有其缺点,但如果只有一个实体类的话,还是使用模型驱动来获得参数较好

五、总结

每一次的学习,都会有新的知识,而且有的只是学会如何使用。但我知道,其中很多的来由都不是现在我能理解的,所以,我要先学会怎样使用,希望等到以后再来看的时候,可以豁然开朗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值