在Google App Engine中利用Struts2框架
副标题#e#
"GAE"(Google App Engine)在早些时候宣布了Java语言的支持,对宽大的Java开拓者来说,可以利用本身熟悉的语法来举办开拓,是很舒服的一件工作。Java世界中有大量已有的东西和框架,有一些是我们日常事情中就已经纯熟利用的、并且广为风行的成熟的,假如可以或许直接在GAE中利用,将大大提高我们的开拓效率。
这几天操作Struts2,在GAE的Java版本支持情况中,写了个简朴博客,此刻将GAE+Struts2的组合履历,记录下来。
配景先容
Python是一门有趣的语言,是作者第二个打仗的动态剧本语言。第一个是大学时期做学生网站时期打仗到Perl,厥后事情后操作Perl改写了公司的应用措施启动框架;几年后,由于Perl的语法实在是过分于羞涩难解,便利用Python对启动框架举办了一次进级。Python是面向工具的,同时也兼备了函数式编程的支持,别的,Python的语法强制缩进,很是容易读懂,因此Python版本的启动框架对公司的Java开拓者来说,也不难维护。
虽然,这些都是题外话,GAE最先提供的是Python语言的支持,可是对我们Java开拓者来说,要利用Python来举办大的应用开拓,还较量疾苦的一件工作。这时候GAE推出Java语言的支持,既是所有Java开拓人员的福音,也是理所虽然的一件工作,Google不行能放弃今朝企业应用开拓规模内里最大的一股气力。
Struts2是今朝应用最遍及的WEB开拓框架,也是大部门的Java开拓者最熟悉的开拓框架,我们的GAE应用措施中,利用成熟的Struts2可以淘汰许多特另外开拓事情。
所需的Struts的库文件
今朝Struts2的不变版本是2.1.6,将下面的来自Struts-2.1.6的刊行包的几个包,引入你的GAE项目工程中:
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
commons-logging-1.0.4.jar
commons-logging-api-1.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
假如你利用IDEA来建设项目,只要选择Struts的2.1.6版本的支持,IDEA会自动帮你引入所需要的库文件。
为App Engine定制你的Struts
GAE内里的Servlet情况有必然的限制,不能利用线程(Thread),不能利用文件,尚有此外一些要留意的处所。
首先,要加一个ServletContextListener的实现,在context初始化的时候,挪用OgnlRuntime.setSecurityManager(null),让Struts可以在GAE情况内里正常跑起来:
package your.servlet.pkg;
import ognl.OgnlRuntime;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
public class StrutsAppEngineAdapter implements ServletContextListener {
public void contextInitialized(ServletContextEvent servletContextEvent) {
OgnlRuntime.setSecurityManager(null);
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
在web.xml中设置这个ServletContextListener的实例:
<web-app>
<listener>
<listener-class>your.servlet.pkg.StrutsAppEngineAdapter</listener-class>
</listener>
</web-app>
做完上面的事情之后,就可以在你的GAE内里利用Struts的成果了!
#p#副标题#e#
定制GAE的常用工具的Converter
Struts提供了Converter的机制,让你常用的业务工具可以直接在页面中显示,可能接管范例为业务工具的请求数据。GAE内里常用的一些工具,界说了对应的Converter之后,可以是业务代码越发简捷。下面先容两个常用工具的Converter的代码:
TextConverter, 是针对com.google.appengine.api.datastore.Text工具的转换器,Text是GAE的存储中,大文本内容的生存工具,在业务中很常用。先来看看TextConverter大的代码:
package your.servlet.pkg;
import com.google.appengine.api.datastore.Text;
import ognl.DefaultTypeConverter;
import java.util.Map;
public class TextConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map map, Object o, Class toType) {
if (toType == Text.class) {
String value = ((String[]) o)[0];
return new Text(value);
} else if (toType == String.class) {
Text text = (Text) o;
return text.getValue();
}
return null;
}
}
TextConverter的浸染主要是用于在WEB页面中,直接显示存储工具中的大文本内容。
#p#分页标题#e#
别的一个是KeyConverter,是对com.google.appengine.api.datastore.Key工具的转换器,Key是GAE中三种主键(Long,String,Key)的一种,在吸收请求数据以及页面显示的时候,会常常用到。直接看代码:
package your.servlet.pkg;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import ognl.DefaultTypeConverter;
import java.util.Map;
public class KeyConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map map, Object o, Class toType) {
if (toType == Key.class) {
String s = ((String[]) o)[0];
return KeyFactory.stringToKey(s);
} else if (toType == String.class) {
Key k = (Key) o;
return KeyFactory.keyToString(k);
}
return null;
}
}
在源代码的根目次,建设xwork-conversion.properties文件,内容如下:
com.google.appengine.api.datastore.Text=your.servlet.pkg.TextConverter
com.google.appengine.api.datastore.Key=your.servlet.pkg.KeyConverter
上面的事情都完成今后,就可以在你的Action内里直接利用Key范例的类变量,无需手工去做String和Key之间的转换!
Convention Plugin不能利用
Struts2内里,最常用的Plugin应该是Convertion了,"零设置"即淘汰了写设置文件的贫苦,代码的组织布局看起来也清晰许多。
可是在GAE内里,无法读取文件系统,今朝的Convertion版本还无法正常事情,很是惋惜。不外发起你的GAE应用中,Action和JSP文件,照旧凭据Convertion Plugin的组织方法来存放,一方面有利于后头的进级和迁移事情,另一方面也让你的应用的文件看起来更清晰。