需求:页面显示两个下拉列表,一个显示省,一个显示市,要求选择省的时候显示对应的市,不选择则后面的下拉列表不显示内容。本案例通过JSP+Servlet+Hibernate+MySQL完成
(1)编写JSP页面
<html>
<head>
<title>jsTest</title>
<!-- 引入js文件 -->
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<select name="pro" id="pro" οnchange="javascript:selectChange();">
<!-- 省份 -->
<option value="">--请选择--</option>
</select>
<select name="city" id="city">
<!-- 城市 -->
<option value="">--请选择--</option>
</select>
</body>
</html>
(2)构建PO,Pro和City,Pro和City是一对多的关系,
public class Pro {
private int id;
private String proName;
private Set<City> citySet = new HashSet<City>();
public Set<City> getCitySet() {
return citySet;
}
public void setCitySet(Set<City> citySet) {
this.citySet = citySet;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
}
public class City {
private int id;
private String cityName;
private Pro pro;
public Pro getPro() {
return pro;
}
public void setPro(Pro pro) {
this.pro = pro;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public City(int id, String cityName) {
super();
this.id = id;
this.cityName = cityName;
}
public City() {
super();
// TODO Auto-generated constructor stub
}
}
(3)创建PO的配置文件,在此之前要配置Hibernate的主配置文件
<hibernate-mapping package="cn.itcast.domain">
<class name="Pro" table="t_pro">
<id name="id" type="integer" column="id">
<generator class="native"></generator>
</id>
<property name="proName" type="string" column="proName"></property>
<set name="citySet" cascade="save-update">
<key column="pro_id"></key>
<one-to-many class="City"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping package="cn.itcast.domain">
<class name="City" table="t_city">
<id name="id" type="integer" column="id">
<generator class="native"></generator>
</id>
<property name="cityName" type="string" column="cityName"></property>
<many-to-one name="pro" class="Pro" column="pro_id"></many-to-one>
</class>
</hibernate-mapping>
(4)创建测试类添加数据
public class Test {
public static void main(String[] args) {
save();
}
public static void save(){
Session session = SessionUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
try {
//创建Pro对象
Pro pro = new Pro();
pro.setProName("河北");
City city1 = new City();
city1.setCityName("石家庄");
City city2 = new City();
city2.setCityName("廊坊");
City city3 = new City();
city3.setCityName("秦皇岛");
City city4 = new City();
city4.setCityName("邯郸");
City city5 = new City();
city5.setCityName("保定");
pro.getCitySet().add(city1);
pro.getCitySet().add(city2);
pro.getCitySet().add(city3);
pro.getCitySet().add(city4);
pro.getCitySet().add(city5);
Pro pro2 = new Pro();
pro2.setProName("山东");
City city6 = new City();
city6.setCityName("济南");
City city7 = new City();
city7.setCityName("日照");
City city8 = new City();
city8.setCityName("青岛");
pro2.getCitySet().add(city6);
pro2.getCitySet().add(city7);
pro2.getCitySet().add(city8);
session.save(pro);
session.save(pro2);
transaction.commit();
} catch (HibernateException e) {
transaction.rollback();
throw new RuntimeException(e.getMessage(),e);
}
}
}
(5)DAO层实现
public class ProDao {
/**
* 获取所有的省份对象集合
* @return
*/
public List<Pro> getPro(){
Session session = SessionUtils.openSession();
Transaction transaction = session.beginTransaction();
try {
Query query = session.createQuery("from Pro");
List<Pro> list = query.list();
transaction.commit();
return list;
} catch (HibernateException e) {
transaction.rollback();
throw new RuntimeException(e.getMessage(),e);
} finally{
session.close();
}
}
/**
* 通过省份名来获取省份对象
* @param pro
* @return
*/
public Pro getProByName(String pro) {
Session session = SessionUtils.openSession();
System.out.println(pro);
Transaction transaction = session.beginTransaction();
try {
Query query = session.createQuery("from Pro where proName=?");
query.setParameter(0, pro);
Pro pro1 = (Pro) query.uniqueResult();
transaction.commit();
return pro1;
} catch (HibernateException e) {
transaction.rollback();
throw new RuntimeException(e.getMessage(),e);
} finally{
session.close();
}
}
/**
* 通过省份的id来获取各省的城市的信息,城市表的外键指向省份的id
* @param id
* @return
*/
public List<City> getCitysByProId(int id) {
Session session = SessionUtils.openSession();
Transaction transaction = session.beginTransaction();
try {
Query query = session.createQuery("from City where pro.id=?");
query.setParameter(0, id);
List<City> citys = query.list();
transaction.commit();
return citys;
} catch (HibernateException e) {
transaction.rollback();
throw new RuntimeException(e.getMessage(),e);
} finally{
session.close();
}
}
}
(6)Service层实现
public class ProService {
private ProDao dao = new ProDao();
public List<Pro> getPro(){
return dao.getPro();
}
public Pro getProByName(String pro) {
return dao.getProByName(pro);
}
public List<City> getCitysByProId(int id) {
return dao.getCitysByProId(id);
}
}
(7)WEB层实现
/**
* 页面初始化时,获取第一个下拉列表的所有省份的servlet
* @author Administrator
*
*/
public class DemoServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
ProService service = new ProService();
List<Pro> list = service.getPro();
XStream xst = new XStream();
xst.alias("province", Pro.class);
xst.useAttributeFor(Pro.class, "id");
xst.useAttributeFor(Pro.class, "proName");
String xml = xst.toXML(list);
response.getWriter().write(xml);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
}
}
/**
* 页面初始化时,获取第一个下拉列表的所有省份的servlet
* @author Administrator
*
*/
public class DemoServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
ProService service = new ProService();
List<Pro> list = service.getPro();
XStream xst = new XStream();
xst.alias("province", Pro.class);
xst.useAttributeFor(Pro.class, "id");
xst.useAttributeFor(Pro.class, "proName");
String xml = xst.toXML(list);
response.getWriter().write(xml);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
}
}
(8)获取HibernateSession的工具类
public class SessionUtils {
private static SessionFactory sessionFactory = null;
static {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
public static Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
public static Session openSession(){
return sessionFactory.openSession();
}
}
(9)编写js文件,当打开页面是初始化所有省份,当选择省份时在第二个下拉列表框中显示对应的城市。
//获取XMLHttpRequest对象的方法,此方法是固定方法。
function ajaxFunction(){
var xmlHttp;
try{ // Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e){
try{// Internet Explorer
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){}
}
}
return xmlHttp;
}
//获取所有的省份的信息,添加到省份的下拉列表中
window.onload = function(){
//获取对象
var xmlHttp = ajaxFunction();
//打开链接
xmlHttp.open("get","../servlet/DemoServlet",true);
//发送请求。
xmlHttp.send(null);
//接收响应
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
var docXml = xmlHttp.responseXML;
var proXmlElements = docXml.getElementsByTagName("province");
for(var i=0;i<proXmlElements.length;i++){
var proEle = proXmlElements[i];
var proValue = proEle.getAttribute("proName");
var option = document.createElement("option");
option.setAttribute("value",proValue);
var text = document.createTextNode(proValue);
option.appendChild(text);
var proElement = document.getElementById("pro");
proElement.appendChild(option);
}
}
}
}
}
//点击省份的下拉列表,当列表发生改变时,显示对应省份的城市
var selectChange = function(){
//每次改变的时候,都要将上次的清除,否则会累加到下面。
//清除动作。
var cityObj = document.getElementById("city");
var cityOptions = cityObj.getElementsByTagName("option");
for(var i=0;i<cityOptions.length;i++){
if(cityOptions[i].getAttribute("value")!=null){
cityObj.removeChild(cityOptions[i]);
}
i--;
}
var xmlHttp = ajaxFunction();
var obj = document.getElementById("pro");//定位id
var index = obj.selectedIndex; // 选中索引
var proName = obj.options[index].text; // 选中文本
//var value = obj.options[index].value; // 选中值
//var proName = currentPro.getAttribute("value");
//建立连接
xmlHttp.open("get","../servlet/GetCityServlet?pro="+proName,true);
//发送请求
xmlHttp.send(null);
//接收响应
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
//获取响应的xml文本。
var docXml = xmlHttp.responseXML;
var cityEles = docXml.getElementsByTagName("city");
var cityElement = document.getElementById("city");
var oneOption = document.createElement("option");
oneOption.setAttribute("value","");
var oneText = document.createTextNode("--请选择--");
oneOption.appendChild(oneText);
cityElement.appendChild(oneOption);
for(var i=0;i<cityEles.length;i++){
var cityEle = cityEles[i];
var cityValue = cityEle.getAttribute("cityName");
//创建option节点
var option = document.createElement("option");
option.setAttribute("value",cityValue);
//创建option内的文本节点。
var text = document.createTextNode(cityValue);
//将文本节点添加到option节点上。
option.appendChild(text);
//获取jsp中的城市下拉列表的节点,并将创建的option节点添加到select上
cityElement.appendChild(option);
}
}
}
}
}