SSH网上商城之使用ajax完成用户名是否存在异步校验

小伙伴在上网的时候,需要下载或者观看某些视频资料,更或者是在逛淘宝的时候,我们都需要注册一个用户,当我们填写好各种信息,点击确定的时候,提示用户名已经存在,小编就想,为什么当我们填写完用户名的时候,她就自动提示用户名已经存在,我们也不需要浪费那么多感情,直到填写完那么多的信息之后在提示,在小编最近的项目中,就碰到这个问题,我们可以使用ajax完成用户名是否存在,今天这篇博客,小编就简单的总结一下,如何使用ajax来完成校验,还请小伙伴多多指教哦`(*∩_∩*)′!

首先ajax完成用户名是否存在异步校验,那么我们该如何做呢?在这里,我们要由事件进行触发,也就是说,我们在用户名里面输入的时候,鼠标移开,这个事件叫做onblur,即失去焦点,与其相对的,鼠标放在里面获得焦点,我们称之为onfocus,那么失去焦点,我们该怎么操作呢?首先找到注册页面,在注册页面找到用户名那部分的代码,在后面加上onblur=checkUsername(),校验用户名即可,接着我们来编写方法checkUsername,具体代码如下所示:

<span style="font-size:18px;">function checkUsername() {
    //获取文本框值:
    var username = document.getElementById("username").value;
    //1、创建异步交互对象
    var xhr = createXmlHttp();
    //2、设置监听
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4) {
        if (xhr.status == 200) {
          document.getElementById("span1").innerHTML = xhr.responseText;
        }
      }
    }
    //3、打开连接
    xhr.open("GET",
        "${pageContext.request.contextPath}/user_findByName.action?time="
            + new Date().getTime() + "&username=", true)
    //4、发送
    xhr.send(null);
  }
  function createXmlHttp() {
    var xmlHttp;
    try {
      xmlHttp = new XMLHttpRequest();
    }
    catch (e) {
      try {
        xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
      }
       catch (e) {
        try {
          xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {}
      }
    }
    return xmlHttp;
  }
</span> 

接着,我们来建立实体Vo,实现模型驱动,自动实现封装,具体代码如下所示:

<span style="font-size:18px;">package cn.itcast.shop.user.vo;
public class User {
  private Integer uid;
  private String username;
  private String password;
  private String name;
  private String email;
  private String phone;
  private String addr;
  private Integer state;
  private String code;
  public Integer getUid() {
    return uid;
  }
  public void setUid(Integer uid) {
    this.uid = uid;
  }
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getPhone() {
    return phone;
  }
  public void setPhone(String phone) {
    this.phone = phone;
  }
  public String getAddr() {
    return addr;
  }
  public void setAddr(String addr) {
    this.addr = addr;
  }
  public Integer getState() {
    return state;
  }
  public void setState(Integer state) {
    this.state = state;
  }
  public String getCode() {
    return code;
  }
  public void setCode(String code) {
    this.code = code;
  }
}</span> 

我们要接收参数,实现模型驱动,ActionSupport直接实现modelDriven即可,接着来编写我们的ajax代码,需要向action中进行提交,我们来编写UserAction中的代码,具体代码如下所示:

<span style="font-size:18px;">package cn.itcast.shop.user.action;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import cn.itcast.shop.user.service.UserService;
import cn.itcast.shop.user.vo.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 用户模块Action的类
 * @author Flower
 *
 */
public class UserAction extends ActionSupport implements ModelDriven<User> {
  //模型驱动使用的对象
  private User user = new User();
  public User getModel(){
    return user;
  }
  //注入UserService
  private UserService userService;
  public void setUserService(UserService userService){
    this.userService=userService;
  }
  /**
   * 跳转到注册页面的执行方法
   */
  public String registPage(){
    return "registPage";
  }
  /**
   * ajax进行异步校验用户名的执行方法
   * @throws IOException
   */
  public String findByName() throws IOException{
    //调用Service进行查询
    User existUser = userService.findByUsername(user.getUsername());
    //获得response对象,向页面输出
    HttpServletResponse response = ServletActionContext.getResponse();
    response.setContentType("text/html;charset=UTF-8");
    //判断
    if(existUser != null){
      //查询到该用户:用户名已经存在
      response.getWriter().println("<font color='red'>用户名已经存在</font>");
    }else{
      //没查询到该用户:用户名可以使用
      response.getWriter().println("<font color='green'>用户名已经存在</font>");
    }
    return NONE;
  }
  /**
   * 用戶注册的方法:
   */
  public String regist(){
    return NONE;
  }
}
</span> 

接着,我们需要做的就是把service和Dao配置到applicationContext中,代码如下所示:

<span style="font-size:18px;"><!-- Service的配置 =========================== -->
  <bean id="userService" class="cn.itcast.shop.user.service.UserService">
    <property name="userDao" ref="userDao"/>
  </bean>
  <!-- UserDao的配置 =========================== -->
   <bean id="userDao" class="cn.itcast.shop.user.dao.UserDao">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean> </span> 

配置好了之后,我们需要在UserDao里面完成查询,具体代码如下所示:

<span style="font-size:18px;">package cn.itcast.shop.user.dao;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;
import cn.itcast.shop.user.vo.User;
/**
 * 用户模块持久层代码
 * @author Flower
 *
 */
public class UserDao extends HibernateDaoSupport {
  //按名次查询是否有该用户
  public User findByUsername (String username){
    String hql ="from User where username= ?";
    List <User> list=this.getHibernateTemplate().find(hql,username);
    if(list !=null && list.size() > 0){
      return list.get(0);
    }
     return null;
    }
}
</span> 

接着,我们需要在service里面完成对Dao的调用,具体代码如下所示:

<span style="font-size:18px;">package cn.itcast.shop.user.service;
import org.springframework.transaction.annotation.Transactional;
import cn.itcast.shop.user.dao.UserDao;
import cn.itcast.shop.user.vo.User;
/**
 * 用户模块业务层代码
 * @author Flower
 *
 */
@Transactional
public class UserService {
  //注入UserDao
  private UserDao userDao;
  public void setUserDao(UserDao userDao){
    this.userDao =userDao;
  }
  //按用户名查询用户的方法
  public User findByUsername (String username){
    return userDao.findByUsername(username);
  }
}
</span> 

接着我们需要在UserAction中进行调用,具体代码如下所示:

<span style="font-size:18px;">package cn.itcast.shop.user.action;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import cn.itcast.shop.user.service.UserService;
import cn.itcast.shop.user.vo.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 用户模块Action的类
 * @author Flower
 *
 */
public class UserAction extends ActionSupport implements ModelDriven<User> {
  //模型驱动使用的对象
  private User user = new User();
  public User getModel(){
    return user;
  }
  //注入UserService
  private UserService userService;
  public void setUserService(UserService userService){
    this.userService=userService;
  }
  /**
   * 跳转到注册页面的执行方法
   */
  public String registPage(){
    return "registPage";
  }
  /**
   * ajax进行异步校验用户名的执行方法
   * @throws IOException
   */
  public String findByName() throws IOException{
    //调用Service进行查询
    User existUser = userService.findByUsername(user.getUsername());
    //获得response对象,向页面输出
    HttpServletResponse response = ServletActionContext.getResponse();
    response.setContentType("text/html;charset=UTF-8");
    //判断
    if(existUser != null){
      //查询到该用户:用户名已经存在
      response.getWriter().println("<font color='red'>用户名已经存在</font>");
    }else{
      //没查询到该用户:用户名可以使用
      response.getWriter().println("<font color='green'>用户名已经存在</font>");
    }
    return NONE;
  }
  /**
   * 用戶注册的方法:
   */
  public String regist(){
    return NONE;
  }
}
</span>

最后,我们来编写映射文件里面的内容,具体代码如下所示:

<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  <hibernate-mapping>
    <class name="cn.itcast.shop.user.vo.User" table="user">
      <id name="uid">
        <generator class="native"/>
      </id>
      <property name="username"/>
      <property name="password"/>
      <property name="name"/>
      <property name="email"/>
      <property name="phone"/>
      <property name="addr"/>
      <property name="state"/>
      <property name="code"/>
    </class>
  </hibernate-mapping></span> 

不要忘记了,要把她陪到applicationContext里面,具体代码如下所示:

<span style="font-size:18px;"><!-- 配置Hibernate的其他的属性 -->
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.format_sql">true</prop>
        <prop key="hibernate.connection.autocommit">false</prop>
        <prop key="hibernate.hbm2ddl.auto">update</prop>
      </props>
    </property>
    <!-- 配置Hibernate的映射文件 -->
    <property name="mappingResources">
      <list>
        <value>cn/itcast/shop/user/vo/User.hbm.xml</value>
      </list>
    </property>
</span> 

代码到此结束,下面给大家展示下效果图:

小编总结: 

实现的思路是这样滴`(*∩_∩*)′,首先是由onblur进行事件触发,第二,编写ajax的代码,向action中提交,传递参数username,第三步,编写action,接收username,实现模型驱动配置到spring中,第四步,编写DAO,集成HibernateDaoSupport,在配置中注入sessionFactory,最后编写Service,注入UserDao,还有事务管理,一个简单的demo,还请小伙伴多多指教,SSH网上商城,精彩未完待续~~~

(0)

相关推荐

  • SSH框架的常见问题和解决方法

    Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.他很大程度的简化DAO层的编码工作

  • php网上商城购物车设计代码分享

    首先,购物车的数据库设计: 1. id 2. goods_id 商品ID 3. session_id 购物车ID 4. goods_sn 商品编码 5. goods_name 商品名称 6. shop_price 商品商城售价 7. goods_price 商品真实售价(与shop_price的区别在于,当打折的时候,shop_price是打折之前商品的售价,而goods_price是打折之后的) 8. goods_number 数量 9. weight 商品重量 10. goods_attr

  • SSH框架网上商城项目第30战之项目总结(附源码下载地址)

    0. 写在前面 友情提示:下载地址在下面哦. 项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们要做的首先是定位这个异常,一般异常的后面都会跟一个或多个Caused by:xxx,这些都是引起异常的原因,一般我们找最下面的一个Caused by,那里往往才是问题的根源.如果自己解决不了,可以去谷歌.百度搜索(搜索的时候别一大堆异常往上一贴,注意搜关

  • SSH框架网上商城项目第9战之添加和更新商品类别功能实现

    上一节我们做完了查询和删除商品的功能,这一节我们做一下添加和更新商品的功能. 1. 添加商品类别 1.1 添加类别的UI设计         我们先说一下思路:首先当用户点击"添加商品"时,我们应该弹出一个"添加商品"的UI窗口(注意这里不是跳转到新的jsp,EasyUI只有一个页面),弹出这个"添加商品"的窗口后,应该锁住它父类的所有窗口(即点击其他地方无效,只能操作添加商品的窗口),等用户填好了信息后,在新弹出来的窗口上点击"添加&

  • SSH框架网上商城项目第8战之查询和删除商品类别功能实现

    上一节我们完成了使用DataGrid显示所有商品信息,这节我们开始添加几个功能:添加.更新.删除和查询.首先我们实现下前台的显示,然后再做后台获取数据. 1. 添加.更新.删除和查询功能的前台实现 DataGrid控件里有个toolbar属性,是添加工具栏的,我们可以在toolbar属性中添加这些按钮来实现相应的功能.先看一下官方文档对toolbar的定义: 我们使用数组的方式定义工具栏,在query.jsp页面中新添加如下代码: <%@ page language="java"

  • SSH框架网上商城项目第23战之在线支付功能实现

    上一节我们做好了支付页面的显示,从上一节支付页面显示的jsp代码中可以看出,当用户点击确认支付时,会跳到${shop}/pay_goBank.action的action,也就是说,提交后我们得在payAction中的goBank方法中处理一些逻辑(即21节demo中的那个流程图的逻辑),即获得明文,将明文加密成签名(密文)然后再去访问易宝服务器,易宝连接银行,完成支付. 但是考虑到MVC设计模式,我们会将上面这些业务逻辑放到Service层中处理,所以下面我们来实现21节中那个demo的支付逻辑

  • php 网上商城促销设计实例代码

    大体的思想,每一个促销要新建一个促销类,有专门的开关来控制是否生效. 用商品里面的促销识别码来判断具体调用哪一个促销实例. 首先,在添加商品的时候,分两步,第一步是添加状态,第二步是把购物车内的商品显示这个状态. 一,添加步骤几个重要的点: 1,添加商品之前,遍历所有的促销互斥条件. 例如,某一款商品不可以和另一个商品同时在一个购物车内:或者某个用户权限,不可以购买特定的一件商品等等. 2,添加商品之前,选择特定的促销实例,来进行添加之前的操作. 注:第二点与第一点的区别在于1是要遍历所有的促销

  • java网上商城开发之邮件发送功能(全)

    最近在学习网上商城时,接触到了一个邮件发送的功能.之前一直在使用邮箱进行发送邮件,但是其中的具体如何运转的却不知道是怎么回事.那么邮件发送究竟是怎么一回事呢? 邮件发送过程: 过程描述:首先是发送人将邮件通过客户端软件发送到特定的服务器上,然后通过电子邮件简单传输协议(SMTP)来进行传输,收件人通过POP3协议将邮件从服务器上接受回来.这样就实现了邮件之间的相互传送. 实现过程: 在有网络的情况下,我们可以直接使用搜狐.网易等邮箱进行发送.那么如何在没有网络的情况下,实现内部之间的发送呢? 首

  • SSH+Jquery+Ajax框架整合

    近期学习了SSH2(Struts2+Spring+Hibernate)的整合后,开始尝试的写一个登陆界面,结果发现:若是单单使用struts2来进行页面跳转的话页面的效果不怎么样,同时也无法进行局部刷新(即异步提交验证). 于是,我开始在网上搜索解决的办法,有些说通过一个隐藏的iframe来达到效果,当我总觉得麻烦和不实用.后来问了下老师,告诉了我使用ajax可以达到想要的效果,我又发现网上有很多例子都是ajax的,但缺少的就是SSH2(整合好的)和ajax 的整合(ajax使用了jQuery框

  • Java的web开发中SSH框架的协作处理应用笔记

    相信SSH没人不知道了吧,struts2+spring+hibernate,企业开发的"基础"架构,为什么基础标上引号,因为这个基础只是很多人自以为的而已,最基础的是servlet,很多培训机构很多基础都不教,直接上来就三大框架了,SSH不然就SSI,搞得很多人以为JAVAWEB开发就一定要框架,没框架就跟没了手一个样.三大框架没有什么坏处,实用,很多公司都在用,直接上手开发.但毕业以为真的好久没用三大框架了,spring倒是有用,特别是springMVC,感觉用起来比struts2爽

随机推荐