Javashop模板制作手册V2--进阶篇
定义映射
可能会有一些特殊的模板,如商品详细页,他的访问地址一般为:goods-1.html
其中的1表示这个商品的标识id,通过这个id我们的商品详细标签才能由数据库中查询出此商品的数据,但我们有很多商品,不可能建立
goods-1.html,goods-2.html.......goods-1000.html,这么多模板,此时我们就要用到uri-模板映射,是通过正则表达式来完成的,如:我们建立如下的映射:
/goods-(\d+).html -> /goods.html
那么访问所有的/goods-{数字}.html 这样的地址都会解析goods.html这个模板了。
标签指南
首先要继承于
com.enation.framework.taglib.BaseFreeMarkerTag
然后实现这个类的exec方法,如:
@Component
public class TestTag extends BaseFreeMarkerTag {
@Override
protected Object exec(Map params) throws TemplateModelException {
return "这是一个测试";
}
}
其中@Component是spring的注解,这样此类就会自动被spring扫描,并在spring容器中创建此类的实例,此实例的beanid 为 testTag ,就是类名首字母小写。
当然也可以通过如下方式指定beanid:
@Component("myTestTag")
这个beanid就是标签的标识,也就是在模板页中如下红色的部分:
<#assign cartTag= newTag("cartTag")>
标签的exec方法会在标签调用的时候被调用,也是就在模板中:
<#assign itemList = cartTag() >
这段代码会执行标签的exec方法。
这个方法的返回值就是返回给页面的变量,如上述的itemList,可以反回任何值,字串、数字,List等都可以。
在我们示例中返回了字串,现在可以在页面中输入如下代码 :
<#assign testTag= newTag("testTag")>
<#assign myValue = testTag () >
返回值 是:${myValue}
那么页面会输出exec方法返回的变量。
参数的传递
exec方法中的Map params参数存储了由页面中传递过来的变量,如:
<#assign testTag= newTag("testTag")>
<#assign myValue = testTag ("{'catid':1}") >
像上面标红的示例一样,参数是通过json的格式传递的,那么在标签类中获取参数值如下:
protected Object exec(Map params) throws TemplateModelException {
Integer catid = (Integer)params.get("catid");
return "这是一个测试,catid是"+catid;
}
参数的名字(catid),就是map参数的key,值得注意的是参数值的数据类型,上述例子的json串:{'catid':1} catid值就是Integer型,因为没有加引号,如下的例子就会是String型:{'catid': '1'}
小提示
1、javashop中的标签都已自动纳入spring的容器管理,所以在标签类中可以正常的注入使用spring的其它bean。
2、javashop为以下包名设置了spring的注解扫描:
com.enation.app.base
com.enation.app.shop
com.enation.app.cms
如果在你的项目中需要扫描其它包名,请在spring配置文件中通过如下代码配置:
<!-- 定义此应用的组件扫描包 -->
<context:component-scan base-package="com.enation.app.shop" />
API开发指南
首先值得说明的是,上述所说的API和正常的struts2 Action没有丝毫区别。
只不过访问路径必须是在/api/下,这个目径下不会被模板机制拦截,可以正常的由struts2响应。
一、示例
同样是要继承“com.enation.framework.action.WWAction”如
@Component
@Scope("prototype")
@ParentPackage("eop_default")
@Namespace("/api/wine")
@Action("test")
public class TestApiAction extends WWAction {
public String delete(){
this.showSuccessJson("成功啦");
return this.JSON_MESSAGE;
}
}
其中的注解:
@Component 同样是让spring自动扫描为 spring bean。
@Scope("prototype") 生命bean的生命周期为prototype,这是为了多线程时的数据安全。
@Namespace("/api/wine") 是这个是根据你的项目需要定义的namespace,这个决定了你的api访问路径
@Action("test") 定义这个action的访问路径。
像上述示例的api,需要通过如下地址访问:
/api/wine/test!delete.do
这样就会调用delete方法,这个api的返回结果会是:
{"result":1,"message":"成功啦"}
返回的json串的规范对于我们意义重大,我们规定:
1、json串中必须含有结果值,我们规定用result来表示,1表示成功,0表示失败。
2、json串的名称部分必须用双引号,字串值也必须用双引号(否则jquery1.4以后的版本不支持)
javashop提供了常用方法帮助大家生成json串,这些方法有:
基类WWAction中的方法:
showSuccessJson
返回成功结果的字串,如:
this.showSuccessJson("成功啦");
返回
{"result":1,"message":"成功啦"}
showErrorJson
返回失败的字串
this.showErrorJson("出错啦");
返回:
{"result":0,"message":"出错啦"}
如果我们需要返回更复杂的json串时该怎么办呢?
实际上我们是通过为WWAction基类的json属性赋值来实现向客户端返回字串的,比如 调用
this.showSuccessJson("成功啦");实际是做了如下操作
this.json=” {\"result\":1,\"message\":\"成功啦\"}”
如果需要返回更复杂的json串,那么构造好字串并赋值给json属性就可以了。
Javashop提供了
com.enation.framework.util.JsonMessageUtil
工具类来帮助生成json串,具体请参考此类。
小提示
javashop为以下包名设置了struts的注解扫描:
com.enation.app.base.core.action
com.enation.app.shop.core.action
com.enation.app.cms.core.action
如果在你的项目中需要扫描其它包名,请在struts配置文件中通过如下代码配置:
<constant name="struts.convention.action.packages" value="com.enation.app.shop.core.action" />