<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    samtiger


    QQ:418148757
    Name:yangchuan
    數據加載中……
    基于注解的簡單MVC框架的實現,以及jquery,prototype,ajax傳輸亂碼問題的一點解決方法

    1:基于注解的簡單MVC框架的實現
            效果:1:用戶只需要定義一些普通的java類來做為M層,也就是STRUTS的action類,該類里包含1到 N個控制方法,每個方法需要的form數據,由注解@ActionForm聲明,根據聲明,每一個方法都可以同時被注入多個form類實例。(根據這一點,你可以將諸如hibarnate的entity對象作為一個form被注入到action的方法中去。省掉了form到orm實體對象的轉換過程。)
                         2:整個框架只需使用一個FILTER來作為web頁面和java程序傳輸數據的通道,所以上邊所謂的action實際上不用繼承任何類和實現任何接口,這樣為M層的控制帶來了很多方便。
                        3:整個系統的bean,包括上邊的action實例都用spring來管理,所以是否是單例還是多例都由你在spring里的配置來決定。
                        4:action方法的返回數據為一個IResultHandel類型的對象,這個對象在框架中有一系列默認的解決方法,包括JSON,頁面跳轉,excel等,當然,也可以自定義解決方法,只要實現這個接口,并定義兩個屬性一個data,一個view。前者是返回的數據,view是返回的頁面地址。使用這種方式的目的主要是利于單元測試,讓action方法更單純,更清晰一點。
                        5:說說整體流程,當頁面發送一個請求時,統一都交給一個FILTER對象來處理(注意整個框架就這一個filter對象),該對象根據請求地址,查找spring是否定義了對應的bean(也就是處理該請求的action),找到后,調用該bean的excute方法,在這個方法里,會查找請求上所對用的action參數,據此定位到bean里的對應方法上,再查找該方法是否含有AcationForm注解信息。如果有則根據注解聲明的form類,創建對應的實例,迭代查找實例含有的屬性,依據屬性名稱,獲取對應request參數值,再依據屬性的類型,綁定屬性編輯器,將request參數值轉換為對應的屬性值,以達到form注入的效果。如果action方法沒有聲明actionform,則直接執行方法,并返回IResultHandel。

            以上就是一個簡單的mvc的框架的實現原理,他的目的是解決一個action方法注入多個form對象,和利于單元測試。
    2:jquery,prototype,ajax傳輸亂碼問題的一點解決方法。
            在上邊的框架,我解決ajax亂碼的過程是這樣的,在js中先用encodeURL給傳遞的參數編碼。如下
           jquery: $.post(url, encodeURI(queryString),result,"text");
            prototype: var myAjax = new Ajax.Request(
              url,
                  {
                       method: 'post',
                       parameters: encodeURI($H(pars).toQueryString()),
                       onComplete: showResponse
                  });  
    在框架中,定義了一個@decode注解,這個注解可以在方法,屬性上聲明。在action方法上聲明時表示:該方法所注入的form對象需要解一次碼。其中@decode(index=“10”)表示第一個form需要解碼,第二個不需要,(index值,1表示需要解碼,0表示不需要。由index的位數來決定第幾個form需要解碼。)
    在set方法或屬性上使用的時候,表示該類在需要解碼的時候僅這些字段或方法可以需要解碼,其它則沒必要。
    解碼的函數很簡單。使用URLDecoder.decode(str, "utf-8");就可以,注意:URLDecoder一定是java.net包下的方可。

    在有java返回給ajax 的時候,需要設置response.setContentType("text/html;charset=GBK");語句方可解決非utf-8編碼時產生的亂碼,這個時候最好朝前面的方法寫,若使用response.setCharacterEncoding("gbk"),一般還是會出現問題。
    參看我的一個測試action代碼:其中JsonTool為我編寫的一個json處理工具,可以自動的將集合,數組,map,普通pojo自動轉換為json表達方式。

     

     

    package com.sam.sammobiletest.action;

    import java.util.HashMap;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    import com.sam.jsontool.util.JSONTool;
    import com.sam.sammobile.annotation.ActionForm;
    import com.sam.sammobile.annotation.Decode;
    import com.sam.sammobile.result.handle.ExcelResultHandle;
    import com.sam.sammobile.result.handle.MyJsonHandler;
    import com.sam.sammobile.result.handle.Query6ResultHandler;

    /**
     * 測試 sammobile框架。 必須的一個屬性: action 指定action的方法名稱
     * decode注解的含義,如果方法上含有decode注解,則表示該方法的表單對象需要進行屬性解碼
     * 如果decode中制定了index的值,該值為01代碼,其中每一位數字對應表單數組中的對應表單
     * (一個控制方法上可能需要注入多個表單,所有構成了表單數組)。其中,0表示無需解碼,1:表示解碼
     * 
     * 
     * 
     
    */

    public class TestAction {
        
    protected static final Log logger = LogFactory.getLog(TestAction.class);

        
    /**
         * 單beanz注入測試 不解碼
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        @ActionForm(TestForm.
    class)
        
    public Object query(Object forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            TestForm form 
    = (TestForm) forms;

            System.out.println(form.getName());
            System.out.println(form.getDate());
            System.out.println(form.getAge());
            MyJsonHandler handler 
    = new MyJsonHandler(form);
            
    return handler;
        }


        
    /**
         * 多bean注入測試 都解碼
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        @Decode()
        @ActionForm( 
    { TestForm.class, TestForm2.class })
        
    public Object queryTwo(Object[] forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            TestForm form 
    = (TestForm) forms[0];
            TestForm2 form2 
    = (TestForm2) forms[1];
            System.out.println(form.getName());
            System.out.println(form.getAge());
            System.out.println(form2.getAddress());
            System.out.println(form2.getTestDate());
        
            HashMap
    <String, Object> map = new HashMap<String, Object>();
            map.put(
    "form1", form);
            map.put(
    "form2", form2);
            
            String json 
    = JSONTool.toJSON((Object) map);
            
    return new MyJsonHandler((Object) map);
        }


        
    /**
         * 多bean注入測試 都解碼
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        @Decode(index 
    = "11")
        @ActionForm( 
    { TestForm.class, TestForm2.class })
        
    public Object query11(Object[] forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            
    return queryTwo(forms, request, response);
        }


        
    /**
         * 多bean注入測試 第二個解碼
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        @Decode(index 
    = "01")
        @ActionForm(
    {TestForm.class,TestForm2.class})
        
    public Object query01(Object[] forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            
    return queryTwo(forms, request, response);
        }


        
    /**
         * 多bean注入測試 第一個bean解碼
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        @Decode(index 
    = "10")
        @ActionForm( 
    { TestForm.class, TestForm2.class })
        
    public Object query10(Object[] forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            
    return queryTwo(forms, request, response);
        }


        
    /**
         * 多bean注入測試 不注解的樣式
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        @ActionForm( 
    { TestForm.class, TestForm2.class })
        
    public Object queryNo(Object[] forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            
    return queryTwo(forms, request, response);
        }


        
    /**
         * 多bean注入測試 不解碼
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        @Decode(index 
    = "00")
        @ActionForm( 
    { TestForm.class, TestForm2.class })
        
    public Object query00(Object[] forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            
    return queryTwo(forms, request, response);
        }


        
    /**
         * 測試頁面跳轉,利用了 query6的跳轉方式
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        
    public Object gotoURL(Object forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            Query6ResultHandler handler 
    = new Query6ResultHandler();
            Object obj 
    = new HashMap();
            handler.setResultData(obj);
            handler.setView(
    "pages/"+request.getParameter("path"));
            
    return handler;
        }


        
    /**
         * 測試導出數據,這個處理器還需優化。感覺action代碼太繁瑣。
         * 
         * 
    @param forms
         * 
    @param request
         * 
    @param response
         * 
    @return
         
    */

        @ActionForm(TestForm.
    class)
        
    public Object toExcel(Object forms, HttpServletRequest request,
                HttpServletResponse response) 
    {
            TestForm form 
    = (TestForm) forms;
            HashMap
    <String, Object> hashMap = new HashMap<String, Object>();
            hashMap.put(
    "fileName""testdata");
            String[] title 
    = "輸入表單""姓名""日期""年紀" };
            hashMap.put(
    "title", title);
            Object[][] data 
    = new Object[1][3];
            data[
    0][0= form.getName();
            data[
    0][1= form.getDate();
            data[
    0][2= form.getAge();
            hashMap.put(
    "data", data);
            ExcelResultHandle resultHandle 
    = new ExcelResultHandle();
            resultHandle.setResultData(hashMap);
            
    return resultHandle;
        }

    }


     

    posted on 2008-11-23 23:24 sam.chuan.yang 閱讀(1501) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 美女被爆羞羞网站免费| 亚洲avav天堂av在线网爱情| 国产亚洲精品美女久久久久| 我想看一级毛片免费的| 亚洲av永久无码精品天堂久久 | 国产精品1024在线永久免费| 免费一级黄色毛片| 成年大片免费高清在线看黄| 亚洲精品视频免费观看| 一级毛片免费一级直接观看| 无码色偷偷亚洲国内自拍| 日本久久久免费高清| 久久亚洲精品无码av| 日韩高清免费在线观看| 麻豆69堂免费视频| 中文字幕亚洲不卡在线亚瑟| 二个人看的www免费视频| 亚洲AV永久无码精品一百度影院| 日韩插啊免费视频在线观看 | 亚洲欧洲国产精品久久| 一个人免费观看视频在线中文| 亚洲人妻av伦理| 国产精品免费AV片在线观看| 亚洲日韩乱码中文无码蜜桃| 免费无码精品黄AV电影| 污网站在线观看免费| 亚洲色自偷自拍另类小说| 性色午夜视频免费男人的天堂 | 亚洲码在线中文在线观看| 黄a大片av永久免费| 亚洲视频在线免费| 亚洲欧洲国产综合| 国产免费人成视频在线观看| 成年女人A毛片免费视频| 亚洲黄色网站视频| 国产乱弄免费视频| 免费国产黄网站在线观看| 亚洲精品成a人在线观看夫| 国产亚洲精久久久久久无码AV| 久久99国产综合精品免费| 暖暖免费中文在线日本|