初学JSF,哈哈,有个问题很困扰。我有个COMMONBUTTON,他的代码如下:<h:commandButton value="连接源数据库" id="startbtcon"   action="#{StartdbCon.startconact}" immediate="false"></h:commandButton>
    
action的事件代码如下(databasecon使自己写的连接数据库的类):
     if(startdbcourses.isEmpty()==true){
String sqlstr ="select name From master.dbo.sysdatabases where dbid>'6'";
databasecon con = new databasecon();
con.database(startdbaddr,"master",startlgname,startlgpw, sqlstr);
startdbcourses.clear();
con.rs.last(); 
int startnum = con.rs.getRow();
for(int j = 0;j<startnum;j++)
{
con.rs.absolute(j+1);
startdbcourses.add(new SelectItem(con.rs.getString("name")));
} faces-config.xml的设置如下:
  <managed-bean>
    <managed-bean-name>StartdbCon</managed-bean-name>
    <managed-bean-class>com.jsfabc.jsh.view.bean.startact</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean> 于是问题就产生了,我的页面初始化后,第一次点击BUTTON,很乖~代码执行了,startdbcourses的值付到了一个下拉框里面。但是我再点BUTTON他不执行代码了,把我的页面刷新了,害我的下拉框里面的值全没了。再点他又执行代码就是说点一下执行代码,再点一下刷新页面,不停在这两个行为间重复。
很郁闷,貌似不是代码的问题,会不会是我的控件哪个属性没设置好的问题,还是说是JSF的框架机制的问题我没搞懂。
各位NB的人物啊帮帮小弟吧。初学者- -  难免郁闷小白问题,求教!

解决方案 »

  1.   

    没人知道么?帮帮忙啊- -  是不是JSF懂的人太少了?
      

  2.   

    代码逻辑就是你的效果啊
    1.打开页面,点击按钮startdbcourses.isEmpty()==true执行代码2.在点击按钮startdbcourses.isEmpty()==false不执行代码,return null,就刷新页面了3.点击按钮,又是第一步了startdbcourses.isEmpty()==true执行代码
      

  3.   

    那我把IF循环去掉?
    可是我早就设置过断点了~~不是代码的问题!!现在是第一次点执行代码,第二次点。。不执行代码!!直接刷新。我吧IF去掉也没用。
      

  4.   

    action 后面还少代码吧
    少个返回值 页面跳转的的值 对应 faces-config.xml 中的 把action 所有代码 还有 faces-config.xml配置的页面跳转代码也贴下
      

  5.   


    麻烦你了~~看一下吧~~~
      
    <?xml version='1.0' encoding='UTF-8'?><faces-config xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
        version="1.2"><navigation-rule>
        <from-view-id>/hello.jsp </from-view-id>
        <navigation-case>
          <from-outcome>startdbaddr</from-outcome>
          <to-view-id>/hello.jsp</to-view-id>
        </navigation-case>  </navigation-rule>  <managed-bean>
        <managed-bean-name>StartdbCon</managed-bean-name>
        <managed-bean-class>com.jsfabc.jsh.view.bean.startact</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
      </managed-bean>
    </faces-config>
    public class startact { public String startdbaddr;
    public String startlgname;
    public String startlgpw;
    public ArrayList  startdbcourses;
    public String startdbcourse; public startact(){
    startdbcourses =new ArrayList();
    }
       
    public void setstartdbaddr(String startdbaddr){
    this.startdbaddr=startdbaddr;
    }
    public String getstartdbaddr(){
    return startdbaddr;
    }

    public void setstartlgname(String startlgname){
    this.startlgname=startlgname;
    }
    public String getstartlgname(){
    return startlgname;
    }

    public void setstartlgpw(String startlgpw){
    this.startlgpw=startlgpw;
    }
    public String getstartlgpw(){
    return startlgpw;
    }

        public String getstartdbcourse() {
            return startdbcourse; 
        }
        public void setstartdbcourse(String newValue) {
            this.startdbcourse = newValue; 
        }   
        
        public Collection getstartdbcourses(){
            return startdbcourses;
        }
        public void setstartdbcourses(ArrayList newValue) {
            this.startdbcourses = newValue; 
        } 
        

    public void startconact(){
    try{
    System.out.println("iiiiiiiiiiiiiiii");
    String sqlstr ="select name From master.dbo.sysdatabases where dbid>'6'";
    databasecon con = new databasecon();
    con.database(startdbaddr,"master",startlgname,startlgpw, sqlstr);
    startdbcourses.clear();
    con.rs.last(); 
    int startnum = con.rs.getRow();
    for(int j = 0;j<startnum;j++)
    {
    con.rs.absolute(j+1);
    startdbcourses.add(new SelectItem(con.rs.getString("name")));
    }
    }
    catch(Exception e){
    System.out.println(e);
    } }我的代码主要功能是登陆数据库的服务器,验证用户名和密码,然后在下拉框里显示该服务器的所有数据库名。
      

  6.   

    这个问题以前貌似也有人碰到啊- -||
    怎么解决?那人貌似也没问到。
    该贴地址:
    http://topic.csdn.net/u/20070823/08/44594FA3-E5A6-4014-BD68-85EF458E5F1A.html
      

  7.   

    <managed-bean-scope>request</managed-bean-scope>你把scope改成session试试?
      

  8.   

    没用的,试过了~~
    不是这个问题,主要是点击COMMONBUTTON后代码执行成功页面的UIViewRoot就重新定义了。因此再点击页面就刷新了一遍。刷新了后再点击它就又开始执行代码。知是做掉问题的所在了。但是- -要怎么解决呢
      

  9.   

    是不是得用AJAX来解决这个问题?
      

  10.   

    action是有返回值的,返回值对应的是faces-config.xml中的<from-outcome>标签中的内容<navigation-rule>
        <from-view-id>/hello.jsp </from-view-id>
        <navigation-case>
          <from-outcome>startdbaddr</from-outcome>
          <to-view-id>/hello.jsp</to-view-id>
        </navigation-case>  </navigation-rule>public String startconact(){
           return "startdbaddr";
        }如果只是返回当前页面,可以用return null;代替,不需要在xml文件中设定
      

  11.   


    <%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%><h:selectOneMenu value="" id="menu1"></h:selectOneMenu><a4j:commandButton action="" value=""  reRender="menu1"/>

      

  12.   

    额-。-我刚刚又试了,用AJAX4JSF 能用但是还是一样,页面时不刷新了,但是下拉框还是第一次显示了,第二次数据又没了
      

  13.   


    startdbcourses.add(new SelectItem(con.rs.getString("name")));
    只是添加的是下拉框的value,label为空
    你试一下
    startdbcourses.add(new SelectItem(con.rs.getString("name"),con.rs.getString("name")));
      

  14.   

    - -不是这个方法里面代码的问题~
    不要说改成startdbcourses.add(new SelectItem(con.rs.getString("name"),con.rs.getString("name")));看他运行不运行,说了第一次点,运行没出错,都OK的。下拉框也有内容,我在代码钱还手动做了个断点:System.out.println("iiiiiiiiiiiiiiii");所以第一次点BUTTON都没问题。但是第二次点击就只刷新页面不执行方法!!!!现在和方法里面的代码没关系,而且产生的原因我也知道了,在12楼已经写了!!
    现在我想要找解决方法~~~
      

  15.   

    jsf维护状态有两种方式,一种是客户端,另外一种是服务器端,你这个应该是jsf view的状态没有保存,你的jsf使用哪个实现,jsf状态的维护是再客户端还是服务器端?
      

  16.   

    你可以重载这个组件一下两个函数试试 
     public void restoreState(FacesContext context, Object state)
       public Object saveState(FacesContext context)
       
      

  17.   


    用的是JSF RI 1.1.01 Libraries,额状态怎么去分在客户端还是服务端?
      

  18.   


    只刷新页面不执行方法,定义一个静态变量
    private static int i=0;
    public String startconact(){
      if(i==0){
       // 具体实现
      }
      i++;
      return null;

      

  19.   

    不好意思 去测试机 忙了一天
    在发下web.xml 会不会是你定义了两个Faces Servlet啊
      

  20.   

    感觉是navigation或者servlet mapping 没配好, 或者采访URI(/*.jsf?)没搞对尽量严格public String startconact() 返回一个导向的string
    ========================================================================
    类似的一个简单的入门例子
    http://vincent-feng.javaeye.com/blog/272583
      

  21.   


    public String startconact(){
           return "";
        }试下 你开始点击一次后 上面的URL 是不是后面有一串乱七八糟的地址啊
      

  22.   

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


      <filter>
       <display-name>Ajax4jsf Filter</display-name>
       <filter-name>ajax4jsf</filter-name>
       <filter-class>org.ajax4jsf.Filter</filter-class>
      </filter>
      <filter-mapping>
       <filter-name>ajax4jsf</filter-name>
       <servlet-name>Faces Servlet</servlet-name>
       <dispatcher>REQUEST</dispatcher>
       <dispatcher>FORWARD</dispatcher>
       <dispatcher>INCLUDE</dispatcher>
      </filter-mapping>
      <context-param>
       <param-name>javax.faces.CONFIG_FILES</param-name>
       <param-value>/WEB-INF/faces-config.xml</param-value>
      </context-param>
      <context-param>   
       <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>   
    <param-value>false</param-value>   
      </context-param>   
      <servlet>
       <servlet-name>Faces Servlet</servlet-name>
       <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
       <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
       <servlet-name>Faces Servlet</servlet-name>
       <url-pattern>*.faces</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
      

  23.   

    是不是要用APPLICATION来保存控件状态啊?怎么保存?
      

  24.   


     public String startdbaddr;
        public String startlgname;
        public String startlgpw;
        public ArrayList  startdbcourses;
        public String startdbcourse;都public 还get  set你jsp页面调用哪些标签?
    还用到了 myfaces了?
      

  25.   

    - -  额刚学都比较乱,MYFACES没用,WEB.XML里面可以忽略掉。。
    <%@page contentType="text/html; charset=UTF-8"%>
    <%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
      

  26.   

    用APPLICATION来保存? 这个不用
    你把方法改成 public String startconact(){return""; 
        }  试了吗
      

  27.   

    是不是你的<h:commandButton />没有写在<h:form></h:form>中啊?如果没有写在<h:form></h:form>中的话,action是不会被调用的!
      

  28.   

    不是,我写在FORM里面了,说了问题的原因我已经知道了,但是不知道怎么解决,是和JSF得生命周期有关,就是在完成第一次生命周期后,第二次无法完成,验证阶段出现错误,于是刷新了整个页面。因此第三次就又可以完整的完成整个生命周期。但是第四次验证阶段有出错了。如此循环。。
      

  29.   

      LJ你的commandButton初始化了吗?