使用buffalo集成spring写的一个简单的登录子模块

    buffalo是国内的michal chen所写的一个AJAX远程调用框架,目前版本是1.2.2。知道这东西是从我开始收集有关AJAX的相关资料时从JAVAEYE上看到了推荐,再怎么说也是国产架构,看demo感觉很不错,就下来了开始学学。
  • Buffalo使用burlap协议。因此Buffalo解析大数据量可能会比较慢,然而可以适用于多种服务器端和客户端,并且burlap协议的完整性和支持的数据类型更加丰富
  • Buffalo基于prototype,如果你的AJAX应用也是基于prototype,那么可以减少重复加载prototype的带宽,并且获得相当一致的编程概念,而且易学易用。

    以上是javaeye给出的推荐理由,我这两天的接触也证明burlap协议确实封装的很好。至于prototype.js,因我对于JS的使用经验有限,不敢妄谈。目前版本的buffalo可以集成spring,这一开始就很吸引我,我们可以搭建一个控制器放在客户端的应用了?(我称它为消失的“控制器”)我们可以把所有的业务逻辑封装在spring组合起来的业务层中,暴露需要远程调用的“服务”给客户端,我们不再需要什么控制器,我们的AJAX引擎起到了同样的作用。那就试试吧, let's go!

     

    1。login.jsp,简单的登陆界面

     


    <script language="JavaScript" src="script/prototype.js"></script>
    <script language="JavaScript" src="script/buffalo-1.1.js"></script>
    <script language="JavaScript" src="script/template.js"></script>
    <script language="javascript">
    var springEndPoint="<%=request.getContextPath()%>/remoting/Spring-buffalo";
    var buffalo = new Buffalo(springEndPoint);

    function doSubmit() {
            var name=Buffalo.getElementById("name").value;
            var password=Buffalo.getElementById("password").value;
     buffalo.remoteCall("userService.login", [name,password], function(reply){
      $("form_infomsg").innerHTML=reply.getResult();
     })
    }

    </script>

    <h1>Form demos</h1>
    <hr/>
    <div id="form_infomsg" style="color:blue"></div>
    <form id="form1" name="form1" method="get" οnsubmit="return false;">
      <label for="textfield">Username</label>
      <input type="text"  id="name" value="dennis"/>
      <br />
      <label for="label">Password</label>
      <input type="password"  id="password" value="123"/>
      <br />
     <label for="Submit"></label>
     <input type="submit" name="Submit" value="submit" id="Submit" οnclick="doSubmit();"/>
     <input type="reset" name="Submit2" value="Reset" />
    </form>

    这里的重要代码片段是:

    buffalo.remoteCall("userService.login", [name,password], function(reply){
      $("form_infomsg").innerHTML=reply.getResult();
     })
    此处调用暴露的远程服务userService.login,参数是name,password,返回结果显示在form_inforsg上

     

     

    2。我们在哪里注册我们的远程服务?首先buffalo与spring的集成

     

    //web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
      <display-name>Rhinoceros Blog</display-name>
    <!-- Encoding Filter Mapping Start-->
        <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>
      /WEB-INF/applicationContext.xml
     </param-value>
        </context-param>
        <servlet>
         <servlet-name>context</servlet-name>
     <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
     <load-on-startup>1</load-on-startup>
        </servlet>

       <servlet>
     <servlet-name>remoting</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>4</load-on-startup>
       </servlet>
       <servlet>
      <servlet-name>service</servlet-name>
      <servlet-class>net.buffalo.server.BuffaloServiceServlet</servlet-class>
      <init-param>
       <param-name>debug</param-name>
       <param-value>true</param-value>
      </init-param>
       </servlet>
       <servlet-mapping>
     <servlet-name>remoting</servlet-name>
     <url-pattern>/remoting/*</url-pattern>
       </servlet-mapping>

      <servlet-mapping>
           <servlet-name>service</servlet-name>
     <url-pattern>/BUFFALO</url-pattern>
      </servlet-mapping>

    </web-app>

    请注意,我们把所有/remoting/*形式的URL全部交给DispatcherServlet处理,它负责如何进行远程调用,在login.jsp中我们看到了springEndPoint="<%=request.getContextPath()%>/remoting/Spring-buffalo";

    //remoting-servlet.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>

     <bean name="/Spring-buffalo" class="net.buffalo.spring.BuffaloServiceExporter">
      <property name="services">
                <map>
                     <entry key="userService">
                        <ref bean="userService"/>
                    </entry>
                </map>
            </property>
     </bean>
     
    </beans>
    你可以把remoting-servlet.xml理解成一个映射文件,客户端通过这来寻找所需要的服务,我们已经在这里注册了服务userService,引用到的javabean的ID为userService

    最后一个配置文件:spring的applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
         <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
         <property name="username" value="root"/>
         <property name="password" value="123"/>
         <property name="url" value="jdbc:mysql://localhost:3306/rhino?"/>
         <property name="maxActive" value="100"/>
      </bean>
      <bean id="userService" class="com.denny_blue.rhino.service.UserService">
          <property name="dataSource" ref="dataSource"/>
      </bean>
      <bean name="buffaloConfigBean" class="net.buffalo.service.BuffaloServiceConfigurer">
       <property name="services">
                <map>
                    <entry key="userService">
                        <ref bean="userService"/>
                    </entry>
                </map>
            </property>
        </bean>
    </beans>

    应用所有用到的业务对象都在这里进行组装.

     

     

    3.JavaBean AND service

     

    接下来,让我们看看UserService这个类,它实现了一个远程调用服务,为了获得HttpSession,它必须继承自BuffaloService(从这个角度看,想实现干净的,完全脱离servlet的框架很难).

    /*
     * 创建日期 2006-3-23
     *
     *
     *
     */
    package com.denny_blue.rhino.service;

    import java.sql.ResultSet;
    import java.sql.SQLException;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import javax.sql.DataSource;

    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowCallbackHandler;

    import net.buffalo.server.BuffaloService;

    import com.denny_blue.rhino.bean.UserBean;

    /**
     * @author dennis
     *
     *
     *
     */
    public class UserService extends BuffaloService{
     DataSource dataSource;
     public void setDataSource(DataSource dataSource){
      this.dataSource=dataSource;
     }
     public DataSource getDataSource(){
      return dataSource;
     }
     private UserBean getUser(String name){
            final UserBean user=new UserBean();
         JdbcTemplate jt=new JdbcTemplate(dataSource);
      jt.query("select * from rh_user where name=/'"+name+"/'",
          new RowCallbackHandler(){
                public void processRow(ResultSet rs)throws SQLException{
                 user.setId(rs.getInt("id"));
                 user.setName(rs.getString("name"));
                 user.setPassword(rs.getString("password"));

                    }
                 }
       );
     // System.out.println(user.getName()+user.getPassword());
      return user;


     }
     public String login(String name,String password){
      UserBean user=getUser(name);
      if(user.getName()==null||user.getName().equals(""))
        return "用户名错误!!!";
      System.out.println(user.getName()+"     "+name);
      HttpServletRequest request=(HttpServletRequest)getRequest();
      HttpSession session=request.getSession();
      if(user.getName()!=null&&user.getPassword()!=null&&
        !user.getName().equals("")&&!user.getPassword().equals("")){
         if((user.getName()).equals(name)&&(user.getPassword()).equals(password)){
       session.setAttribute(Constants.USER_KEY,user);
       System.out.println("Session Binding.....");
       session.setMaxInactiveInterval(100);
          return "登陆成功!!";
         }
         else
         return "密码错误,登陆失败!!";
      }

      return "登陆失败";
     }
    }

  • UserBean.java

    /*
     * 创建日期 2006-3-21
     *
     *
     *
     */
    package com.denny_blue.rhino.bean;

    /**
     * @author dennis
     *
     *
     *
     */
    public class UserBean {
     private int id;
     private String name;
     private String password;

     //constructor
     public UserBean(){}
     public UserBean(int id,String name,String password){
      this.id=id;
      this.name=name;
      this.password=password;
     }

     //getter setter
     public void setId(int id){
      this.id=id;
     }
     public int getId(){
      return id;
     }
     public void setName(String name){
      this.name=name;
     }
     public String getName(){
      return name;
     }
        public void setPassword(String password){
         this.password=password;
        }
        public String getPassword(){
         return password;
        }

    }

    业务逻辑很简单,查询数据库,进行密码核对,返回登陆成功或者失败的字符串给客户端,登陆成功记录session.要想运行这个例子,必须建立数据库(你可以根据spring配置文件进行相应修改).

  • 看到了吗?我们只需要spring提供服务接口,然后在客户端利用buffalo进行调用,这中间的一切buffalo已经为我们省略了.

     

    在做这个简单例子的时候也遇到过两个问题,不知道是不是版本更迭导致的.一个是如果想使用spring,我的页面只能引入buffalo-1.1.js,新版的好象路径有错误.UserService继承BuffaloService,是旧版本server包中的,我使用1.2的新版本反而不能成功,不知道为何,待我看看源代码再谈.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值