webx中通过velocity渲染得到如下效果:
biz-ao.xml内容是
所以,比如用户选择了email,则$group.mySelect.value 的内容就变成了value对应的值 email
【不同于input类型等输入型控件】
比如input ,<input type="text" name="$group.queryString.key" value="$!group.queryString.value" size="30"/>,需要先将value设定变量,当用户输入后,就能通过这个变量取得用户的输入。再比如<textarea name="$group.appendInfo.key" cols="30" rows="10">$!group.appendInfo.value</textarea>
【调试技巧】 可以通过简单的javascript代码进行测试!如 <script> alert('$group.mySelect.value'); </script>
【如何跳转?】
第一个功能是,允许通过用户名或者email对数据进行查询。
第二个功能是,查询出数据表中的所有记录。
【实验目的】 属性webx中spring和ibatis的使用!
1、修改sqlmap对应的xml文件,此处是NameList.xml ,在sqlmap文件夹下,是ibatis的映射文件
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://toolkit.alibaba-inc.com/dtd/ibatis/sql-map-2.dtd">
<sqlMap namespace="Names">
<typeAlias alias="namelist" type="com.taobao.webx.module.NameList" />
<resultMap id="namelistResult" class="namelist">
<result property="name" column="NAME" />
<result property="email" column="EMAIL" />
<result property="appendInfo" column="APPENDINFO" />
</resultMap>
<!--
- ===============================================
- 创建一个namelist对象
- ===============================================
-->
<insert id="addNameListInfo" parameterClass="namelist">
<![CDATA[
insert into SITE_USER (
NAME,
EMAIL,
APPENDINFO
) values (
#name#,
#email#,
#appendInfo#
)
]]>
</insert>
<!--
- ===============================================
- 通过name 或者 email 查找user
- ===============================================
-->
<select id="getNameListByName" resultMap="namelistResult" parameterClass="string"><![CDATA[
select
SITE_USER.*
from
SITE_USER
where
SITE_USER.NAME = #value#
]]></select>
<select id="getNameListByEmail" resultMap="namelistResult" parameterClass="string"><![CDATA[
select
SITE_USER.*
from
SITE_USER
where
SITE_USER.EMAIL = #value#
]]></select>
<select id="getTableView" resultMap="namelistResult"><![CDATA[
select
SITE_USER.*
from
SITE_USER
]]></select>
</sqlMap>
这个xml文件中包括了每个方法对于的SQL语句、参数、返回值。
2、新建一个NameListAO类。主要是对外提供方法。
public class NameListAO extends ApplicationObjectSupport{
private NameList newname;
private NameListDAO nameListDAO;
private String queryName;
private String queryEmail;
public void setQueryName(String name){
this.queryName = name;
}
public void setQueryEmail(String email){
this.queryEmail = email;
}
public void setNewname(NameList name){//对应"newname"的set方法
this.newname = name;
}
public void setNameListDAO(NameListDAO nameDAO){
this.nameListDAO = nameDAO;
}
public Result doAddNameList(){
//插入到数据库中
nameListDAO.addNameListInfo(newname);
return new ResultSupport();
}
public Result doGetNameListByName() {
NameList resNamelist = nameListDAO.getNameListByName(queryName);
Result res = new ResultSupport();
res.getModels().put("resNameList", resNamelist);
return res;
}
public Result doGetNameListByEmail() {
NameList resNamelist = nameListDAO.getNameListByEmail(queryEmail);
Result res = new ResultSupport();
res.getModels().put("resNameList", resNamelist);
return res;
}
public Result doGetTableView(){
List<NameList> resNamelists = nameListDAO.getTableView();
Result res = new ResultSupport();
res.getModels().put("tableview", resNamelists);
return res;
}
}
这个类中引用了DAO类,因此先声明DAO接口,NameListDAO.javapackage com.taobao.webx.dao;
import java.util.List;
import com.taobao.webx.module.NameList;
public interface NameListDAO {
void addNameListInfo(NameList namelist);
NameList getNameListByName(String name);
NameList getNameListByEmail(String email);
List<NameList> getTableView();
}
这个还只是接口,因此需要实现类IbatisNameListDAO.java,是DAO具体实现的类public class IbatisNameListDAO extends SqlMapClientDaoSupport implements NameListDAO {
public void addNameListInfo(NameList namelist) {
// TODO Auto-generated method stub
getSqlMapClientTemplate().update("addNameListInfo",namelist);
}
public NameList getNameListByName(String name) {
// TODO Auto-generated method stub
return (NameList)getSqlMapClientTemplate().queryForObject("getNameListByName",name);
}
public NameList getNameListByEmail(String email) {
// TODO Auto-generated method stub
return (NameList)getSqlMapClientTemplate().queryForObject("getNameListByEmail",email);
}
@SuppressWarnings("unchecked")
public List<NameList> getTableView() {
// TODO Auto-generated method stub
return (List<NameList>)getSqlMapClientTemplate().queryForList("getTableView");
}
}
AO类如何初始化呢?依靠两个文件:biz-ao.xml和biz-dao.xmlbiz-ao.xml内容是
<beans default-autowire="byName">
<bean id="myname" class="com.taobao.webx.ao.NameListAO" singleton="false"/>
</beans>
biz-dao.xml内容是:<beans default-autowire="byName">
<bean id="nameListDAO" class="com.taobao.webx.dao.impl.IbatisNameListDAO" />
</beans>
通过这两个文件,当command封装AO类和方法时就可以初始化对应的AO类和DAO类,从而实现对应方法的调用!
ok,先回到开始,如何建立像如图所示的那种vm文件?
先修改form.xml添加一个group
<!-- 通过用户名来查询 -->
<group name="queryGroupID">
<field name="queryString">
<required-validator>
<message>请输入查询的内容</message>
</required-validator>
</field>
<field name="mySelect" />
</group>
对应的下拉框代码为<select name="$group.mySelect.key">
<option value="用户名" selected>用户名</option>
<option value="email" >email</option>
</select>
【注意】 option标签间的内容是用来 “显示用的”,当你选择某个选项后你能取到的值其实“就是option中value对应的值!”所以,比如用户选择了email,则$group.mySelect.value 的内容就变成了value对应的值 email
【不同于input类型等输入型控件】
比如input ,<input type="text" name="$group.queryString.key" value="$!group.queryString.value" size="30"/>,需要先将value设定变量,当用户输入后,就能通过这个变量取得用户的输入。再比如<textarea name="$group.appendInfo.key" cols="30" rows="10">$!group.appendInfo.value</textarea>
【调试技巧】 可以通过简单的javascript代码进行测试!如 <script> alert('$group.mySelect.value'); </script>
【如何跳转?】
<form action="" method="post">
<input type="hidden" name="action" value="name_list_action"/>
<input type="submit" name="event_submit_do_show" value="Show"/>
</form>
ok,接着新建Action类并实现Command类的封装
public abstract class NameListAction extends TemplateAction{
protected abstract FormService getFormService();
protected abstract CommandDispatcher getCommandDispatcher();
@SuppressWarnings("unchecked")
public void doAddName(RunData rundata, TemplateContext context) throws WebxException {
Form form = this.getFormService().getForm(rundata);
if (form.isValid()) {
Group group = form.getGroup("addNameListGroupID");
NameList nameList = new NameList();
group.setProperties(nameList);
//封装到spring中执行
Command command = new CommandSupport("myname","addNameList");
command.getParameters().put("newname", nameList);//调用set方法注入
Result res = this.getCommandDispatcher().execute(command);
if(res.isSuccess()) {
context.put("newNamelist", nameList);
rundata.setRedirectTarget("viewNameList.vm");
}
}
}
@SuppressWarnings("unchecked")
public void doQuery(RunData rundata, TemplateContext context) throws WebxException {
Form form = this.getFormService().getForm(rundata);
if (form.isValid()) {
Group group = form.getGroup("queryGroupID");
String select = group.getField("mySelect").getStringValue();
String query = group.getField("queryString").getStringValue();
Command command = null;
if(select.equals("用户名")){
command = new CommandSupport("myname","getNameListByName");
command.getParameters().put("queryName", query);
} else if(select.equals("email")) {
command = new CommandSupport("myname","getNameListByEmail");
command.getParameters().put("queryEmail", query);
}
// System.out.println(select+","+query);
Result res = this.getCommandDispatcher().execute(command);
if(res.isSuccess()) {
context.put("queryNamelist", res.getModels().get("resNameList"));
context.put("queryClassfy",select);
rundata.setRedirectTarget("query.vm");
}
}
}
public void doShow(RunData rundata, TemplateContext context) throws WebxException {
Command command = new CommandSupport("myname","getTableView");
Result res = this.getCommandDispatcher().execute(command);
if(res.isSuccess()) {
context.put("tableview", res.getModels().get("tableview"));
rundata.setRedirectTarget("tableShow.vm");
}
}
}
Command类是通过new CommandSupport("AO类名称","要调用的AO类方法名")。
下面介绍下velocity中List变量如何在vm中渲染
【vm中变量的由来】要么是webx内置变量,如$form,要么是通过Context.put方法放入的,要么是form.xml中声明的!
#foreach($info in $FinalTable)
<tr>
<td>$info.name</td>
<td>$info.email</td>
<td>$info.appendInfo</td>
</tr>
#end
是用foreach遍历的。与Map类型不同,Map遍历如下#foreach($info in $MyMap.entrySet())
<tr>
<td>$info.name</td>
<td>$info.email</td>
<td>$info.appendInfo</td>
</tr>
#end
这样就可以实现前面所要实现的功能了!转载请注明 blog.csdn.net/whuslei ,如有错误请指教!