类似这个
http://www.10090.com/demo/hpmenu/hpmenu.html二级联动就可以了两个字段都是动态从数据库中读取郁闷了好几天了,帮帮忙,谢谢!
http://www.10090.com/demo/hpmenu/hpmenu.html二级联动就可以了两个字段都是动态从数据库中读取郁闷了好几天了,帮帮忙,谢谢!
解决方案 »
- 求助:找到这个网页Flash文件的真实地址
- struts1.2下使用ckeditor,想将textarea里的内容写入数据库,可是一直出问题,请大侠们帮忙解决,谢啦~
- axis2.AxisFault: Transport error: 501
- js在jsp中不能调用问题。
- 求助!!如何隐藏get提交时显示在地址栏的参数。。急
- 为什么我的Tomcat怎么设置都不对?谢谢大家来帮帮忙!
- 访问Tomcat以外的文件夹内的文件
- jsp cookies怎么用
- 谁知道win98下tomcat的环境配置?
- 高分讨论,对struts的VALIDATOR框架有研究的同盟请进!!
- Servlet 中Get 请求的中文乱码
- 请问JasperReport如何提供多个数据源
你的菜单是放一个表中,还是父菜单放一个表,子菜单放另一个表?
天气冷了,帮你的女朋友,老婆买件衣服吧:http://shop.paipai.com/312561265
product.sortid and sort.name='"+ sort + "'"; rs = db.executeQuery(strSql); try { while (rs.next()) { out.println("<name>" + rs.getString("name") + "</name>"); } } catch (SQLException e) { e.printStackTrace(); } out.println("</response>"); out.close(); }}注意在本例中,返回的XML文档的格式如下所示:<response> <name>商品名称1</ name> <name>商品名称2</name></response>读者可以进一步完善该程序,实现从服务器端动态获取第一个列表框中的信息,然后再依据用户选择动态显示第二个列表框中的信息。
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>多级联动菜单</title><script type="text/javascript">
var xmlHttp; //用于保存XMLHttpRequest对象的全局变量
var targetSelId; //用于保存要更新选项的列表id
var selArray; //用于保存级联菜单id的数组//用于创建XMLHttpRequest对象
function createXmlHttp() {
//根据window.XMLHttpRequest对象是否存在使用不同的创建方式
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest(); //FireFox、Opera等浏览器支持的创建方式
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式
}
}//获取列表选项的调用函数
function buildSelect(selectedId, targetId) {
if (selectedId == "") { //selectedId为空串表示选中了默认项
clearSubSel(targetId); //清除目标列表及下级列表中的选项
return; //直接结束函数调用,不必向服务器请求信息
}
targetSelId = targetId; //将传入的目标列表id赋值给targetSelId变量
createXmlHttp(); //创建XmlHttpRequest对象
xmlHttp.onreadystatechange = buildSelectCallBack; //设置回调函数
xmlHttp.open("GET", "select_menu.jsp?selectedId=" + selectedId, true);
xmlHttp.send(null);
}//获取列表选项的回调函数
function buildSelectCallBack() {
if (xmlHttp.readyState == 4) {
var optionsInfo = eval("("+xmlHttp.responseText+")"); //将从服务器获得的文本转为对象直接量
var targetSelNode = document.getElementById(targetSelId);
clearSubSel(targetSelId); //清除目标列表中的选项
//遍历对象直接量中的成员
for (var o in optionsInfo) {
targetSelNode.appendChild(createOption(o, optionsInfo[o])); //在目标列表追加新的选项
}
}
}//根据传入的value和text创建选项
function createOption(value, text) {
var opt = document.createElement("option"); //创建一个option节点
opt.setAttribute("value", value); //设置value
opt.appendChild(document.createTextNode(text)); //给节点加入文本信息
return opt;
}//清除传入的列表节点内所有选项
function clearOptions(selNode) {
selNode.length = 1; //设置列表长度为1,仅保留默认选项
selNode.options[0].selected = true; //选中默认选项
}//初始化列表数组(按等级)
function initSelArray() {
selArray = arguments; //arguments对象包含了传入的所有参数
}//清除下级子列表选项
function clearSubSel(targetId) {
var canClear = false; //设置清除开关,初始值为假
for (var i=0; i<selArray.length; i++) { //遍历列表数组
if (selArray[i]==targetId) { //当遍历至目标列表时,打开清除开关
canClear = true;
}
if (canClear) { //从目标列表开始到最下级列表结束,开关始终保持打开
clearOptions(document.getElementById(selArray[i])); //清除该级列表选项
}
}
}
</script>
</head><!-- 页面加载完毕做两件事:1.初始化列表数组 2.为第一个列表赋值 -->
<body onload="initSelArray('selA','selB','selC');buildSelect('INIT', 'selA')">
<h1>多级联动菜单</h1>
<table>
<tr>
<td>列表A</td>
<td>
<select name="selA" id="selA" onchange="buildSelect(this.value, 'selB')">
<option value="" selected>------请选择------</option>
</select>
</td>
</tr>
<tr>
<td>列表B</td>
<td>
<select name="selB" id="selB" onchange="buildSelect(this.value, 'selC')">
<option value="" selected>------请选择------</option>
</select>
</td>
</tr>
<tr>
<td>列表C</td>
<td>
<select name="selC" id="selC">
<option value="" selected>------请选择------</option>
</select>
</td>
</tr>
</table>
</body>
</html>
<%@ page language="java"%>
<%@ page import="java.sql.*,ajax.db.DBUtils"%>
<%!
//访问数据库取得下级选项信息
String getOptions(String selectedId) {
int counter = 0; //计数器
StringBuffer opts = new StringBuffer("{"); //保存选项信息
String sql = "select * from select_menu where pid = ? order by seq asc";//定义查询数据库的SQL语句
Connection conn = null; //声明Connection对象
PreparedStatement pstmt = null; //声明PreparedStatement对象
ResultSet rs = null; //声明ResultSet对象
try {
conn = DBUtils.getConnection(); //获取数据库连接
pstmt = conn.prepareStatement(sql); //根据sql创建PreparedStatement
pstmt.setString(1, selectedId); //设置参数
rs = pstmt.executeQuery(); //执行查询,返回结果集
while (rs.next()) { //遍历结果集
//如果不是第一项,追加一个“,”用于分隔选项
if (counter > 0) {
opts.append(",");
}
opts.append("'");
opts.append(rs.getString("id"));
opts.append("':'");
opts.append(rs.getString("text"));
opts.append("'");
counter++; //计数器加1
}
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
DBUtils.close(rs); //关闭结果集
DBUtils.close(pstmt); //关闭PreparedStatement
DBUtils.close(conn); //关闭连接
}
opts.append("}");
return opts.toString();
}
%>
<%
out.clear(); //清空当前的输出内容(空格和换行符) String selectedId = request.getParameter("selectedId"); //获取selectedId参数
String optionsInfo = getOptions(selectedId); //调用getOptions方法取得下级选项信息 out.print(optionsInfo); //输出下级选项信息
%>
<%@ page language="java"%>
<%@ page import="java.sql.*,ajax.db.DBUtils"%>
<%!
//访问数据库取得下级选项信息
String getOptions(String selectedId) {
int counter = 0; //计数器
StringBuffer opts = new StringBuffer("{"); //保存选项信息
String sql = "select * from select_menu where pid = ? order by seq asc";//定义查询数据库的SQL语句
Connection conn = null; //声明Connection对象
PreparedStatement pstmt = null; //声明PreparedStatement对象
ResultSet rs = null; //声明ResultSet对象
try {
conn = DBUtils.getConnection(); //获取数据库连接
pstmt = conn.prepareStatement(sql); //根据sql创建PreparedStatement
pstmt.setString(1, selectedId); //设置参数
rs = pstmt.executeQuery(); //执行查询,返回结果集
while (rs.next()) { //遍历结果集
//如果不是第一项,追加一个“,”用于分隔选项
if (counter > 0) {
opts.append(",");
}
opts.append("'");
opts.append(rs.getString("id"));
opts.append("':'");
opts.append(rs.getString("text"));
opts.append("'");
counter++; //计数器加1
}
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
DBUtils.close(rs); //关闭结果集
DBUtils.close(pstmt); //关闭PreparedStatement
DBUtils.close(conn); //关闭连接
}
opts.append("}");
return opts.toString();
}
%>
<%
out.clear(); //清空当前的输出内容(空格和换行符) String selectedId = request.getParameter("selectedId"); //获取selectedId参数
String optionsInfo = getOptions(selectedId); //调用getOptions方法取得下级选项信息 out.print(optionsInfo); //输出下级选项信息
%>
http://topic.csdn.net/u/20071029/12/f0d8696c-c1c3-4ec2-b9ef-f95ff61d8fe3.html我的回答
http://lib.verycd.com/2006/11/16/0000128251.html
http://j2ee.blog.sohu.com/68011726.html
<td>
<b>节目类型</b>
</td>
<td>
<select name="bigTypeSelect" onchange="getSmallType(this.value);">
<option value="-1">
未选择
</option>
<c:forEach items="${bigTypeList}" var="temp">
<option value="${temp.typeId}">
${temp.typeName}
</option>
</c:forEach>
</select>
<select name="typeId">
<option value="-1">
未选择
</option>
</select>
</td>
</tr><script type="text/javascript">
//创建XMLHttpRequest对象
function createXMLHttpRequest()
{
//Mozilla 浏览器
if(window.XMLHttpRequest)
{
XMLHttpReq = new XMLHttpRequest();
}
// IE浏览器
else if (window.ActiveXObject)
{
try
{
XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}
}
//发送请求函数
function getSmallType(bigTypeId)
{
if(bigTypeId == -1)
{
var typeId = document.forms[0].typeId;
//清空select所有option选项
typeId.options.length = 0;
var option = document.createElement("option");
option.text = "未选择";
option.value = -1;
typeId.options.add(option);
return false;
}
createXMLHttpRequest();
XMLHttpReq.onreadystatechange = getFinsh;
var url = "getsmalltype.do?bigtypeid="+bigTypeId;
XMLHttpReq.open("post",url , true);
XMLHttpReq.send(null);
}
//处理返回响应函数
function getFinsh()
{
if (XMLHttpReq.readyState == 4)
{
if (XMLHttpReq.status == 200)
{
if(window.ActiveXObject)
{
var xmlDom = new ActiveXObject("Microsoft.XMLDOM");
}
else
{
if(document.implementation && document.implementation.createDocument)
{
var xmlDom=document.implementation.createDocument("","doc",null);
}
}
xmlDom.async = false;
xmlDom.loadXML(XMLHttpReq.responseText);
var typeId = document.forms[0].typeId;
//清空select所有option选项
typeId.options.length = 0;
var smallTypes = xmlDom.getElementsByTagName("smalltypes/smalltype");
//包含子类信息
if(smallTypes.length != 0)
{
var option = document.createElement("option");
option.text = "未选择";
option.value = -1;
typeId.options.add(option);
for(var i = 0;i < smallTypes.length;i ++)
{
//子类ID
var typeIdText = smallTypes[i].firstChild.text;
//alert(typeIdText);
//子类名
var typeNameText = smallTypes[i].lastChild.text;
//alert(typeNameText);
//添加子类信息到下拉列表
var option = document.createElement("option");
option.text = typeNameText;
option.value = typeIdText;
typeId.options.add(option);
}
}
else
{
var option = document.createElement("option");
option.text = "无子类";
option.value = document.forms[0].bigTypeSelect.options(document.forms[0].bigTypeSelect.selectedIndex).value;
typeId.options.add(option);
}
}
else
{
alert("Error data:\n"+ XMLHttpReq.statusText);
}
}
}
</script> //获得小类信息XML
public String getSmallTypeByBigTypeIdXml(String configFilePath,
String bigTypeId) {
File file = new File(configFilePath);
Configuration conf = new Configuration().configure(file);
SessionFactory sessionFactory = null;
sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session
.createQuery("from TypeInfo where parentId = :parentid");
query.setInteger("parentid", Integer.parseInt(bigTypeId));
List list = query.list();
session.close();
StringBuffer xmlSb = new StringBuffer("<smalltypes>");
for (int i = 0; i < list.size(); i++) {
TypeInfo typeInfo = (TypeInfo) list.get(i);
xmlSb.append("<smalltype><typeid>" + typeInfo.getTypeId()
+ "</typeid><typename>" + typeInfo.getTypeName()
+ "</typename></smalltype>");
}
xmlSb.append("</smalltypes>");
return xmlSb.toString();
}