刚接触STRUTS,下面代码有几点不懂,希望帮忙解释解释.
//为什么所有的action都要继承Action? public class LoginAction extends Action{ //为什么都是execute方法.可以给它改名吗? public ActionForward execute(ActionMapping mapping, Actionform form, HttpServletRequest request, HttpServletResponse response)throws AuctionException { //为什么要将form强制类型转换为Loginform,form里不是已经获取从页面提交的数据了吗?为什么不可以直接用form呢?还要类型转换? Loginform loginform = (Loginform)form; if ("123".equals(loginform.getUsername() && "123".equals(loginform.getPassword()){ return mapping.findForward("success"); }else{ return mapping.findForward("success"); } } }
解释的不是太好:
因为 Strus 知道了你的类是 Action 的子类, 那他就可以放心的调用下面的代码来工作了:
Object yourAction = Class.forName("LoginAction").newInstance();
Action action = (Action)yourAction;
ActionForward forward = action.execute(mapping, form,
request, response);
// do forward
Struts 再神奇也是 Java 类啊, 你要是改了签名, 他就不知道该调用你的哪个方法来工作了啊, 所以它用父类和子类的多态功能来实现一个方法定义, 多种用途.
至于下面的方法, 也是这样的道理. 就是子类可以强制转换为父类而不报错.
还记得为啥所有对象的父类都是 Object 嘛? 因为这样 ArrayList 里面就可以写方法
add(Object object) 来添加任意对象了, 而不是每个类型都要写一个:
add(MyObject1 object1);
add(MyObject2 object2);
了.
例如中国人吧, 非文盲的都会写字, 这就相当于 Action 定义了一个功能点, 抽象方法, 但是没有留具体的实现, 因为你不能规定所有人都得写的一摸一样吧, 这也是实际情况. 但是如果实现没有这个限制, 非文盲, 你非要让一个具体的人(Action的子类)来写字, 那么幸运一点的它会写(实现了写字的具体功能), 也可能是碰到一个文盲, 不会写, 你非要逼着它写, 自然就会出错了. 至于 Actionform, 你可以用笔的概念来理解, 笔有各种各样的笔, 你实现并不会知道每个人会用什么样的笔来写字, 但是笔必须有一些属性, 设置好了才能被人用来写字, 注意是人用笔写字, 不是笔自己自动写字, 也就是人调用笔这个对象:
class 非文盲 { abstract method 写字(笔 pen); } //那你要找一个人来写字, 那它必须符合条件: class 大学生 extends 非文盲 { method 写字(笔 pen) { // 他会选择用自己喜欢的笔写字, 例如 钢笔 钢笔 myPen = (钢笔)pen; myPen.吸墨水(); 开始写字_用(myPen); } }
Struts 中又规定并非所有的 Action 都必须先绑定一个 Actionform , 这也很好理解. 因为字并非非得用笔才能写出来, 如果我用自己的手指头直接在石碑上刻字(假设我练过大力金刚指), 或者我用键盘, 这些都用不到任何笔, 但是仍然可以写出字来.