commandLink&comandButton VS 传参&校验

1.Bug原因

      ***JAVAEE应用服务器管理控制台由于当时时间仓促,有部分页面未加入合法值校验。导致有些地方输入非法值时会出现异常。这一情况主要存在于编辑页面。编辑页面未加入校验的原因主要是由于当前使用的commandLink组件不太方便使用采用事件驱动进行校验,而如果改用commandButton组件后可以弥补这一缺陷,但是其向JSF Managed Bean传送参数的方式有别于commandLink(commandLink可直接在组件中进行传参,comandButton不行),导致JSF Managed Bean接收参数方式也不同,而JSF Managed Bean中现在都是按照commandLink传入参数形式来接收的(接收commandLink传入参数只需commandLink传参组件的ID,接收commandButton传入参数需:表单ID:传参组件ID)

2.Bug解决方案

      考虑到以后会将所有未加校验的地方整理出来,作为下一版需求,这里暂时只在JDBC连接池的创建页面、编辑页面,Ajp通道的创建页面加入输入参数的合法值校验,Ajp通道编辑页面和连接池创建编辑页面暂不进行修正。

数值验证的规则:

1.数值不能为空

2.数值只能是数字,不能含有其它字符,如果参数明显为非负数的范围为:[0 , 2147483647](如果值明显不能为0的则范围为:[1 , 2147483647]);无正负之分的则范围为:                 [-2147483648 , 2147483647]。

3.如果几个数值间有相互依赖关系(比如:最大值不能小于最小值,最小值不能大于最大值),那么应该验证该依赖关系,以保证数值间的正确关系。

实现方案:
   "创建"、"保存"都改用commandButton来代替commandLink组件,并在组件外部使用inputHidden组件进行传参。JSF Managed Bean增加一种接收参数方式:如果按接收commandLink参数方式接收到的参数为空,则再采用接收commandButton传参方式进行一次接收,例如:

jdbcPoolName = FacesUtils.getRequestParameter("connectPoolName");

        if (jdbcPoolName == null || jdbcPoolName.equals("")) {
            jdbcPoolName = FacesUtils
                    .getRequestParameter("jdbcpoolform:connectPoolName");
        }


如果页面有校验不通过的项,通过onclick事件驱动来禁止点击"保存""创建"按钮。(暂时采用这种方案,可能还有更好的)

补充一种方案(下次采用这种方案):

f:param组件传值,这个只是对 h:commandLink起效,但f:attribute组件可以同时用于给commandLink和commandButton组件传值,这些属性可以通过相同方式取到(父组件的 getAttributes()方法),父组件可以通过传递给actionListener的ActionEvent实例取到。基本形式如下:

 <h:commandLink actionListener="#{myBean.action}">
        <f:attribute name="attrname1" value="attrvalue1" />
        <f:attribute name="attrname2" value="attrvalue2" />
        ...   
        <h:outputText value="Click here" />
    </h:commandLink>
    
    <h:commandButton value="Press here" actionListener="#{myBean.action}">
        <f:attribute name="attrname1" value="attrvalue1" />
        <f:attribute name="attrname2" value="attrvalue2" />
        ...
    </h:commandButton>public void action(ActionEvent event) 
    ...{   
        String attrvalue1 = (String) event.getComponent().getAttributes().get("attrname1");
        String attrvalue2 = (String) event.getComponent().getAttributes().get("attrname2");
        ...
    }

3.修改的代码

 Modified:
   trunk/TWNS-ConsoleSrc/src/com/tongtech/twns/console/view/jdbc/JdbcPoolEditInfo.java

   trunk/TWNS-ConsoleSrc/twns/config/webContainer/createAjpListener.jsp

   trunk/TWNS-ConsoleSrc/twns/jdbc/createConnectPoolProperties.jsp

   trunk/TWNS-ConsoleSrc/twns/jdbc/jdbcPoolList.jsp

   trunk/TWNS-ConsoleSrc/twns/resource/js/validation.js


PS:这貌似是工作以来修改的第一个产品Bug,很菜鸟... (on Apr 20, 2010)


你可能感兴趣的:(bean,jsp,jdbc,javaee,JSF)