nighty

折腾的年华
posts - 37, comments - 143, trackbacks - 0, articles - 0
        项目中使用了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引入一个比较复杂的页面,也许这种思路可以省掉很多麻烦。具体的应用还需要进一步的实践!  

刚进场的时候戏就落幕

Feedback

# re: Struts2+FreeMarker中利用plainText处理Ajax的一个技巧  回复  更多评论   

2010-11-10 23:55 by wenlin
struts2 中可以用 return Action.NONE 来代替 return null

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


网站导航: