扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
从一个servlet内部,通过运用javax.servlet.RequestDispatcher类的forward方法你就可以将控制流程引导到一个目的资源。在login应用程序的action类中,该代码形式如下: RequestDispatcher rd = request.getRequestDispatcher(destination); rd.forward(request, response); 其中destination就是到一个目的资源的路径。 但是在一个典型的Struts应用程序中,你可以用ActionForward类作为替代。运用这个类的好处就是你不再需要创建一个RequestDispatcher对象并调用它的forward方法了。 你可以将ActionForward类用于一个Action类的execute方法中。注意,其中一个重载的execute方法有如下的定义,它返回一个ActionForward对象: public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception 因为当时我们还没有讲到ActionForward类,所以在本系列的第一部分和第二部分中所有Action类的execute方法都只返回了空值。现在,在一个Action类的execute方法中,你就可以用ActionForward类来代替下面这个RequestDispatcher对象实例了: RequestDispatcher rd = request.getRequestDispatcher(destination); rd.forward(request, response); 新的代码变成:return (new ActionForward(destination)); 构建ActionForward对象 ActionForward类提供了下面五种构造器: public ActionForward() public ActionForward(String path) public ActionForward(String path, boolean redirect) public ActionForward(String name, String path, boolean redirect) public ActionForward(String name, String path, boolean redirect, boolean contextRelative) 虽然这些构造器是不需要说明的,但我们应该注意下面几点。在这些构造器中,第二种可能是最常用的。后四种构造器中的path参数表示的是到目的资源的路径。后三种构造器中的redirect布尔值表示的是是否执行了一个重定向(redirect)。(缺省情况下,这个值设置为false,因为redirect比forward慢。)最后,第五个构造器中的contextRelative布尔值表示该路径是否应该是context-relative的,而不是module-relative的。 同样,一个ActionForward实例也可以有一个逻辑名称,你可以用这个名称来查找与一个特殊的ActionMapping对象相关的实例。(参见本系列第四部分关于ActionMapping的讲述。) 学习ActionForward类的方法 ActionForward类定义了三个保护字段——name、path和redirect——它们构成了ActionForward的三个属性。ActionForward类提供getter和setter方法来从这些字段读值、给这些字段赋值。这些方法是不需要说明的,定义如下: public boolean getContextRelative() public void setContextRelative(boolean contextRelative) public String getName() public void setName(String name) public String getPath() public void setPath(String path) public boolean getRedirect() public void setRedirect(boolean redirect) 除此之外,ActionForward类还重载了toString方法并返回:"ActionForward[" + name + "]"其中name是名称字段。 最后,还有一个freeze方法,它固定了一个组件的配置。 再次运用Login应用程序 要完全了解ActionForward类,我们需要再次运用在本系列第一部分和第二部分构建的login应用程序。你可以下载完整的应用程序,把它重命名为myStrutsApp2。它的web.xml和struts-config.xml文件同myStrutsApp1中的文件是一样的,JSP页面也没有改变。只有action类同以前不同。 注意下面这行代码是新的:return (new ActionForward("/mainMenu.jsp")); 它替代了下面这些代码,现在它们都被注释出来了: RequestDispatcher rd = request.getRequestDispatcher("/mainMenu.jsp"); rd.forward(request, response); 同样,下面这些代码也都被重写了: // RequestDispatcher rd = request.getRequestDispatcher("/login.jsp"); // rd.forward(request, response); 新的代码变成:return (new ActionForward("/login.jsp")); ViewSecretAction类 ViewSecretAction也变得更好了。execute方法最后的这三行代码现在由一行来处理了,返回(new ActionForward (“/viewSecret.jsp”)): //RequestDispatcher rd =request.getRequestDispatcher("/viewSecret.jsp"); //rd.forward(request, response); // return null; 接下来,我们来重新查看LogoutAction类(见列表3)。注意execute方法中下面这些代码已经被替代了: // RequestDispatcher rd = request.getRequestDispatcher("/login.jsp"); // rd.forward(request, response); // return null; 你只需要用下面这一行代码来取代它就行了: return (new ActionForward("/login.jsp")); ActionForward是个很有用、功能很多的类,它可以让你更简单、更快、更直接地完成许多事情,这可能就是它很受欢迎的原因。在本系列的第四部分,你可以了解另一个重要的类org.apache.struts.action.ActionMapping,它可以使你的代码更有效、更漂亮。 |
濠电姷顣介埀顒€鍟块埀顒€缍婇幃妯诲緞閹邦剛鐣洪梺闈浥堥弲婊勬叏濠婂牊鍋ㄦい鏍ㄧ〒閹藉啴鏌熼悜鈺傛珚鐎规洘宀稿畷鍫曞煛閸屾粍娈搁梻浣筋嚃閸ㄤ即宕㈤弽顐ュС闁挎稑瀚崰鍡樸亜閵堝懎濮┑鈽嗗亝濠㈡ê螞濡ゅ懏鍋傛繛鍡樻尭鐎氬鏌嶈閸撶喎顕i渚婄矗濞撴埃鍋撻柣娑欐崌閺屾稑鈹戦崨顕呮▊缂備焦顨呴惌鍌炵嵁鎼淬劌鐒垫い鎺戝鐎氬銇勯弽銊ф噥缂佽妫濋弻鐔碱敇瑜嶉悘鑼磼鏉堛劎绠為柡灞芥喘閺佹劙宕熼鐘虫緰闂佽崵濮抽梽宥夊垂閽樺)锝夊礋椤栨稑娈滈梺纭呮硾椤洟鍩€椤掆偓閿曪妇妲愰弮鍫濈闁绘劕寮Δ鍛厸闁割偒鍋勯悘锕傛煕鐎n偆澧紒鍌涘笧閹瑰嫰鎼圭憴鍕靛晥闂備礁鎼€氱兘宕归柆宥呯;鐎广儱顦伴崕宥夋煕閺囥劌澧ù鐘趁湁闁挎繂妫楅埢鏇㈡煃瑜滈崜姘跺蓟閵娧勵偨闁绘劕顕埢鏇㈡倵閿濆倹娅囨い蹇涗憾閺屾洟宕遍鐔奉伓