jsp下拉框级联查询以及java代码实现

需求描述:

  • 我们在开发过程中,很多页面查询,新增修改页面的下拉,需要通过一个下拉框的值,确定另一个下拉的值,典型的就是,选择年级,另一个下拉需要展示对应的班级,选择了班级,需要展示对应的学生。
  • 下面是存放地方,建筑物,级联查询建筑物与房间的例子,效果如下

在这里插入图片描述

  • 前台部分使用jsp做页面,fmt,cus都是jsp的标签,如果是使用jsp做开发,可以直接复用代码,如果使用html页面,则需要定义一个div容器,作为js循环查询到的值。

    key对应的是输入框的标题,itemList是后台查询的值,将值填充到下拉框

  <div class="searchbody">
	<dl>
		<fmt:message key="oaEquipment.new.storage"/>:<cus:SearchFilterTag name="orgcode" id="orgcode" op="eq" type="string" itemList="${schList}" onChange="doSubNew()" defaultText="全部校区" style="width:250px"/>
		<cus:SearchFilterTag name="propertyBuilding.id" id="propertyBuildingId" op="eq" type="long" itemList="${buildingList}" onChange="doSubNew()" defaultText="全部建筑"/>
		<cus:SearchFilterTag name="propertyBuildingFloor.id" id="propertyBuildingFloorId" op="eq" type="long" itemList="${roomList}" onChange="doSubNew()" defaultText="全部房间"/>
	</dl>
  </div>

重写onChange方法,通过获取id过滤级联操作,doSub()是默认的表单提交方法

 <script type="text/javascript">
    	//操作过滤条件并提交
   		function doSubNew(){
			if($("#orgcode").val() == ''){
				$("#propertyBuildingId").val("");
			}
			if($("#propertyBuildingId").val() == ''){
				$("#propertyBuildingFloorId").val("");
			}
			doSub();
		}
	</script>

java后台代码的查询方法,EntityFilter的作用类似session,可以从ef中取到jsp页面中对应的值

public String doSelect(Model model) throws Exception{
		ZhxyUser user = (ZhxyUser) getUser();
		String[] orgCodes = user.getAttrMap().get("relatedOrgCodes").toString().split(",");
		
		EntityFilter ef = getEntityFilter();
		String teacherName = null;
		String orgcode = null;
		Long propertyBuilding = null;
		//当存在学校编码时,获取值
		if(ef.isFilterExist("orgcode"))
		{
			orgcode = String.valueOf(ef.getFilterValue("orgcode"));
		}
		//当存在建筑id时,获取值
		if(ef.isFilterExist("propertyBuilding.id"))
		{
			propertyBuilding = Long.valueOf(String.valueOf(ef.getFilterValue("propertyBuilding.id")));
		}
		if(ef.isFilterExist("teacherName"))
		{
			teacherName = String.valueOf(ef.getFilterValue("teacherName"));
		}

		//根据传入条件查询存储位置的下拉集合
		List<SelectItem> schList = new ArrayList<SelectItem>();
		List<SelectItem> buildingList = new ArrayList<SelectItem>();
		List<SelectItem> roomList = new ArrayList<SelectItem>();
		schList = organizationOutService.doGetRelatedOrgSelectItemsByIdenId(user.getIdentityId(),
			PlatformAllCodeKey.ORGANIZATION_TYPE_SCH);
		if(!StringUtils.isNullString(orgcode))
		{
			buildingList = propertyBuildingService.getBuildingIdSelectItemsByOrgCode(orgcode);
		}
		if(propertyBuilding != null)
		{
			roomList = propertyBuildingFloorService.getRoomIdSelectItemsByBuildingId(propertyBuilding);
		}

		//根据过滤条件,获取OaEquipmentDomain集合
		ef.addFilter("orgcode", Op.IN, orgCodes);
		addOrder("createTime","DESC");
		List<OaEquipmentDomain> resultList = oaEquipmentService.doGetPagedList(getPagedInfo());
		copyPageListInfo(resultList);

		model.addAttribute("schList", schList);
		model.addAttribute("buildingList", buildingList);
		model.addAttribute("roomList", roomList);
		model.addAttribute("resultList", resultList);
		model.addAttribute("teacherName", teacherName);
		return "oa/oaEquipment/oaEquipmentList";
	}

service层通过前台传的code的值查询建筑物的列表

 // 根据学校code获取建筑物下拉集合
    public List<SelectItem> getBuildingIdSelectItemsByOrgCode(String orgCode) throws ApplicationException, SystemException {
        List<SelectItem> items = new ArrayList<SelectItem>();
        if (StringUtils.isNullString(orgCode)) {
            return items;
        }
        //根据过滤条件获取 建筑物对象列表
        EntityFilter ef = createNewEntityFilter();
        ef.addFilter("dataOrgcode", orgCode);
        List<PropertyBuilding> propertyBuildings = propertyBuildingDao.getFilterList(ef);
        //将 建筑物对象列表 封装成 建筑物下拉集合
        for (PropertyBuilding propertyBuilding : propertyBuildings) {
            SelectItem item = new SelectItem();
            item.setSelectValue(String.valueOf(propertyBuilding.getId()));
            item.setSelectText(propertyBuilding.getBuildingName());
            items.add(item);
        }
        return items;
    }
  • 这种做法才用的是表单提交的方式,进行查询关联的下拉

  • 点击第一个下拉框的值,onchange事件携带参数进行提交,后来取到值以后,查询对应的下拉的值,然后重新进入页面,页面显示的时候,将查询的值显示出来,同时,会显示前一个下拉选中的值。
  • 还有一种做法是ajax提交的方式,这种方式需要将获取到值,用js的方式,写入下拉,大家可以根据自己得实际情况来。
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现多个单元格下拉框级联最常见的方式是使用数据验证和VLOOKUP函数。以下是一个通用的Java代码实现示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelDropdownCascadeExample { public static void main(String[] args) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 第一列下拉框数据 String[] column1Values = new String[]{"A1", "A2", "A3", "A4"}; // 第一列数据验证 DataValidationHelper validationHelper = sheet.getDataValidationHelper(); CellRangeAddressList column1RangeAddressList = new CellRangeAddressList(1, 100, 0, 0); DataValidationConstraint column1Constraint = validationHelper.createExplicitListConstraint(column1Values); DataValidation column1Validation = validationHelper.createValidation(column1Constraint, column1RangeAddressList); sheet.addValidationData(column1Validation); // 第二列下拉框数据 String[] column2ValuesA1 = new String[]{"B1", "B2", "B3"}; String[] column2ValuesA2 = new String[]{"C1", "C2", "C3"}; String[] column2ValuesA3 = new String[]{"D1", "D2", "D3"}; String[] column2ValuesA4 = new String[]{"E1", "E2", "E3"}; // 第二列数据验证 CellRangeAddressList column2RangeAddressList = new CellRangeAddressList(1, 100, 1, 1); DataValidationConstraint column2Constraint = validationHelper.createFormulaListConstraint("INDIRECT($A1&\"_values\")"); DataValidation column2Validation = validationHelper.createValidation(column2Constraint, column2RangeAddressList); sheet.addValidationData(column2Validation); // 第一列对应的下拉框数据 Name column2ValuesA1Name = workbook.createName(); column2ValuesA1Name.setNameName("A1_values"); column2ValuesA1Name.setRefersToFormula("Sheet1!$G$1:$G$3"); sheet.createRow(0).createCell(6).setCellValue(column2ValuesA1[0]); sheet.createRow(1).createCell(6).setCellValue(column2ValuesA1[1]); sheet.createRow(2).createCell(6).setCellValue(column2ValuesA1[2]); Name column2ValuesA2Name = workbook.createName(); column2ValuesA2Name.setNameName("A2_values"); column2ValuesA2Name.setRefersToFormula("Sheet1!$H$1:$H$3"); sheet.createRow(0).createCell(7).setCellValue(column2ValuesA2[0]); sheet.createRow(1).createCell(7).setCellValue(column2ValuesA2[1]); sheet.createRow(2).createCell(7).setCellValue(column2ValuesA2[2]); Name column2ValuesA3Name = workbook.createName(); column2ValuesA3Name.setNameName("A3_values"); column2ValuesA3Name.setRefersToFormula("Sheet1!$I$1:$I$3"); sheet.createRow(0).createCell(8).setCellValue(column2ValuesA3[0]); sheet.createRow(1).createCell(8).setCellValue(column2ValuesA3[1]); sheet.createRow(2).createCell(8).setCellValue(column2ValuesA3[2]); Name column2ValuesA4Name = workbook.createName(); column2ValuesA4Name.setNameName("A4_values"); column2ValuesA4Name.setRefersToFormula("Sheet1!$J$1:$J$3"); sheet.createRow(0).createCell(9).setCellValue(column2ValuesA4[0]); sheet.createRow(1).createCell(9).setCellValue(column2ValuesA4[1]); sheet.createRow(2).createCell(9).setCellValue(column2ValuesA4[2]); FileOutputStream outputStream = new FileOutputStream("example.xlsx"); workbook.write(outputStream); workbook.close(); } } ``` 在这个示例中,我们使用了Apache POI库来创建一个Excel文档,并在第一列添加了一个下拉框,用于选择A1,A2,A3或A4。在第二列中,我们使用了VLOOKUP函数来根据第一列的选择动态更新下拉框数据。我们还使用了命名区域来定义每个下拉框的数据范围。 请注意,这个示例中的代码仅仅是一个通用的实现,真正的实现可能会因为具体的业务需求而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉梦lm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值