请教JSP页面上用struts1.2.9 html:javascript 标签验证用户输入信息,当错误的时候,错误信息不是弹出在javascript对话框,而是显示在页面上。 请问该如何实现啊?
新手请教

解决方案 »

  1.   

    流程:ActionForm中的validate方法,如果ActionErrors为非空,则验证失败,
    则立即将ActionErrors放入请求区间并转发到显示错误的信息页面响应ActionErrors: 存纳错误的集合
    ActionError:  错误信息的一个封装对象实例(用户登陆)1.数据库库名为"users",表名为"userinfo",列名为"userName"和"userPass"2.创建web工程"strutslogindemo",并建立struts框架3.配置struts-config.xml,同时建立Form,Action,JSP
      
      1)***配置Form***    Form Properties分页:
        userCase:   Form的模块名 
        name:       Form的别名(添加userCase后会自动生成)
        Superclass: 选择后面为action.ActionForm
        Add:        添加属性(和请求页面的属性要求一致)    Methods分页: 因为需要表单验证,所以各项默认(如果不需验证,则取消validate方法的勾选)    JSP分页: 勾选Create JSP form,将New JSP Path改为"/login.jsp"(将login.jsp放在了服务器根目录)    next  2)***配置Action***    如果需要表单验证,勾选Validate Form,否则取消
        Input Source: login.jsp的路径  3)***添加用户登陆成功和失败的页面***    struts-config.xml界面,添加成功和失败的jsp,和Form连线,并建立连接名,分别为"succ"和"fail"  4)struts-config.xml里Action标签下的子标签介绍
        validate:是否需要表单验证,默认true,如果为false则立刻将Form放入某共享区间内
        scope:定义Form共享区间
        type:定义Action的类路径
        <forward name= path= /> 定义局部转发地址(仅对当前Action有效),
        name属性定义逻辑地址,path定义真实地址(物理地址)
        
    4.配置Form的表单验证方法
      
      1)修改资源文件"ApplicationResources.properties",
        往该文件里添加如下代码:
        login.userName.err.info=sorry,userName is null!
        login.userPass.err.info=sorry,userPass is null!        2)修改Form里的validate(验证方法)
        代码如下:
        public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {
     ActionErrors errors=new ActionErrors();
     if(userName.equals("")){
         //注意,下面的"login.userName.err.info"为资源文件的Key
         ActionError error=new ActionError("login.userName.err.info");
         errors.add("userNameError",error);
            }
     else if(userPass.equals("")){
         ActionError error=new ActionError("login.userPass.err.info");
         errors.add("userPassError",error);
     }
     return errors;
         }  3)在login.jsp的用户名和密码文本框旁边分别加入如下代码:
        <html:errors property="userNameError"/><br/>
        <html:errors property="userPassError"/><br/>
        注意:虽然MyEclipse快速开发struts框架,jsp会自动生成该代码,
      但是标签里的属性名(property)和Form里往集合添加的元素的别名不一定一致
      所以一定要检查是否一致  4)注意:struts-config.xml里,input属性:描述如果验证失败,显示错误信息的页面地址5.struts框架已经搭建完毕,现在搭建"数据库连接",引入数据库架包到lib,
      新建"com.huayu.db"包,新建Dbconn.java (数据库连接)
      代码如下:
      private static Connection conn=null;
      private static String url=null;
      public static Connection getConn()
      {
         try {
     Class.forName("com.mysql.jdbc.Driver");
     url="jdbc:mysql://localhost:3306/users?useUnicode=true&characterEncoding=UTF-8";
     conn=DriverManager.getConnection(url,"root","");
     } catch (ClassNotFoundException e) {
      e.printStackTrace();
     } catch (SQLException e) {
      e.printStackTrace();
     }
     return conn;
      }6.新建"com.huayu.voo"包,搭建用户类"Userinfo.java (JavaBean)"
      (用于在Action里,从Form取出请求信息后,给用户类赋值,然后用户类对象做形参调用服务层)
      代码如下:
         private String userName="";
         private String userPass="";
         public String getUserName() {
     return userName;
         }
         public void setUserName(String userName) {
     this.userName = userName;
         }
         public String getUserPass() {
     return userPass;
         }
         public void setUserPass(String userPass) {
     this.userPass = userPass;
         }
         public Userinfo(String userName, String userPass) {
     super();
     this.userName = userName;
     this.userPass = userPass;
         }
         public Userinfo() {
     super();
         }7.新建"com.huayu.oper"包,搭建服务层"UserinfoOper.java (登陆验证方法)"
      代码如下:
      public Connection conn=null;
      public PreparedStatement pstmt=null;
      public ResultSet rs=null;
      public String sql="";
      public boolean userDengLu(Userinfo uio)
      {
         try {
     conn=Dbconn.getConn();
     sql="SELECT userPass FROM userinfo WHERE userName=?";
     pstmt=conn.prepareStatement(sql);
     pstmt.setString(1,uio.getUserName());
     rs=pstmt.executeQuery();
     if(rs.next()){
      String userPass=rs.getString("userPass");
      if(uio.getUserPass().equals(userPass)){
       return true;
      }
     }
     } catch (SQLException e) {
      e.printStackTrace();
     }finally{
          try {
      rs.close();
      pstmt.close();
      conn.close();
          } catch (SQLException e) {
      e.printStackTrace();
          }
     }
     return false;
         }8.最后Action里嵌入代码,它取出Form里的请求信息,给用户类属性赋值,并调用service方法
      代码如下:
      public ActionForward execute(
            ActionMapping mapping,
     ActionForm form,
     HttpServletRequest request,
     HttpServletResponse response) {
     LoginForm loginForm = (LoginForm) form;
     String userName=loginForm.getUserName();
     String userPass=loginForm.getUserPass();
     Userinfo ui=new Userinfo();
     ui.setUserName(userName);
     ui.setUserPass(userPass);
     UserinfoOper uio=new UserinfoOper();
     if(uio.userDengLu(ui)){
      return mapping.findForward("succ");
     }
     else
      return mapping.findForward("fail");
      }***注意***
    ActionForm中的reset方法,在构造方法之后,任何方法之前被自动执行
      

  2.   

    非常感谢楼上的回复,可能是我没有表达清楚,我不是想要服务器验证的那种,而是在客户端完成验证(比如说验证用户名不能输入数字)。
    所以,我考虑是不是能用到html:javascript标签,但是需要把错误信息显示在页面error区域
      

  3.   

    html:script 标签可以获得message信息吗?
      

  4.   

    用个js
    <div style="display:none" id="showmess">
    用户名不能输入数字,请输入合法的字符
    </div>
    function checkusername(){
    if(name不合法){
    document.getElementById("showmess").style.display='block';
    }}
      

  5.   

    ls的也不错!
    <html>
    </body>
    <div style="display:none" id="showmess"> 
    用户名不能输入数字,请输入合法的字符 
    </div> 
    <SCRIPT LANGUAGE="javascript">
    function checkusername(){ 
    if(判断){ 
    document.getElementById("showmess").style.display='block'; 


    </script>
    <input type="submit" value="验证" onclick="checkusername();">
    </body>
    </html>
      

  6.   

    1,LS的方法可以显示但是一闪就没了,信息不能停留在页面上。
    2,这样一来好像还是用不上struts的那个htmml:script吧,即使用上该如何不让他弹出alert 呢?
    3,我现在是想写个多画面都能用的共通机能,所以想用struts标签,请问还有其他什么好办法呢?谢谢。
      

  7.   

    <html:javascript formName="loginForm" />
    <SCRIPT LANGUAGE="javascript">
    function checkusername(form){
    var bol=true;
    bol = validateLoginForm(form);if(!bol){
    alert(bol);
       document.getElementById("showmess").style.display='block';
    }
    }
    </script>
    这是我测试用的代码,很奇怪一闪就没了。请教!
      

  8.   

    validateLoginForm(form); 是struts标签自动生成的那个函数
      

  9.   

    干脆把整个JSP都贴上吧。
    <%@ page language="java" pageEncoding="GBK"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean"
    prefix="bean"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-html"
    prefix="html"%><html>
    <head>
    <title>JSP for DynaValidatorForm form</title>
    </head>
    <body>
    <div style="display: none" id="showmess">用户名非法。</div>
    <html:form action="/login" onsubmit="return checkusername(this)"> uname : <html:text property="uname" />
    <html:errors property="uname" />
    <br />
    email : <html:text property="email" />
    <html:errors property="email" />
    <br /> <html:submit />
    <html:cancel />
    </html:form>
    <html:javascript formName="loginForm" />
    <SCRIPT LANGUAGE="javascript">
    function checkusername(form){
    var bol=true;
    bol = validateLoginForm(form);if(!bol){
    alert(bol);
       document.getElementById("showmess").style.display='block';
    }
    }
    </script>
    </body></html>