淺談ActionForward的三種重定向

      ActionForward是 Struts的核心類之一,其基類僅有4個屬性name / path / redirect / classname。在基於Struts的Web應用程序開發過程當中,Action操做完畢後程序會經過Struts的配置文件struts- config.xml連接到指定的ActionForward,傳到Struts的核心類ActionServlet,ActionServlet使用 ActionForward提供的路徑,將控制傳遞給下一個JSP或類。ActionForward控制接下來程序的走向。ActionForward表明一個應用的URI,它包括路徑和參數,例如:path=」/login.jsp」 或path=「/modify.do?method=edit&id=10」 ActionForward的參數除了在struts-config.xml和頁面中設置外,還能夠經過在Action類中添加參數,或從新在Action中建立一個ActionForward。

       actionForward的做用:封裝轉發路徑,通俗點說就是說完成頁面的跳轉和轉向。那它既然是轉向,究竟是轉發仍是重定向呢?默認的狀況下,actionForward採用的是轉發的方式進行頁面跳轉的。

       順便說一下 轉發和重定向的區別。最大的區別就是轉發的時候,頁面的url地址不變,而重定向的時候頁面的url地址會發生變化。簡單說明一下緣由,由於轉發的時候是採用的同一個request(請求),既然頁面跳轉先後是同一個request,頁面url固然不會變了;而重定向採用的是2個request,由於是二次轉發頁面跳轉先後的url固然會不一樣了。

       既然actionForward跳轉的方式默認的是轉發,那若是我非要用重定向的方式,該如何設置呢?恩,這很簡單,你們都在struts-config.xml作過actionForward的配置吧,好比這句     <forward name=」login」 path=」/login.jsp」 redirect=」true」/>



如下是三種經常使用的在action中覆蓋execute方法時用到的重定向方法:

示例代碼以下: html

public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
            
            /****重定向的三種方法*******/

            //方法1 
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return null;

            //方法2
            ActionForward forward = mapping.findForward("login");
            forward.setRedirect(true); 
            return forward ;

           //方法3            
           PrintWriter out = null;   
        try
        {
            // 設置回發內容編碼,防止彈出的信息出現亂碼
            response.setContentType("text/html;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            out = response.getWriter();
            String alertString = "你好!這是返回信息!";
            String redirectURL = request.getContextPath() + "/login.jsp" ;  
            out.print("<script>alert('" + alertString + "')</script>");
            out.print("<script>window.location.href='" + redirectURL + "'</script>");
            out.flush();
            out.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;           
    }
相關文章
相關標籤/搜索