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对象,就相当于request或response,tp.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');
注意,注册一个商店时还涉及到另外两张表,store和catalog表,如果访问页面时出现下面的报错信息,请检查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,acactactgp,acactgrp.具体操作如下:
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(){}方法是必须的,该方法就相当于struts之action中的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表中的。