深入浅出struts2

1.struts2简介

2.struts2流程

3.struts2核心概念


一、struts简介

struts2是由Apache软件基金会开发的一个基于MVC模式的轻量级Java EE框架,struts2在struts1的基础上,借鉴了WebWork的很多有点发展而来,但与struts2有着明显的区别。struts2中Action类的execute()方法不再依赖于Servlet API,大大降低了耦合性; 引入了拦截器机制; 提供了更为强大的数据校验功能; 发布了全新的标签和OGNL表达式; 另外还支持Ajax等。说了这么多struts2,来说一下它的替代技术,spring mvc。单从名字上就能看出,它也是一个mvc框架。有人推荐struts2,有人推荐spring mvc,在我看来,这两个就像是风格各异的美女,各有她婀娜多姿的一面。


二、struts2流程

学习struts2之前,最好先把它的工作流程了解一下。


上图中有一点需要指出:org.apache.struts2.dispatcher.FileterDispatcher核心过滤器只在struts2.1.3版本以前使用,在后续版本中使用的核心过滤器更改为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

如上图所示,struts2的具体执行过程可以分为以下几步:

第一步:客户端向web容器(如tomcat)发送请求(如访问index.jsp)

第二步:请求经过一系列的过滤器过滤之后,把该请求传递给struts2的核心过滤器StrutsPrepareAndExecuteFilter

第三步:核心过滤器接收到请求信息之后,根据请求的url(如/login/HelloAction)搜索Action的映射信息。

第四步:找到对应的映射信息,则在struts.xml中对应的Action被实例化,并且执行该action的execute方法(如何没有指定任何方法的话,则默认执行该方法),处理用户请求信息。另外在action对象被调用前后,interceptors也会被先后执行。

第五步:action对请求处理完毕以后返回一个逻辑视图(说白了就是一个字符串),该逻辑视图在struts.xml文件中相应的<result>元素中寻找对象的物理视图(这个物理视图既可以是JSP/HTML页面,也可以是Freemarker/Velocity模板,甚至可以是Action),并返回给客户端

注释:学习struts2,把上面那张图中各个部分的细节都掌握了,寓意着你真正掌握了struts2。


三、struts2的核心概念

先说一下web.xml,web应用程序在启动tomcat服务器时,首先会建在web.xml文件。在web.xml文件中配置struts2的核心控制器StrutsPrepareAndExecueFilter,然后这个控制器就会加载整个struts2框架。

然后再说一下struts.xml,它一般放在web应用的类加载路径下,通常web应用编译之后放在WEB-INF/classes路径下。在eclipse中,把它放在src目录下即可。

struts.xml的配置

常用的配置元素和功能:

include元素:包含其他的xml配置文件

constant元素:配置常量信息

package元素:包含一系列的Action及拦截器配置信息,便于对action进行统一管理

default-action-ref元素:配置默认的action

default-interceptor-ref元素:配置默认的拦截器,对package范围内的所有action有效

global-results元素:配置全局结果集,对package范围内的所有action有效

interceptors,interceptor,interceptor-stack,interceptor-ref:都和拦截器相关

action:包含于action操作相关的一系列配置信息

result元素:配置action的结果映射,嵌套在<action>元素内

param元素:配置参数信息


重点说一下action

在struts2中,action作为业务逻辑控制器,是整个struts2应用的核心。action本质上就是一个java类,一个继承了ActionSupport类的java类(当然也可以实现action接口)。

关于action和ActionSupport的具体代码,可以去struts2的安装包中查看。注:在ActionSupport类中除了实现Action接口之外,还增加了获取国际化信息的方法getText(),输入校验的方法validate()方法等等。

[java]  view plain  copy
  1. package com.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class UserAction extends ActionSupport{  
  6.     private String username;  
  7.     private String password;  
  8.     public String getUsername() {  
  9.         return username;  
  10.     }  
  11.     public void setUsername(String username) {  
  12.         this.username = username;  
  13.     }  
  14.     public String getPassword() {  
  15.         return password;  
  16.     }  
  17.     public void setPassword(String password) {  
  18.         this.password = password;  
  19.     }  
  20.     public String Execute() throws Exception  
  21.     {  
  22.         return SUCCESS;  
  23.     }  
  24.   
  25. }  
上面就是一个灰常简单的action代码示例,其实不提供私有属性,只要提供相应的get/set方法即可,但是为了方便理解,还是加上吧。

在action中你还可以实现其它的方法,想想看,一个action不可能只负责一个业务逻辑处理,如果一个action仅仅负责一个单一的功能的话,那得定义多少个action呀!!!!

接下来就是如何调用含有多个方法的action

一种是动态调用方式(不太提倡),另一种就是指定method属性方式

看下面struts.xml中的一段代码:

[html]  view plain  copy
  1. <package name="default" namespace="/" extends="struts-default">  
  2.         <action name="loginAction" class="com.action.UserAction" method="login">  
  3.             <result name="student">/hwshow.jsp</result>  
  4.             <result name="teacher">/teacher.jsp</result>  
  5.             <result name="error">/error.jsp</result>  
  6.         </action>  
  7.         <action name="registAction" class="com.action.UserAction" method="regist">  
  8.             <result name="regist">/login.jsp</result>  
  9.         </action>  
  10. </package>  
loginAction和registAction对应的具体类都为com.action.UserAction。通过为action指定不同的方法名,来调用同一个action中不同的方法。说明几点:一 package的namespace和action的name共同组成的访问该action的url。二 package的extends属性为struts-default 说明该包继承struts-default包,那么该包会自动加载defaultStack拦截器栈。


注入action属性值在这里就不再赘述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值