基于webx的小实例

    webx中通过velocity渲染得到如下效果:

     

    

     第一个功能是,允许通过用户名或者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.java
package 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.xml
     biz-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 ,如有错误请指教!

该文档为官方webx框架文档,对webx进行了全面的讲解,非常实用,并附学习的Demo 为什么要用Webx而不是其它的开源框架? 现在有很多Java的Web框架可供选择,并且它们也都是免费的。例如: • Struts • Webwork • Tapestry • Spring MVC 以上框架都是非常优秀的。说实话,如果阿里巴巴网站在2001年开始,就有这么多可选择的话,无论选择哪一个都不会有问题。因为这些年来,所有的开源Web框架都在互相学习、并趋于相似。Webx也不例外,它吸收了其它框架的很多想法。因此,当你使用Webx的时候,你会觉得在很多方面,它和其它开源的框架非常类似。我并不是说所有的框架都一样好,而是说只要假以时日,所有的框架在发展过程中,必然会积聚好的方面,淘汰坏的方面,从而变得足够好。从这个角度看,的确没有特别明显的理由来选择Webx,但也没有明显的理由不选择Webx。 另一方面,由于每一种框架采用不同的设计,必然会有各自的优势。Webx也是如此 —— 它在某些方面有一些独到的设计,超越了同类框架。Webx有哪些优势呢? Webx的优势 成熟可靠性 这个优势主要是针对阿里巴巴及属下网站而言。因为Webx在阿里巴巴和淘宝用了很多年。对于这种超大访问量的电子商务网站,Webx经受了考验,被证明是成熟可靠的。 开放和扩展性 • 对Spring的直接支持 —— Spring是当今主流的轻量级框架。Webx 3.0和Spring MVC一样, 完全建立在Spring框架之上,故可运用Spring的所有特性。 • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是“bean”,而是升级成“组件”。一个组件可以扩展另一个组件,也可以被其它组件扩展。这种机制造就了Webx的非常好的扩展性,且比未经扩展的Spring更易使用。 • 开放性 —— Webx被设计成多个层次,层次间的分界线很清晰。每个层次都足够开放和易于扩展。你可以使用全部的Webx,也可以仅仅使用到Webx的任何一个层次。 引言 ............................................................................................................................... ix 1. 阅读向导 ............................................................................................................. ix 2. Webx是什么? .................................................................................................... ix 3. Webx的历史 ....................................................................................................... ix 4. 为什么要用Webx而不是其它的开源框架? ............................................................. x 5. Webx的优势 ........................................................................................................ x 5.1. 成熟可靠性 ................................................................................................ x 5.2. 开放和扩展性 ............................................................................................. x 6. Webx还缺少什么? .............................................................................................. x 部分 I. Webx框架概览 ......................................................................
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值