nighty
折腾的年华
posts - 37, comments - 143, trackbacks - 0, articles - 0
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2010年11月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(7)
给我留言
查看公开留言
查看私人留言
随笔分类
Eclipse(7)
Flex(2)
Java(6)
Struts2(2)
SWT/JFace(1)
信息安全(1)
心得(5)
操作系统(3)
数据库(3)
服务器部署(5)
测试(2)
系统集成(2)
软件架构(2)
随笔档案
2013年4月 (2)
2013年3月 (1)
2012年4月 (1)
2011年10月 (1)
2011年8月 (1)
2011年5月 (3)
2011年4月 (1)
2011年3月 (2)
2011年2月 (1)
2011年1月 (1)
2010年11月 (1)
2009年11月 (1)
2009年10月 (1)
2009年8月 (1)
2009年7月 (1)
2008年8月 (2)
2008年7月 (2)
2008年6月 (2)
2008年5月 (4)
2008年4月 (1)
2008年1月 (1)
2007年11月 (1)
2007年10月 (2)
2007年8月 (2)
文章分类
测试
搜索
最新评论
1. re: 关于commons dbutils组件的一个小缺陷分析
dbutils中连传入到的参数都不区分大小写??
--starhe
2. re: B/S,C/S架构混合使用[未登录]
评论内容较长,点击标题查看
--eagle
3. re: B/S,C/S架构混合使用[未登录]
补充一下:用的语言是java,开发环境是eclipse
--eagle
4. re: B/S,C/S架构混合使用
评论内容较长,点击标题查看
--Unbotrusive
5. re: struts2中重定向中文参数乱码梳理[未登录]
有用啊
--tony
阅读排行榜
1. ubuntu安装Java开发环境(38173)
2. Eclipse3.3安装中文语言包(13930)
3. Http状态码思维导图(13741)
4. B/S,C/S架构混合使用(13715)
5. 添加完整的Eclipse RCP帮助系统(8923)
评论排行榜
1. B/S,C/S架构混合使用(25)
2. 无奈只能放弃iBatis(24)
3. Eclipse3.3安装中文语言包(13)
4. httpclient3.1使用小结(8)
5. JDBC连接DB2的一些总结(8)
Struts2+FreeMarker中利用plainText处理Ajax的一个技巧
Posted on 2010-11-10 15:43
寒武纪
阅读(3081)
评论(3)
编辑
收藏
所属分类:
Struts2
项目中使用了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
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
struts2中重定向中文参数乱码梳理
Struts2+FreeMarker中利用plainText处理Ajax的一个技巧
Powered by:
BlogJava
Copyright © 寒武纪