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" />

results matching ""

    No results matching ""