天天看點

Bootstrap級聯下拉菜單,你肯定用得到(2)

③、ProcityController

前端介紹完了,我們回到後端進行介紹,當然了,你也可以忽略本節,因為不是所用的關聯資料都通過springMVC這種方法擷取,那麼先預覽一下代碼吧!

package com.honzh.spring.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.honzh.biz.database.entity.City;
import com.honzh.biz.database.entity.Option;
import com.honzh.biz.database.entity.Provincial;
import com.honzh.common.util.JsonUtil;
import com.honzh.spring.service.CityService;
import com.honzh.spring.service.ProvincialService;

@Controller
@RequestMapping(value = "/procity")
public class ProcityController extends BaseController {
    private static Logger logger = Logger.getLogger(ProcityController.class);

    /**
     * 當傳遞city_code,則表明下拉框要被選中,否則不選中
     */
    @RequestMapping("")
    public void index(@RequestParam(value = "city_code", required = false) String city_code,
            @RequestParam(value = "pro_code", required = false) String pro_code, HttpServletResponse response) {
        try {
            logger.debug("擷取所在地區" + city_code + ", 省" + pro_code);

            // 如果pro_code為””,則表明要擷取城市菜單,否則擷取市級菜單
            if (!pro_code.equals("")) {
                Integer pro_id = ProvincialService.getInstance().getByProvincialcode(pro_code).getId();
                List<City> citys = CityService.getInstance().getCitysByProvincialId(pro_id);
                List<Option> coptions = new ArrayList<Option>(citys.size());

                for (City city : citys) {
                    Option coption = new Option();
                    coption.setId(city.getId());
                    coption.setName(city.getCname());
                    coption.setValue(city.getCode());

                    // 市級菜單被選中
                    if (city_code != null && !city_code.equals("")) {
                        if (city.getCode().equals(city_code)) {
                            coption.setSelected("selected");
                        }
                    }
                    coptions.add(coption);
                }
                renderJson(response, coptions);
            } else {
                List<Provincial> provincials = ProvincialService.getInstance().getProvincials();

                // 轉換成标準的option屬性(name,value,selected)
                List<Option> options = new ArrayList<Option>(provincials.size());

                // 被選中的省市
                // 則說明是展示頁面,此時需要為省級菜單和市級菜單設定選擇項
                if (city_code != null && !city_code.equals("")) {
                    Provincial selected_provincial = ProvincialService.getInstance().getProvincialByCitycode(city_code);

                    pro_code = selected_provincial.getProcode();
                } else {
                    pro_code = provincials.get(0) == null ? "" : provincials.get(0).getProcode();
                }

                for (Provincial provincial : provincials) {
                    Option option = new Option();
                    option.setId(provincial.getId());
                    option.setName(provincial.getProname());
                    option.setValue(provincial.getProcode());

                    if (!pro_code.equals("") && provincial.getProcode().equals(pro_code)) {
                        option.setSelected("selected");
                    }

                    options.add(option);
                }

                renderJson(response, JsonUtil.toJson(options));
            }

        } catch (Exception e) {
            logger.error(e.getMessage());
            logger.error(e.getMessage(), e);

            renderJson(response, null);
        }
    }

}

      

@RequestParam(value = "city_code", required = false) String city_code,對于RequestParam注解,其實非常好用,這裡就不多做解釋,隻是推廣一下,固定個數的參數,用該注解更易于代碼的維護。

ProvincialService類、CityService類就是兩個單例,盡量把資料放置在記憶體當中,減少查詢資料庫的次數,稍候貼出來一個例子。

Option類就是單純的封裝前端option元件的關鍵屬性,便于元件的通用化。

renderJson(response, JsonUtil.toJson(options));将資料json化後傳回,稍候貼上詳細代碼。

④、ProvincialService.java

隻貼出來代碼例子,不做詳細解釋,畢竟不是本章重點。

package com.honzh.spring.service;

import java.util.ArrayList;
import java.util.List;

import com.honzh.biz.database.entity.City;
import com.honzh.biz.database.entity.Provincial;
import com.honzh.biz.database.mapper.ProvincialMapper;
import com.honzh.common.spring.SpringContextHolder;

public class ProvincialService {

    private static Object lock = new Object();
    private static ProvincialService config = null;

    private ProvincialService() {
        provincials = new ArrayList<Provincial>();

        ProvincialMapper mapper = SpringContextHolder.getBean(ProvincialMapper.class);
        provincials.addAll(mapper.getProvincials());
    }

    public static ProvincialService getInstance() {
        synchronized (lock) {
            if (null == config) {
                config = new ProvincialService();
            }
        }
        return (config);
    }

    public Provincial getByProvincialcode(String provincial_code) {
        for (Provincial provincial : provincials) {
            if (provincial.getProcode().equals(provincial_code)) {
                return provincial;
            }
        }
        return null;
    }

    private List<Provincial> provincials = null;

    public List<Provincial> getProvincials() {
        return provincials;
    }

    public Provincial getProvincialByCitycode(String city_code) {
        City city = CityService.getInstance().getCityByCode(city_code);

        for (Provincial provincial : provincials) {
            if (provincial.getId().intValue() == city.getProid().intValue()) {
                return provincial;
            }
        }
        return null;
    }

    public Provincial getProvincialByCode(String province_code) {
        for (Provincial provincial : provincials) {
            if (provincial.getProcode().equals(province_code)) {
                return provincial;
            }
        }
        return null;
    }

}

      

⑤、renderJson方法

/**
     * 如果出錯的話,response直接傳回404
     */
    protected void renderJson(HttpServletResponse response, Object responseObject) {
        PrintWriter out = null;
        try {
            if (responseObject == null) {
                response.sendError(404);
                return;
            }
            // 将實體對象轉換為JSON Object轉換
            String responseStr = JsonUtil.toJson(responseObject);
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json; charset=utf-8");

            out = response.getWriter();
            out.append(responseStr);

            logger.debug("傳回是:" + responseStr);
        } catch (IOException e) {
            logger.error(e.getMessage());
            logger.error(e.getMessage(), e);
        } finally {
            if (out != null) {
                out.close();
            }
        }
    }