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 阅读(1491) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: