老板要求这样,因为还有一些别的东东一起做成TAG了

解决方案 »

  1.   

    a.jsp<%@ page contentType="text/html;charset=GBK" errorPage="systemErr.jsp"%>
    <%@ taglib uri="tlds/number.tld" prefix="nm" %>
    <% 
    String sName =request.getParameter("sName");
    if(sName==null)
    sName ="100";
    %>
    <HTML>
    <HEAD>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <TITLE>
    计数器演示程序
    </TITLE>
    </HEAD>
    <BODY>
    <form action="a.jsp" method = post>
    <input type = text name = "sname" value="<%=sName%>"><BR><BR>
    <input type = submit name = "submit" value="验证">
    <nm:numbercheck tagName="sname"/>

    </form></BODY>
    </HTML>systemErr.jsp
    <%@ page 
        language="java" 
        isErrorPage="true"
        contentType="text/html; charset=gb2312" %>
    <html>
    <head>
    <title>错误讯息</title>
    <meta http-equiv="Content-Type" 
      content="text/html; charset=gb2312">
    </head>
    <body bgcolor="#CCCCCC">
    <div align="center">
      <p><font size="6" face="标楷体">
         <b>错误讯息</b>
         </font></p>
      <p>&nbsp;</p>
      <p><font face="标楷体" size="6">
         <%=exception.getMessage()%>
         </font></p>
      <p>&nbsp;</p>
      <a href="a.jsp">
         返回</a>
    </div>
    </body>
    </html>number.tld
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE taglib
      PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
      "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"><taglib>  <!-- ============== Tag Library Description Elements ============= -->  <tlibversion>1.0</tlibversion>
      <jspversion>1.1</jspversion>
      <shortname>number</shortname> 
      
      <!-- ============== number ============= -->
       <tag>
        <name>numbercheck</name>
        <tagclass>counter.testTag</tagclass>
        <bodycontent>empty</bodycontent>
    <attribute>
      <name>tagName</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    </tag>

    </taglib>
      

  2.   

    testTag.java
    package counter;import javax.servlet.jsp.*;
    import javax.servlet.jsp.tagext.*;
    import javax.servlet.http.HttpServletRequest;
    import java.lang.*;public class testTag  extends TagSupport{    String tagName = null;    public void settagName(String TagName){
            this.tagName = TagName;
        }
        public int doStartTag() throws JspTagException{
         HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
            try{
                if(request.getParameter(tagName) != null){
                    Double tagValue = Double.valueOf(request.getParameter(tagName));
                }
            }catch(NumberFormatException e){
                throw new JspTagException("类型不准确");
            }
            return(EVAL_PAGE);
        }
    }
      

  3.   

    public class ThisIsExampleTag extends TagSupport
    {
        //输入的字符串值存在这里
        private String m_content = "";
        
        public String getContent()
        {
            return m_content;
        }    //页面提交的值用这个方法传给m_content
        public void setContent(String aContent)
        {
            m_content = aContent;
        }
        
        public int doStartTag()
        {
            int flag = -1;
            //这里判断输入的字符串是否是数字
            flag = testInputStr(m_content);
            //如果是则使用JspWriter将警告信息返回
            //简单举个例子
            try
            {
                JspWriter out = pageContext.getOut();
                out.println(getMsg(flag));
                //或者返回输入页面
                //out.println("<%");
                //out.println("response.sendRedirect(...)");
                //out.println("return");
                //out.println("%>");
                //最好将已经输入的值保存起来
                
            }
            catch(IOException e)
            {
            }
            return (SKIP_BODY);
        }
        
        /**
         *判断输入字符串是否数字
         */
        public void testInputStr(String aContent)
        {
            //判断字符串的是否全为数字
            //是则返回1
            //否则返回0
            //如果为空返回-1
        }
        
        /**
         *使用脚本的alert()提示消息
         */
        public String getMsg(int flag)
        {
            StringBuffer sb = new StringBuffer();
            if(flag=0)
            {
                //这里组合提示消息脚本
                //sb.append(...)
                return sb;
            }
            if(flag=1)
            {
                //校验成功
                ...
            }
            if(flag=-1)
            {
                //输入为空
            }
        }
    }要将值传到tag中
    需要一个中转页面来调用这个tag
    <tld:tag m_content=<%上个页面提交的值%>>如果需要同时校验多个值
    需要建立一个对象来存储提交的所有值
    例如InfValueBean
    public class InfValueBean implements Serializable
    {
        private m_age = "";
        private m_number = "";
        
        //get和set方法
        //getAge() setAge()
        //getNumber() setNumber()
    }此时ThisIsExampleTag改为
    {
        private InfValueBean m_content = new InfValueBean();
        
        ...
        
        //testInputStr()必须更改
        public void testInputStr(String aContent)
        {
            //调用对象中字符串值来校验
            //m_content.getAge()
            //m_content.getNumber()
        }
    }对于校验输入是否是数字最好的办法是脚本
    将数据提交到服务器端才进行判断
    既没有效率又增加服务器的负担
    对于你说的“因为还有一些别的东东一起做成TAG了”
    应该是你们的tag没有按照模块规划好
    这种纯粹是耦合现象
    必须在设计时就避免
      

  4.   

    第二个方法
    可是使用HttpServletRequest类取得页面上控件值
    但是同样没有效率
      

  5.   

    用Javascript<script language="JavaScript">
    function OnlyNums(num){
    //只能输入数字和小数点
    var this_obj=eval('document.AddForm.cardID'+num)
    var sn=this_obj.value
    var valid_char='0123456789.' for (i=0;i<=sn.length;i++) {
    var the_char=sn.charAt(i)
    if(valid_char.indexOf(the_char)==-1){
    this_obj.value=sn.substring(0,i)
    return 1
    }
    }
    if(this_obj.value!=sn) this_obj.value=sn
    }
    </script><form name="AddForm" method="post">
    <input name="cardID1" type="text" id="cardID1" onkeyup="return OnlyNums(1)">
    </form>