Commerce学习摘要(基础部分)

1、 如何操作数据库

    对于数据库的操作,我们无需自己另起炉灶,因为com.ibm.commerce.base.helpers.BaseJDBCHelper类已经封装了许多有关数据库的操作,所以我们只需要调用其中的相关方法就可以了。首先是连接数据库,这里有两种方式,一种是直接通过makeConnection()方法进行连接,这种方式需要我们自定义的类继承自BaseJDBCHelper类;另外一种是通过BaseJDBCHelper.getDataSource().getConnection()的方式进行连接,这种方式我们只需在自定义的类中引入BaseJDBCHelper类即可。连接成功后,我们就需要创建一个PreparedStatement对象,以便传送我们的sql语句到数据库。这里也有两种方式,一种是通过getPreparedStatement(String sql)方法来创建PreparedStatement对象,还有一种就是通过BaseJDBCHelper.getDataSource().getConnection().prepareStatement(String sql)的方式来创建。实际开发中,可以根据各自的习惯来选用自己喜欢的方式,但个人比较推荐的是第二种方式,因为java中是只支持单继承的。

2、 如何获取前台数据

      TypedProperty tp = getRequestProperties();

      然后通过tp.getXXX("前台字段或url参数的名字");的方式来获取前台数据。

3、 如何提交请求

    在jsp页面中,我们可以将请求提交给某个ControllerCommand,形如下面的格式:

<form name = “表单名称” action = “/webapp/wcs/stores/servlet/接口对应的path”>

</form>

例如,假如我们的struts-config-ext.xml文件中有下面这么一段,

<action-mappings>

<action path="/MyNewControllerCmd" type="com.ibm.commerce.struts.BaseAction" parameter="com.ibm.commerce.sample.commands.MyNewControllerCmd"/>

</action-mappings>

那么,接口对应的path值便是其中红色的部分,即MyNewControllerCmd

4、 如何获取后台数据?

        TypedProperty tp = new TypedProperty();

    然后通过tp.put("key","value");的方式将数据保存起来,在前台我们就可以通过key把数据取出来了。如:<c:out value=”${key}”/>,就可以输出”value”了。

    另外,在获取后台数据的时候,如果报 定制标记属性 value 不能是运行时表达式的错误信息,那应该是我们的jstl标签库引入有问题,正常的话应该引入下面的标签库:

        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

    但如果不小心引入的是另外一个标签库的话,

        <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

    则就会报上面的错误信息。

    其实,这里的TypedProperty对象,就相当于requestresponsetp.put()就相当于request.setAttribute(); TypedProperty类位于com.ibm.commerce.datatype这个包下。

5、 如何在ControllerCommand中跳转页面(返回view)

TypedProperty tp = new TypedProperty();

tp.put(ECConstants.EC_VIEWTASKNAME,"我们先前创建的view的名字 ");

setResponseProperties(tp);//该句必不可少,否则将不会进行跳转。

上面这两句话的作用就是用来跳转到目标页面的,这个view的名字指的就是

forward标记中name的值,它既可以对应一个jsp页面,也可以对应另一个ControllerCommand,如果对应的是另一个ControllerCommand,则

<forward  name="MyNewView"  path="/myNewViewTemplet.jsp"

className="com.ibm.commerce.struts.ECActionForward">

</forward>

path的值与

<action-mappings>

      <action path="/MyNewView”type="com.ibm.commerce.struts.BaseAction"></action>

   </action-mappings>

path的值应该保持一致。

另外,在跳转页面的时候,我们还可以带上参数。写法如下:

tp.put(ECConstants.EC_VIEWTASKNAME,"我们先前创建的view的名字 ");

tp.putUrlParam("参数名1",参数值1);

tp.putUrlParam("参数名2",参数值2);

注意:每个ControllerCommand中是根据自己的需要来决定是否要返回一个view的,并不是一定要返回一个view

ECConstants接口中的各个常量都代表什么含义呢???

6、 页面开发步骤

       1)、创建一个jsp文件,所有的jsp文件放在Stores/WebContent/目录下。

       2)、打开struts-config-ext.xml文件,创建一个view用来映射jsp。这样在浏览器中访问的时候,我们只需敲入该view的名字就可以访问到其对应的jsp页面了。代码如下:

    <global-forwards>

             <forward  name="MyNewView/10101" path="/myNewViewTemplet.jsp"

className="com.ibm.commerce.struts.ECActionForward">

</forward>

    </global-forwards>

    <action-mappings>

        <action path="/MyNewView" type="com.ibm.commerce.struts.BaseAction"></action>

</action-mappings>

       MyNewView后面的10101,表示的是一个store_id,这个我们可以从store表中来查询。

select store_id from store where directory = 'ConsumerDirect';

        注意:在action里没有parameter 属性的情况下, forward中的name(去掉商店标识后)action中的path值必须保持一致,否则会报com.ibm.commerce.struts.BaseAction executeView CMN0203E: 找不到命令MyNewView的错误。

        另外,在注册view之前,我们最好检验商店标识是否唯一。方法如下:

        打开http://localhost/webapp/wcs/admin/servlet/db.jsp页面,输入

        select storeent_id from storeent where identifier='ConsumerDirect'

        点击查询即可。

        下面开始注册一个商店。

         insert into storeent(storeent_id,member_id,type,setccurr,identifier)                    values(10101,7000000000000000001,'S','USD','ConsumerDirect');

        注意,注册一个商店时还涉及到另外两张表,storecatalog表,如果访问页面时出现下面的报错信息,请检查store表中是否有我们先前注册的商店。

       3)、设置访问权限。

        D:\WCToolkitEE60\xml\policies\xml这个目录下,创建一个xml文件,名称为MyNewViewACPolicy.xml,然后在该文件中配置访问权限。内容如下:

      <?xml version="1.0" encoding="utf-8" standalone="no" ?>

      <!DOCTYPE Policies SYSTEM "../dtd/accesscontrolpolicies.dtd">

      <Policies>

          <Action Name="MyNewView" CommandName="MyNewView"></Action>

          <ActionGroup Name="AllSiteUsersViews"  OwnerID="RootOrganization">

              <ActionGroupAction Name="MyNewView"/>

          </ActionGroup>

      </Policies>

    完了以后,进入DOS窗口,切换到

        D:\WCToolkitEE60\bin目录下,然后,acpload  xml文件名 进行加载。

    注意:在执行acpload命令前,必须停止WebSphere Commerce Test Server服务器的运行。

另外,view的控制权限加载还有另外一种方法,就是直接操作数据库,这里涉及到3张表,acaction,acactactgpacactgrp.具体操作如下:

insert into acaction (acaction_id, action) values ((selectmin(acaction_id) - 1 from acaction),'MyNewView');

insert into acactactgp (acaction_id, acactgrp_id) values ((selectacaction_id from acaction where action = 'MyNewView'),(selectacactgrp_id from acactgrp where groupname = 'AllSiteUsersViews'));

       4)、在ie中敲入http://localhost/webapp/wcs/stores/servlet/MyNewView?storeId=10101进行测试。

7、 ControllerCommand开发步骤

      所有的Command,包括TaskCommand都必须放在WebSphereCommerceServerExtensionsLogic/src/这个目录下面。

     1)、创建一个command接口MyNewControllerCmd,该接口需继承com.ibm.commerce.command.ControllerCommand接口;MyNewControllerCmd接口中需定义一个final型属性,其作用就是自动调用它的实现类。

static final String defaultCommandClassName = "com.ibm.commmerce.sample.commands.MyNewControllerCmdImp";

     2)、创建myNewControllerCommand接口的实现类myNewControllerCommandImp,该类也必须继承自com.ibm.commerce.command.ControllerCommandImpl类;注意,在myNewControllerCommandImp实现类中,public void performExecute(){}方法是必须的,该方法就相当于strutsaction中的public ActionForward execute (ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response){}方法。另外,还有一个public void validateParameters() throws ECException{}方法,我们可以根据自己的需要来决定是否要加入该方法。ControllerCommandImpl主要是用来实现逻辑控制的,所以尽量把业务处理方面放在TaskCommand中来实现。

     3)、将我们创建的接口和实现类注册到cmdreg表中,所谓的注册,就是往该表中添加一条记录:insert  into cmdreg (storeent_id,interfacename,description,classname,target) values

(10101,'com.ibm.commmerce.sample.commands.MyNewControllerCmd','','com.ibm.commmerce.sample.commands.MyNewControllerCmdImp','Local');

     4)、写入struts-config-ext.xml配置文件:

      打开struts-config-ext.xml文件,加入下面语句。

      <action-mappings>

        <action path="/MyNewControllerCmd" type="com.ibm.commerce.struts.BaseAction "                                        parameter="com.ibm.commerce.sample.commands.MyNewControllerCmd">

          </action>

     </action-mappings>

    5)、加载控制权限

     同样,在D:\WCToolkitEE60\xml\policies\xml这个目录下,创建一个xml文件,文件名为MyNewControllerCmdACPolicy.xml内容如下:

     <?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>

     <!DOCTYPE Policies SYSTEM "../dtd/accesscontrolpolicies.dtd">

     <Policies>

        <Action Name="ExecuteCommand" CommandName="Execute"></Action>

        <ResourceCategory Name="com.ibm.commerce.sample.commands.MyNewControllerCmdResourceCategory"            ResourceBeanClass="com.ibm.commerce.sample.commands.MyNewControllerCmd">

                  <ResourceAction Name="ExecuteCommand"/>

        </ResourceCategory>   

        <ResourceGroup Name="AllSiteUserCmdResourceGroup" OwnerID="RootOrganization">

           <ResourceGroupResource Name="com.ibm.commerce.sample.commands.MyNewControllerCmdResourceCategory" />

        </ResourceGroup>

    </Policies>

完了以后,进入DOS窗口,切换到D:\WCToolkitEE60\bin目录下,然后,acpload xml文件名 进行加载。

另外,command的控制权限加载也有另外一种方法,这里也涉及到3张表:

acrescgry, acresgpres, acresgrp。具体如下:

insert into acrescgry (acrescgry_id, resclassname) values ((selectmin(acrescgry_id) - 1 from acrescgry),'com.ibm.commerce.sample.commands.MyNewControllerCmd');
insert into 
acresgpres (acresgrp_id, acrescgry_id) values ((selectacresgrp_id from acresgrp wheregrpname='AllSiteUserCmdResourceGroup'), (select acrescgry_id fromacrescgry where resclassname='com.ibm.commerce.sample.commands.MyNewControllerCmd'));

8、 DataBean的使用

        DataBean是用来存储数据的,所有的DataBean都被放在WebSphereCommerceServerExtensionsData这个目录下。我们在创建databean的时候,只需要继承com.ibm.commerce.beans.SmartDataBeanImpl这个类,然后再实现com.ibm.commerce.beans.SmartDataBean这个接口即可。如:

public class MyDataBean extends SmartDataBeanImpl implements SmartDataBean{}

    通过databean,我们可以先把若干数据封装在一个对象里面,然后把这个对象传到前台去。在前台页面中,我们通过<c:out value=”${对象.字段}”/ >的形式就可以获取相关数据了。

9、 TaskCommand开发步骤

       ControllerCommand的开发步骤类似,TaskCommand的作用就是任务的具体执行者,最终还是要被ControllerCommand来调用的。具体如下:

       1)、创建一个TaskCommand接口,名为MyNewTaskCommand,该接口必须要继承自com.ibm.commerce.command.TaskCommand接口,MyNewTaskCommand接口中需定义一个final型属性,其作用就是自动调用它的实现类。static final String defaultCommandClassName = "com.ibm.commmerce.sample.commands. MyNewTaskCmdImpl ";另外,根据需要,我们还可以在接口中创建一些方法和常量。

       2)、创建MyNewTaskCommand接口的实现类MyNewTaskCmdImpl,该实现类需要继承自com.ibm.commerce.command.TaskCommandImpl类。在我们的实现类中,也有个public void performExecute(){}方法,该方法是必须的。所有的任务都被放在这个方法中进行处理,然后在ControllerCommand中被调用,另外,它也有一个public void validateParameters() throws ECException{}方法,该方法是用来验证数据的,可以根据自己的需要来决定是否加入该方法,另外,也可以在MyNewTaskCmdImpl类中加入自定义的方法。

       3)、调用MyNewTaskCommand

       myNewControllerCommandImp这个类的performExecute()方法中,我们可以调用MyNewTaskCommand,首先,我们通过com.ibm.commerce.command.CommandFactory工厂来实例化一个MyNewTaskCommand对象,如下:

MyNewTaskCommand  cmd = (MyNewTaskCommand)CommandFactory

              .createCommand(MyNewTaskCommand.CLASSNAME, getStoreId());

cmd. setCommandContext(getCommandContext());

    上面只是进行了MyNewTaskCommand的初始化工作,但是我们还需要调用MyNewTaskCommand类中的performExecute()方法,这样才能真正的调用我们的MyNewTaskCommand类,这一步我们可以通过下面的语句来完成。

cmd.execute();

    注意:MyNewTaskCommand类中的其它方法必须在cmd.execute();这句话之后调用,否则调用将不起作用。

     4)、注意:TaskCommand是不需要注册到cmdreg表中的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值