计应134(实验班) 李佳鸿

Action类—Struts组件
在RequestProcessor类预处理请求时,在创建了Action的实例后,就调用自身的processActionPerform()方法,该方法再调用Action类的execute()。
Action的execute()方法调用模型的业务方法,完成用户请求,然后根据执行结果把请求转发给其他合适的WEB组件。
创建支持多线程的Action
1.什么是线程安全的代码 在多线程环境下能正确执行的代码就是线程安全的。 安全的意思是能正确执行,否则后果是程序执行错误,可能出现各种异常情况。
2.如何编写线程安全的代码 很多相关的书籍里都详细的讲解如何同步线程对共享资源的使用以及synchronized关键字的各种用法,锁的概念等。 Java1.5中也提供读写锁这类的工具类。这些都需要较高的技巧,而且相对难于调试。 但是,线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中,如不需要同步在编写的容易度和性能上会更好些。 我接下来强调的是什么代码是线程安全的、是不需要同步的。
如下:
1)常量始终是线程安全的,因为只存在读操作。
2)对构造器的访问(new 操作)是线程安全的,因为每次都新建一个实例,不会访问共享的资源。
3)最重要的是:局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量。
Servlet是在多线程环境下的。即可能有多个请求发给一个servlet实例,每个请求是一个线程。 struts1下的action也类似,同样在多线程环境下,你也必须编写线程安全的Action类(不过这一问题在struts下已经解决)。 保证线程安全的原则就是仅仅使用局部变量,谨慎使用实例变量(拥有状态的实例,尤其是拥有业务对象状态的实例). 如果要用到那些有状态的实例,唯一和最好的办法是在Action类中,仅仅在Action类的execute()方法中使用局部变量,对于每个调用execute()方法的线程,JVM会在每个线程的堆栈中创建局部变量,因此每个线程拥有独立的局部变量,不会被其他线程共享.当线程执行完execute()方法后,它的局部变量就会被销毁. 如果Action类的实例变量是必须的话,需要采用JAVA同步机制(synchronized)对访问共享资源的代码块进行同步。
三、Struts1的几种Action Struts提供了一些现成的Action类,直接使用可以大大节省时间,如下 ForwardAction 可以转发到其他web组件,仅仅提供一个转发功能,不作处理。 IncludeAction 包含其他web组件。 DiapatchAction 通常一个Action只完成一个操作,用这个Action可以完成一组相关的操作。 LookupDispatchAction 他是DiapatchAction的子类,也可以定义多个方法,但主要用于一个表单里有多个按钮,而这些按钮又有一个共同的名字的场合。 SwitchAction 用于子模块之间的切换。
四.ActionForward类 Action类的execute()方法返回一个ActionForward对象,它代表了web资源的逻辑抽象,这里的web资源可以是jsp页面、 Java servlet、或Action。 从execute返回ActionForward可以有两种方法。
1) 动态创建一个ActionForward实例 return new ActionForward(”Failure”,”login.jsp”,true);
2) 调用ActionMapping实例的findForward方法 这个方法先从action级别找,然后在<global-forwards />级别找 return mapping.findForward(“Failure”);
 
Struts2请求处理示意图:

一.Action的创建

Struts2中的Action类用来接收用户请求,然后调用模型组件去处理业务逻辑,最后返回一个字符串,Struts2框架会根据字符串的值调用相应的页面进行显示。

Action类中包含一个execute方法,在业务控制器处理完用户请求后,根据不同的处理结果返回不同的字符串。

在Struts2中,Action以多种方式存在,例如Java类充当Action、继承ActionSupport实现Action接口和Action。

Struts2配置Action如下图:

处理请求的类的代码如下图:

二.Action的多方法调用

其中,name属性是必需的,其他属性是可选的。在为Action取名时,名字一般符合命名规则,不要使用点号和斜杠。

method属性是可选属性,如果没有配置method属性,所有请求都将要转发到Action的execute方法处理。

Action中的一个方法代表一个业务逻辑,那么模块中的多个业务逻辑如何用Action来处理呢?

(1)一个Action对应一个业务逻辑,实现方便,但是Action数量多,这种方法不推荐。如下图:

(2)一个Action对应多个业务逻辑,每个业务逻辑对应一个方法,方法的原型要和execute()的方法一样,在视图中调用相应的Action方法为“Action名称!方法名称.action”。action多方法调用如下图:

三、Result类型

Struts2的Action处理用户请求后返回一个字符串,必须在Struts.xml配置文件中进行字符串与实际视图的映射,才能完成实际的控制器功能。在配置文件中是通过action的子元素result来完成此功能的,其格式如下(第一条是跳转向action,第二条是跳向jsp网页):

其中的type属性有多种选择。

Action的创建和配置的更多相关文章

  1. Android零基础入门第73节:Activity初入门,创建和配置如此简单

    Activity是Android应用的重要组成单元之一,也是Android应用最常见的组件之一.前面看到的示例通常都只包含一个Activity或一个AppCompatActivity,但在实际应用中这 ...

  2. Servlet过滤器,Servlet过滤器创建和配置

    第一:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的3个方法.        第一方法是过滤器中的init()方法用 ...

  3. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)

    IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...

  4. Acitivity创建与配置

    •Activity的创建和配置 –Activity提供了和用户交互的可视化界面.创建一个Activity一般是继承Activity(当然也可以继承ListActivity.MapActivity等), ...

  5. 什么是Servlet,Servlet的作用,生命周期,如何创建、配置Servlet

    什么是Servlet,作用是? servlet是一个基于java技术的WEB组件,运行在服务器端,我们利用 sevlet可以很轻松的扩展WEB服务器的功能,使它满足特定的应用需要.servlet由se ...

  6. ios中pch文件的创建与配置

     PCH文件(Precompile Prefix Header File),也就是预编译头文件,其作用就是,方便你一次性导入在多个文件中同时用到的头文件.宏或者URL地址等(全局使用),可以有效的帮你 ...

  7. IDEA如何创建及配置Web项目(多图)

    正文之前 在学习Java Web时,第一个遇到的问题就是如何创建或配置Web项目了,今天,就用IntelliJ IDEA 来进行Web项目配置: 创建Web项目 配置web项目 正文 创建Web项目 ...

  8. Spring Boot 多模块项目创建与配置 (一) (转)

    Spring Boot 多模块项目创建与配置 (一) 最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都 ...

  9. Spring Boot 多模块项目创建与配置 (一)

    最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都使用spring boot框架.之前有零零散散学过一些 ...

随机推荐

  1. easyUI 初始化的两种方式

    easyUI 初始化的两种方式: class方式和js方式: <!DOCTYPE html> <html lang="en"> <head> & ...

  2. Mybatis拦截器实现分页

    本文介绍使用Mybatis拦截器,实现分页:并且在dao层,直接返回自定义的分页对象. 最终dao层结果: public interface ModelMapper { Page<Model&g ...

  3. TypeScript教程2

    在TS中,我们允许开发人员使用面向对象技术. 1.类让我们看看一个简单的基于类的例子: class Greeter { greeting: string; constructor(message: s ...

  4. Exiting the Matrix: Introducing Metasploit's Hardware Bridge

    Metasploit is an amazing tool. You can use it to maneuver through vast networks, pivoting through se ...

  5. asp.net core mvc权限控制:分配权限

    前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Ident ...

  6. iOS Plist 文件的 增 删 改

    一:Plist 文件的创建 Plist 文件作为我们IOS开发的一种数据存储文件,还是经常会用到的.在看<X-code江湖录>的时候,看到了这一点.自己就写了一下,把写的东西分享出来!先看 ...

  7. 【翻译】Jay Kreps - 为何流处理中局部状态是必要的

    译者注: 原文作者是 Jay Kreps,也是那篇著名的<The Log: What every software engineer should know about real-time da ...

  8. View Controller Transition:京东加购物车效果

    冬天已经过去了,阳光越来越暖洋洋的了.还记得上学的时候,老师总说"春天是播种的季节",而我还没在朋友圈许下什么愿望.一年了,不敢想象回首还能看到点什么,所以勇往直前.当被俗世所扰, ...

  9. java中浅层克隆和深层克隆

    1.浅复制与深复制概念 浅复制(浅克隆)     被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象 ...

  10. WPF - 监听判断键盘组合键的按下

    对于键盘事件PreviewKeyDown.PreviewKeyUp.KeyDown.KeyUp,在其中检查当次事件是哪个按键触发的很简单,只需要判断KeyEventArgs类型的事件参数e的Key属性 ...