Struts2 学习笔记

1)Strust2是以WebWork为核心,采用拦截器的机制对用户请求进行处理。

2)Struts2框架结构:

3)简单来看整个Struts2的处理过程可以简单的理解为

  •   用户的请求发送给对应的Action
  •   Action接收到请求,执行对应的函数,返回相应的字符串
  •   Action根据返回的字符串再Struts.xml中找到相应的跳转目录
  •   Action跳转到对应的显示视窗

3)Strust2的控制器组件是Struts2整个框架的核心,由两部分组成:

  •     核心控制器SturtsPrepareAndExecuteFilter
  •     业务控制器Action

4)核心控制器SturtsPrepareAndExecuteFilter实际上是一个Servlet过滤器,需再Web.xml中配置。 5)Action是由用户定义的业务控制器,由三种实现方式:

  •     普通的POJO类,通常包含一个无参数的execute()方法,返回值为字符串类型
  •     继承ActionSupport类(含有一个execute()方法和Validate()方法)
  •     实现Action接口

6)Struts2使Action不再与任何Servlet API耦合,该框架可以通过ActionContext类来访问Servlet API。

    ActionContext提供了读写Servlet API中

  • HttpServletResquest
  • HttpSession
  • ServletContext

    中的数据的方法

  同时Struts框架还提供了能直接访问Servlet API的接口:

  • ServletContextAware--->ServletContext
  • ServletRequestAware---->ServletRequest
  • ServletResponseAware--->ServletResponse

7)Struts 2配置文件使用package来组织Action,Struts2配置文件中的包就是由多个Action,多个拦截器,过个拦截器的引用组成的集合。

  package含有name、extends、namespace、abstract三个属性

  •   关于继承(extends):定义包时通常应该继承struts-default包。
  •   关于抽象包(abstract=true):该包中不能包含Action定义。

注意:struts.xml是从上往下解析的,所以父包应该再子包的前面定义,如果再同一个包中配置了两个name相同的Action,则后一个会覆盖前一个。

  •   关于命名空间(namespace):同一个命名空间不能由同名的Action,不同的命名空间可以由同名的Action,以解决同一个包下多个同名Action的问题。

     若没有指定命名空间(namespace="/"),则默认为默认的命名空间。

     配置命名空间后,Strust2会按如下的顺序搜索Action:

       指定的命名空间----->默认的命名空间-------->报错

8)Struts方法的动态调度:

  使用动态方法调用的前提:

    struts.xml中配置<constant name="struts.enbale.DynamicMethodInvocation" value="true"/>

actionName!methodName.action

例如:

<a href="product!edit.action?productID=1001"></a>

  表示调用productAction下的edit方法来处理请求,并传递一个参数,参数名为productID,值为1001

9)通配符的使用

  假若声明如下action:

<package name="product" extends="struts-default" namespace="/">

      <action name="*product" class="action.ProductAction" method="{1}">

        <result>/{1}.jsp</result>

      </action>

  </package>

  若用户的请求URL为delproduct.action,则匹配模式中的第1个*为del,因此调用的方法为该action下的del方法,返回的页面为del.jsp。

10)根据result元素再struts.xml文件中的位置不同,可以将result分为

  •     局部result---->将元素作为<action>元素中的一员
  •     全局result---->将元素作为<global-results>元素中的一员

如果一个Action包含了与全局result同名的局部result,则局部会覆盖全局。

  搜索顺序:指定Action局部——————>全局

11)result中含有两个属性:name、type。name默认为success、type默认为dispacher。

  type常用的类型:

  • dispatcher:用于整合JSP技术
  • redirect:用于重定向到其他URL、与dispatcher的区别是转发和重定向的区别。redirect属于重定向。Action处理的结果会丢失。
  • redirectAction:采用ActionMapperFactory提供的ActionMapper进行重定向,重定向到另一个Aciton

                配置redirectAction类型需要actionName、namespace两个参数

12)Struts依靠配置<exception-mapping>元素捕获异常:需指定两个属性:exception和result。

    例如:

<action name="login" class="action.loginAction">     <exception-mapping result="error" exception="java.lang.Exception"/>

    <result>/ok.jsp</result>     <result name="error">/error.jsp</result>

  </action>

    则需要在login Action中throw 相关的Exception,则会跳转到error.jsp页面。

  异常映射也分全局和局部,分别是

    局部:<exception-mapping>元素作为<action>元素的子元素。

    全局:<exception-mapping>元素作为<global-exception-mapping>元素的子元素。

   同样,前者会覆盖同名的后者。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nnngu

02 Java类的加载机制

1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Cla...

3007
来自专栏从零开始学自动化测试

pytest文档14-函数传参和fixture传参数request

为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数。 比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其...

4802
来自专栏python百例

01-Hello World

python的语法逻辑完全靠缩进,建议缩进4个空格。 如果是顶级代码,那么必须顶格书写,哪怕只有一个空格也会有语法错误。 下面示例中,满足if条件要输出两行...

1621
来自专栏IT笔记

Linux下安装Redis3

下载 下载地址 http://redis.io/download Linux 下执行 wget http://download.redis.io/relea...

3735
来自专栏程序员互动联盟

【专业技术】Android webkit处理汉字编码问题

在XX项目中解决android webkit处理汉字编码问题的总结 1.问题: 服务器通过302重定向方式发送给客户端重定向地址,地址中的汉字采用原数据方式发送...

3396
来自专栏青玉伏案

iOS开发之Alamofire源码解析

今天博客中的Alamofire源码的版本是以3.4版本为例。上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看《详解NSURLSess...

2997
来自专栏Jimoer

JVM学习记录-线程安全与锁优化(一)

线程:程序流执行的最小单元。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I...

772
来自专栏微信公众号:Java团长

Java网络爬虫基础知识

Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分。例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 Apa...

1572
来自专栏逸鹏说道

C# 温故而知新: 线程篇(二) 上

线程池和异步线程 目录: 1 什么是CLR线程池? 2 简单介绍下线程池各个优点的实现细节 3 线程池ThreadPool的常用方法介绍 4 简单理解下异步线程...

3219
来自专栏Golang语言社区

Go性能优化小结

做过C/C++的同学可能知道,小对象在堆上频繁地申请释放,会造成内存碎片(有的叫空洞),导致分配大的对象时无法申请到连续的内存空间,一般建议是采用内存池。Go ...

3013

扫码关注云+社区

领取腾讯云代金券