Struts2

Posted 我爱学日本语

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2相关的知识,希望对你有一定的参考价值。

前言

Struts2是一个相对流行的MVC框架。在说Struts2之前,我们先回顾一下传统的servlet/jsp实现的MVC架构,其运行机制是:jsp页面(视图view)发送消息到servlet(控制器Controller),servlet获取请求数据,处理业务逻辑,分发转向。这样的话,servlet就太臃肿了,什么活儿都是servlet在干,而且业务逻辑全是硬编码,代码都写死了不利于维护。

Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP交换协议,The Java Servlet API揭示了Java Servlet只是Java API的一个很小子集,这样我们可以在业务逻辑部分使用功能强大的Java语言进行程序设计。

    二是提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所以请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。

   因为struts2有这样目标,并且有这样的优势,所以,这是我们学习struts2的理由,下面,我们在深入剖析一下struts的工作原理。

工作原理

 

Struts2


 

 

 

默认拦截器 
struts-default.xml配置文件中定义了一个默认拦截器栈,这些拦截器就是动作方法执行之前的要执行的。常用的有封装用户表单数据到javabean的modelDriven拦截器,用于输入验证的validation拦截器,等等。

View和Controller之间的交互 
从视图页面每次发来的用户请求都会产生一些数据,这些数据都存放在哪儿呢?实际上,每次动作类执行前,核心过滤器StrutsPrepareAndExecuteFilter都会创建2个对象:ActionContext和ValueStack,这2个对象存储了动作访问期间用到的所有数据。这些数据又可以在jsp页面上通过strut标签和OGNL表达式来取得。

1),ActionContext是一个map数据结构,其中的key是一些常见的域对象(application,session,request等),而value又是一个map。也就是说ActionContext是一个大map包裹着一些小map。

2),ValueStack是一个ArrayList数据结构,并且是一个栈结构,每次都在栈顶存取数据。

Controller与Model之间的交互 
C和M之间的交互比较简单,利用Struts框架提供的拦截器:ModelDriven,即可实现将用户表单提交的数据封装到对应的javabean中。要点:(1)javabean类自己编写。(2)动作类要实现ModelDriven接口。(3)实现抽象方法getModel()。

案例

首先,我们分别讨论使用三种方式接受参数:
1.使用Action的属性接收参数
2.使用DomainModel接收参数
3.使用ModelDriven接收参数

准备工作:

success.jsp:

 

Struts2


index.jsp:

 

Struts2


配置struts.xml:

 

Struts2


1. 使用Action的属性接收参数
首先我们新建一个IndexAction.java并继承ActionSupport:

 

Struts2


然后启动tomact,运行程序,我们可以看到后台有输出,并且页面成功跳转。这说明了我们已经能够通过这种方式获取参数了,但是假如我们有些页面非常的大,有几十个甚至上百个,那么这个时候我们是不是要建上百个属性呢?所以这种方法对于我们开发是非常复杂的,当然也不利于维护。

 

曾经我们说过,Java是一种面向对象的语言,那么我们能不能把这些属性放在一个对象里面,来实现各方面的开发呢?答案是肯定可以的。这就牵扯到我们的第二种方式:

 

2.使用DomainModel接收参数

修改后的IndexAction.java

 

Struts2


独立出来的用户(User)类:

 

Struts2


现在我们停下来想一下,假如说我们现在什么都不改,那么我们通过jsp中的提交方式能不能自动往private User user;里面传递参数呢?答案是肯定不行的,因为假如说我们有多个对象,每个对象都有这样的参数的话,它传递到private User user;里面的参数都赋值的话,就肯定会乱。那么我们怎么指定呢?我们可以修改index.jsp里面的属性名称:

 

Struts2


这样就代表我们的usernamepassword是出入到private User user;这个参数对象里面的,而不是其他的参数对象里面。

 

然后启动tomact,运行程序,我们可以看到后台有输出,并且页面成功跳转。说明这种方式也是可行的。

 

3.使用ModelDriven接收参数

修改后的IndexAction.java

 

Struts2


然后启动tomact,运行程序,我们可以看到后台有输出,并且页面成功跳转。

如果说我们传入的参数是一个集合怎么办呢?我们可以这样:


User.java里面添加一个成员变量,并实现getters和setters方法:

 Struts2


修改后的index.jsp:

 

Struts2



修改后的IndexAction.java:

 



再次启动tomcat并运行程序,控制台成功打印输出。那么如果private List<String> booklist→private List<User> booklist呢?也就是说传入的是一个对象呢?怎么修改index.jspIndexAction.java来测试是否成功呢?这个问题就留给读者们思考啦。

 

经过三种传参的对比,在实际应用中我们一般使用ModelDriven接收参数,为什么呢?因为低耦合高内聚啊。
PS:别问我什么是低耦合高内聚是什么,我会满脸黑线的...



 

  我爱学日本语 
微信公众号:「我爱学日本语」

    分享 日本IT情况,技术情况,日语学习,以及日本风土人情的介绍,欢迎大家积极转发,关注,详细解释可以咨询微信 yoyo19841028
公众号回复“投稿”即可投稿
 ▼长按二维码关注我们↓↓↓





 

 

 


以上是关于Struts2的主要内容,如果未能解决你的问题,请参考以下文章

Struts2struts2处理请求参数及其校验

struts2struts2中的流接收与流发送

Struts2Struts2与Spring整合后,如何指定Action为多例模式

ssh整合

JAVA中框架总结

Struts2学习笔记