• 传智播客itcastbbs(三)


    (2009-04-23 23:20:03)
    标签:

    it

     

    一 用户模块  用户实体->DAO
     注册,登录,注销
     
    1. 用户实体
     User : id, loginName, nickName[使用2个名字的好处],password(MD5), email, avatar:byte[]
        gender, birthday
        autoLoginKey 
    2. 写User和映射
     (1) Class - User
      属性, hashCode(), equals(),gender使用常量---
     (2) User.hbm.xml, 加到hibernate.cfg.xml
      ***  birthday- date
      *** avatar   - length=512000
      
    3. 写UserDAO
      (1) UserDAO extendsGenericDAO<User>
      (2) UserDAOImpl extendsGenericDAOImpl<User> implementsUserDAO
      (3) BaseService中增加
       protectedUserDAO userDAO; 及初始化
      (4) beans-dao.properties增加UserDAO

    4. 分析用户有关的功能
     注册,登录(可以自动登录),注销,显示用户的头像

     4.1 注册的流程

     4.2 注册的验证:
      (1) 表单的客户端验证;js
      (2) 表单的服务器端验证:
       格式是否正确;
       用户名是否已被使用;
      (3) 客户端格式验证规则:
       (3.1)用户名不能为空;
       (3.2)密码不能为空;
       (3.3)如果密码不为空,确认密码与密码一致;
       (3.4)Email的格式要正确;
      (4) 服务端格式验证规则同(3)
       (4.5)用户名是否已被使用,使用AJAX;
        能在不提交的情况下检查用户名是否已经被使用(用户名后放一个框)
      (5) 客户端和服务器端2遍验证的原因;
       
     4.3 分析Action的方法
      registerUI(), register(),login(), logout(), showAvatar();
      isLoginNameRegistered(); ---Ajax
      

     4.4 分析Service的方法
      addUser(),isLoginNameRegistered(), getByLoginNameAndPassword(),getUser();


     4.5 写UserAction extendsBaseAction,并写出上述分析的每个方法的结构;
      检查哪个方法需要单独jsp页面
      
     4.6 注册功能:
      (1) jsp页面: register.jsp;
        检测用户名是否存在;
        日期控件;jQuery--WebRoot/script/jquery.js&datepicker/ui.datepicker.js
         WebRoot/script/jquery.js
         WebRoot/script/datepicker/ui.datepicker.js
         WebRoot/script/datepicker/zh-cn.js
         WebRoot/script/datepicker/ui.datepicker.css
         <html:rewritepage="/script/jquery.js" />  ====也可以使用相对路径
           <input type="text" name="birthday"id="txtBirthday">
            <script>
             $("#txtBirthday").datepicker
      (2) 准备FormBean
       avatar ---FormFile
       FormBean中的属性与User相同的较多,可以直接使用User;
       
      (3)准备Service:接口->实现类;
       (3.1)beans-service.properties;
       (3.2)BaseAction中增加一个Service;
       
      ==== 练习:
       (ex1)Action
        register();
         (1)验证表单
         (2)验证用户名是否已经被占用;
         (3)验证通过,添加用户
        isLoginNameRegistered:Ajax
         
      ===== 遇到的问题:
       birthday字段使用了js,如果用标准的html,有个id属性,struts用什么属性?====styleId


      ===== 课堂编写
       (1)jsp表单:使用Struts标签
        ---回显:value="" or redisplay=false
        ---性别:可以使用html:radio
          --- password2: Form中增加属性;
          
       (2)UserAction中:
        ---验证表单;->可以使用ForumAction中的代码;重写UserForm.validate 
        ---验证用户名重复:返回至registerUI;
        ---属性的复制,图像的单独处理;size>0表示上传了文件;
        ---添加用户成功后,转到index
         全局,重定向;
         
       (3)测试问题;
        不要把Action的方法写成protected,必须是public
       
        (3.1)组装Form表单FormFile avatar
          ==原因:上传文件的enctype="multipart/form-data"
        (3.2)组装Form表单birthday
          ==暂时不处理,处理的话需要转换器;
        (3.3)实现用户名已经注册的方法isLoginNameRegistered;
          ==list().size()>0
          ==测试服务端;
        (3.4)birthday字段的处理
            == BeanUtils 的DateConverter implement Converter
             convert()
            == 注册转换器
             使用前被使用;通常放在启动的时候;
             在过滤器的init方法中注册;
             ConvertUtils.register();
           BeanUtils.copyProperties()的内部实现;
            先将src属性作转换,再设置dst的属性
           转换器要考虑:传过来的是null和 传过来的就是目标类型的情况;
          ==回显时出现了英语的日期表示法,解决:
           --使用Jstl, fmt:formatDate
           --将birthday改为String
           --写一个Date的子类,重写toString,再写子类的转换器


        (3.5)完成UserForm.validate
          ==为空部分作成工具类StringUtil
          ==用户名,密码,email
          ==email 正则表达式
           aa@xx.yy[.zz.xx]
           atom:表示一个字母或数字或下划线;
           aa:
            由至少一个atom组成的字符串
            A-Z,a-z, 0-9, _, .; 至少1个字符
           xx:
            由至少一个atom组成的字符串
            A-Z,a-z, 0-9, _; 至少1个字符
           yy:
            由一个或多个.xx组成的字符串

           [a-zA-Z0-9_.]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-])+
          ==UserForm中写个main测试
             使用不同的邮箱地址来测试;
          ==将正则表达式作为常量放在UserForm中;
          ==Pattern.matches(pattern, string);
           注意空值异常;
           Pattern.matches两种不同的用法;
          
      
        (3.6)完成客户端js校验;
          functionvalidate(form)
          js的正则表达式与java的有所不同
           "^...$" 
          js中只匹配部分;
          jQuery的使用;
        (3.7)对密码进行MD5加密
         写一个工具类:MD5Util
          staticString digest(String str);
          位运算,转换为字符;
          判断b>0xf决定是否+0;
          b& 0xff, 不判断高位,类型自动转换带来的问题 
           对null的处理,抛出异常;空字符串没有问题
         (3.8) addUser
           对密码作一次MD5运算;
       
          登录时需要用加密后的密码与数据库中的密码比较;   
      

       如何实现自动登录;
       如何保证用户密码安全
       如何保证有效期起作用;
        cookie.setMaxAge不太好,不太安全,使用?
         expriyTime= currentTime + 7tian;
         数据库中再存一份未加密的信息;
        
        
        自动登录:使用Cookie;
        在登录时勾选自动登录;
        在用户成功登录后,给客户端发cookie,内容是用户名和密码;
        在每次访问网站时,在有效期,都有一个过滤器,检测自动登录的cookie,
        取出其中的内容进行验证;如果通过就登录这个用户;
        
        如果存的是用户名密码会不安全:
         内容是MD5(userId_currentTime_expriyTime);
         发给客户端,同时存进数据库;
         验证时取cookie.value== user.autoLoginKey
           
           
         cookie.value== MD5(user.autoLoginKey);
         
         expiryTime= autoLoginKey.split("_")[2]
         与当前时间比较,如果未过期;
         登录用户;


  • 相关阅读:
    iPhone的Socket编程使用开源代码之AsyncSocket
    利用 NSSortDescriptor 对 NSMutableArray 排序
    objectc NSMutableURLRequest模拟表单提交
    Asp.net读取Excel文件 2
    把aspx绑定的数据搬至aspx.cs页面中去
    Asp.net网站如何播放Flv视频
    如何使用Flash对象去显示图片
    Could not load file or assembly 'Microsoft.ReportViewer.WebForms' or 'Microsoft.ReportViewer.Common'
    动态添加HtmlGenericControl
    Could not load file or assembly 'Microsoft.ReportViewer.ProcessingObjectModel'
  • 原文地址:https://www.cnblogs.com/firecode/p/2460936.html
Copyright © 2020-2023  润新知