增強HttpServlet實現類似于Struts的配置

wangjianme 12年前發布 | 24K 次閱讀 Struts1.x Java Struts2 Web框架 HttpServlet JavaEE

增強HttpServlet實現類似于Struts的配置

       頁面的轉發和重定向,都必須要在web.xml中進行配置。實現程序的可配置的功能。

       通過反射,在接收到目標servlet的返回的字符串以后。如果不是null。則決定是轉發還是重定向到目標頁面。

以下是完整源代碼:

package cn.itcast.pubs;

import java.io.IOException;

import java.lang.reflect.Method;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

 * 用戶繼承此類,處理多方法,接收用戶的返回值轉發或是重定向到其他資源<br/>

 * 如果是重定向可以向request中設置名稱為param的屬性,<br/>

 * request.setAttribute("param","name=Jack");<br/>

 * 默認為轉發<br/>

 * 如果不希望此工具類為你轉發,則可以返回null

 * @author <a href="wangjian_me@126.com">王健</a>

 */

public abstract class Base3Servlet extends HttpServlet{

    private static final long serialVersionUID = 1L;

    @Override

    public void doGet(HttpServletRequest req, HttpServletResponse resp)

           throws ServletException, IOException {

       doPost(req, resp);

    }

    @Override

    public void doPost(HttpServletRequest req, HttpServletResponse resp)

           throws ServletException, IOException {

       req.setCharacterEncoding("UTF-8");//此處應該通過過慮器(Filter)設置編碼

       String cmd = req.getParameter("cmd");

       if(cmd==null || cmd.trim().equals("")){

           cmd = "execute";

       }

       try{

           Method m = this.getClass().getMethod(cmd,HttpServletRequest.class,HttpServletResponse.class);

           String result = (String) m.invoke(this,req,resp);

           if(result!=null){

              if(result.startsWith("redirect:")){

                  result = result.substring(result.lastIndexOf(":")+1);       //截取redirect后面的值

                  String page = getPage(result);

                  //獲取參數,最后結果為some.jsp?name=Jack&...

                  String param=(String) req.getAttribute("param");

                  if(param!=null){

                     page = page+"?"+param;

                  }

                  System.err.println("page is :"+page);

                  if(page.startsWith("http")){

                     resp.sendRedirect(page);//重定向到外部網站

                  }else{

                     resp.sendRedirect(req.getContextPath()+page);//重定向到本網內的網頁

                  }

              }else{

                  String page = getPage(result);

                  req.getRequestDispatcher(page).forward(req, resp);

              }

           }

       }catch(NoSuchMethodException e){

           throw new RuntimeException("沒有此方法:"+e.getMessage(),e);

       }catch(Exception e){

           throw new RuntimeException(e.getMessage(),e);

       }

    }

    /**

     * 先在此Servlet中查找,如果沒有則到Context中查找配置

     */

    private String getPage(String result){

       String page = getInitParameter(result);                     //獲取配置頁面,先在此Servlet中找,如果沒有則再找

       if(page==null){

           page = getServletContext().getInitParameter(result); //如果在servlet配置到找不到則找Context范圍

       }

       return page;

    }

    /**

     * 要求返回一個String,根據String串獲取配置的初始化參數<br/>

     * 轉發或是重新定向到目標頁面<br/>

     * redirect:前綴為重定向,即return "redirect:page";<br/>

     * 默認為轉發

     */

    public abstract String execute(HttpServletRequest req,HttpServletResponse resp) throws Exception;

}

以下是使用示例:

配置示例如下

<context-param>

       <param-name>back</param-name>

       <param-value>/jsps/result.jsp</param-value>

</context-param>

<servlet>

       <servlet-name>back</servlet-name>

       //以下BackStringServlet類,它繼承了Base3Servlet工具類

       <servlet-class>cn.itcast.servlet.BackStringServlet</servlet-class>

       <init-param>

           //先在這兒查找back,如果這兒沒有,再查找Context的配置

           <param-name>back</param-name>

           <param-value>/jsps/result.jsp</param-value>

       </init-param>

</servlet>

BackStringServlet.java源代碼如下:

package cn.itcast.servlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import cn.itcast.pubs.Base3Servlet;

public class BackStringServlet extends Base3Servlet{

    @Override

    public String execute(HttpServletRequest req, HttpServletResponse resp)

           throws Exception {

       req.setAttribute("name", "Jack");

       return "back";

       //也可以按以下方式返回,redirect決定為重定向

       //return "redirect:back";

    }

}

 

 本文由用戶 wangjianme 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!