Struts2+FreeMarker中利用plainText处理Ajax的一个技巧

        项目中使用了FreeMarker做为视图技术,相对来说因为freemarker在视图上有一些逻辑处理功能,某些地方就显得比较方便,特别是macro的使用,当然也不是说JSP就没有这个功能,只是以前用JSP写起来没有这么顺手。
       那么遵从前台开发的一些基本原则,FTL(指freemarker模板文件)、CSS、JS都可以分得比较清晰。按照以前的技巧,在做Ajax请求的时候,都是前台用JS框架(例如jquery)发送请求,Server端处理后用JSON结果返回。用struts2,到现在已经是2.2.1版本了,都觉得很方便!一般都是加上struts-json的Plugin来响应JSON的结果。
       老是觉得麻烦的地方在于:JSON是纯数据的组织形式,在Server处理完后,要响应页面,得先组织成json,到了页面,响应得到了json,又得取出来,动态添加到DOM中的某个地方;数据添加的同时,还有可能得使用js对样式进行一些效果渲染。总体来说,这就使得前台的js有点罗嗦,比如常见的就要append(html),这些html是用js字符串生成的,看着感觉很不舒服。
       发现struts2有一个特殊的类型叫:plainText,可以把type类型定义为它,这样页面响应获取得到的就是源代码样式的内容。这个功能大概就是为了给那些需要返回源代码的页面使用的。那么换个思路就是说,这返回的type就可以针对上面提出问题中,解决了已经组织好数据和样式的内容。返回的内容不仅包含了数据,也包含了样式,和你直接返回一个HTML是一样,不过一般我们都需要动态生成html。把结果直接嵌入在HTML中,就可以显示出来,不再需要用js进行组织。利用这个特点,做了个测试。发现行得通!
       1. 首先,配置struts.xml文件,添加如下代码:
< package  name ="pt"  extends ="struts-default" >
        
< action  name ="test"  class ="test.TestAction" >
            
< result  type ="plainText" >
                
< param  name ="location" > /test.ftl </ param >
                
< param  name ="charSet" > GBK </ param >
            
</ result >
        
</ action >
    
</ package >
        注意到了2.2.1版本,原来的plaintext写法不知道从哪个版本开始已经不支持了,要有大写T开头, plainText,一个小细节,免得启动时老是报错。
       2. Action的代码
public   class  TestAction  extends  ActionSupport  {
    
private String msg;
    
public String getMsg() {
        
return msg;
    }

    
public void setMsg(String msg) {
        
this.msg = msg;
    }

    @Override
    
public String execute() throws Exception {
        setMsg(
"我是Test");
        Configuration cfg 
= new Configuration();
        cfg.setServletContextForTemplateLoading(ServletContextUtil.getContext(), 
"/template");
        Template t 
= cfg.getTemplate("test.ftl");
        ServletContextUtil.getResponse().setContentType(
"text/html;charaset=" + t.getEncoding());
        Writer out 
= ServletContextUtil.getResponse().getWriter();
        Map root 
= new HashMap();
        root.put(
"msg", getMsg());
        t.process(root, out);
        
return null;
    }

}
       这是临时随便写的,变量大概在正式项目中不会这样定义,这只是一个测试而已。这里要注意,不要返回SUCCES,因为那样返回的是源文件,没有填充入数据的ftl文件,到了前台也没用。所以这里有点小麻烦,必须用Freemarker的API,把固定的模板,用数据填充后,用out写出,最后return null即可!
      3. 下面是ftl文件
< div  style ="color:red;" > This is a plainText: ${msg} </ div >
       这样前台接收到的,就是这个经过填充和渲染后的ftl页面,和正常的html一样。你可以把这个页面做得足够复杂。在需要嵌入的页面上,用jquery之类的调用后放入DOM中即可以。
       比如下面这样的,把获取得到的内容,填充入id为myDiv的DOM节点中。 
$( " #myDiv " ).load( " test.action " );
       话说回来,也不是所有地方都建议这样,有些地方,比如ajax填充一个下拉列表,或是仅仅列出一些简单的数据,就不建议这么大费周章。直接用JSON处理更来得简单。这个技巧适用的场景是那些没有iframe架构的页面,又需要ajax响应局部的具有一些组织形式的内容。如果你页面都是include方式来进行划分,又想可以Aajx引入一个比较复杂的页面,也许这种思路可以省掉很多麻烦。具体的应用还需要进一步的实践!  

刚进场的时候戏就落幕

你可能感兴趣的:(Struts2+FreeMarker中利用plainText处理Ajax的一个技巧)