Реализация ‹sj:select /› в Struts2

В настоящее время я работаю над проектом, у меня есть несколько полей выбора в моем приложении, каждое значение должно меняться в соответствии с предыдущим значением, выбранным в первом списке, вот мой код, я не получил второй список выбора.

Вот мой JSP.

<s:form id="onSelectList" action="#"> 
  <s:hidden id="c_country" name="buildingName" value="%{bean.building}"></s:hidden>
  <s:hidden id="s_state" name="blockName" value="%{bean.block}"></s:hidden>  
</s:form> 

<s:hidden name="hospitalFloor.buildingName" id="c_country" ></s:hidden>             

<s:url id="loadbuildingurl" action="loadbuildingforFloor"/>
<s:url id="loadstateurl" action="loadblockForFloor"/> 

<s:url id="loadbuildingurl" action="loadbuildingforFloor"/>
<s:url id="loadstateurl" action="loadblockForFloor"/>

<textarea maxlength="200" name="hospitalBlock.blockDescription" id="blockDescription"></textarea> 
<label class="tasks" style="vertical-align:top;"> Select Building :</label>

<sj:select tabindex="10" 
           id="docform_country"
           cssClass="form-control input-sm"
           href="%{loadbuildingurl}"
           name="bean.country"
           list="building"
           onchange="loadValue();"
           onSuccessTopics="s_countryList,s_countryList1"
           onChangeTopics="c_countryList,c_countryList1"
           deferredLoading="false"
           headerKey="-1"
           headerValue="select"
           value="%{bean.country}">
</sj:select>

<label class="tasks" style="vertical-align:top;"> Block :</label>

<sj:select tabindex="10"
           id="docform_state"
           cssClass="form-control input-sm"
           href="%{loadstateurl}"
           name="bean.state"
           list="block"
           formIds="onSelectList"
           onchange="loadValue();"
           onSuccessTopics="s_stateList,s_stateList1"
           onChangeTopics="c_stateList,c_stateList1"
           reloadTopics="c_countryList"
           deferredLoading="false"
           headerKey="-1"
           headerValue="select"
           value="%{bean.state}">
 </sj:select>

Это мой файл struts.xml.

<action name="loadbuildingforFloor" class="hart.hospitalManagement.HospitalBuildingListForFloorAction">
    <result name="success" type="json"></result>                                    
</action>

<action name="loadblockForFloor" class="hart.hospitalManagement.HospitalBlockListForFloorAction" >
    <result name="success" type="json"></result>
</action>

Это мой класс действий Java для второго выбранного списка.

package hart.hospitalManagement;

import hart.bean.HospitalFloor;
import hart.profilemanagement.DoctorRegistrationHelper;

import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

public class HospitalBlockListForFloorAction extends ActionSupport {

    private Map<String, String> block;
    private String buildingName;
    private HospitalFloor hospitalfloor;

    public Map<String, String> getBlock() {
        return block;
    }
    public void setBlock(Map<String, String> block) {
        this.block = block;
    }
    public String getBuildingName() {
        return buildingName;
    }
    public void setBuildingName(String buildingName) {
        this.buildingName = buildingName;
    }       

    public String setBlockListForFloor()
    {    
        HospitalFloorManagementHelper hospitalFloorManagementHelper=new HospitalFloorManagementHelper();
        block=hospitalFloorManagementHelper.getBlockListForFloor(buildingName);
        System.out.println("building Name are"+buildingName);
        System.out.println("block list are"+block);
        return SUCCESS;
    }
    public String getJSON()
    {
        return setBlockListForFloor();
    }    
}

Это вспомогательный класс.

public Map<String, String> getBlockListForFloor(String buildingName)
{
    int buildingId=0;
    Map<String, String> block=new HashMap<>();
    DbConnect db=new DbConnect();
    Connection con=db.returnConnection();

    try
    {
        Statement stmt1=con.createStatement();
        Statement stmt2=con.createStatement();
        ResultSet rs1=stmt1.executeQuery("select buildingId from hospital_building where buildingName='"+buildingName+"'");
        while(rs1.next())
        {
            buildingId=rs1.getInt("buildingId");

        }
        ResultSet rs2=stmt2.executeQuery("select blockName from hospital_block where buildingId='"+buildingId+"'");
        while(rs2.next())
        {
            block.put(rs1.getString("blockName"), rs1.getString("blockName"));
        }               
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        db.closeConnection(con);
    }

    return block;
}
}

Это класс бобов.

private String buildingName;
private String block;

public String getBuildingName() {
    return buildingName;
}
public void setBuildingName(String buildingName) {
    this.buildingName = buildingName;
}

Но я не могу получить второй выбранный список, пожалуйста, кто-нибудь может мне помочь? Я новичок в struts2.


person Jinesh P    schedule 23.09.2014    source источник


Ответы (1)


В вашем коде огромный беспорядок. Имейте в виду, что:

  1. Каждое частное свойство нуждается в геттере и сеттере (в некоторых случаях их можно избежать, но если вы точно не знаете, что делаете, всегда генерируйте их); в частности, block в вашем компоненте и hospitalfloor в вашем действии их не хватает.
  2. Я нигде не вижу вашего свойства bean, хотя на странице JSP вы ссылаетесь на него несколько раз (bean.state, bean.country и т. д.).
  3. Если вам нужно что-то опубликовать (и поскольку вы отправляете значение из select1 для заполнения select2, вам это нужно), вы должны поместить свои элементы в форму. В конкретном случае <sj:select/> не помещайте атрибут action в саму форму, потому что вы уже указываете URL-адрес действия из атрибута href формы <sj:select/>s:

    <s:form>
         <!-- stuff -->
         <sj:select ... />
         <!-- stuff -->
         <sj:select ... />
         <!-- stuff -->
    </s:form> 
    
  4. Ваши темы нигде не определены
  5. Ваши вторые выбранные темы рекурсивно уведомляют первый выбор. Это не верно.

Поток должен быть:

    <sj:select name = "bean.country" 
               list = "countries" 
            listKey = "id"
          listValue = "description"
               href = "%{loadCountriesAction}"
              value = "%{bean.country}"
     onChangeTopics = "reloadState" 
   onCompleteTopics = "reloadState" />

    <sj:select name = "bean.state" 
               list = "states" 
            listKey = "id"
          listValue = "description"
               href = "%{loadStatesAction}"
              value = "%{bean.state}" 
       reloadTopics = "reloadState" 
    deferredLoading = "true" />
person Andrea Ligios    schedule 23.09.2014