Ajax-ajax实例1-动态加载的 FAQ

动态加载 FAQ 的过程主要是利用 XMLHttpRequest(以下简称 XHR)对象与服务端通信,根据用户单击的感兴趣问题动态将内容加载到页面中。在具体实现时,有两点要注意的内容。

1 .对每个问题进行唯一标识
FAQ 主要包含问题与解答两个部分,用户单击一个问题时,服务器必须知道请求的是哪个问题的
解答,所以必须对每个问题进行唯一标识。标识的方法很多,在本例中简单使用数字进行标识。每个
问题在页面上表现为超链接,单击链接将触发 onclick 事件,调用 loadFAQ 函数,传入问题标识,获取
对应的解答。
单击后并不是要真正链接到一个新的页面,所以在<a>标签的 onclick 事件中 return false 取消原有
链接的功能。每个答案分配一个 div 用于显示,每个 div 的 id 属性命名规则为,在对应的问题数字标
识前统一增加“faqDetail”。
2 .对已加载的解答不重复向服务器发出请求
问题的解答加载后,将显示在对应问题下方的 div 中。当用户再次单击问题时该 div 将隐藏起来。
如果用户第三次单击相同的问题,由于解答已加载到页面,所以不需要再次向服务器发送请求,只需
将隐藏的 div 显示出来即可。
隐藏和显示主要通过设置 div 样式中的 display 属性来完成,当 display 属性设置为“none”时隐藏,
设置为“block”时显示。判断是否需要发出请求,可以检查 div 的 innerHTML 是否包含内容。

项目结构:

项目运行:

AjaxRequest.js:Ajax封装类: http://www.cnblogs.com/hfultrastrong/p/7267171.html

showfaq.jsp:用于显示faq问题:

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="com.gordon.util.DBUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		Connection conn = DBUtil.getConnection();
		String sql = "SELECT * FROM faqdetail;";
		PreparedStatement pst = conn.prepareStatement(sql);
		ResultSet rs = pst.executeQuery(sql);
		while (rs.next()) {
	%>
	<a href="javascript:;" onclick="getFaqDetail(<%=rs.getString("id")%>);return false;"><%=rs.getString("answer")%></a>
	<br>
	<div id="faqdetail<%=rs.getString("id")%>" style="display: none;"></div>
	<br />
	<hr />
	<%
		}
		rs.close();
		pst.close();
		conn.close();
	%>
</body>

<script type="text/javascript" src="js/AjaxRequest.js"></script>

<script type="text/javascript">

		// 创建XMLHttpRequest随想
		var xhr = Ajax();

		// 根据问题id获取详细内容
		function getFaqDetail(answerid) {
			var shownode = document.getElementById("faqdetail" + answerid);

			if(shownode.style.display == "none") {
				shownode.style.display = "block";

				if(shownode.innerHTML == "") {
					var url = "GetFaqDetailServlet";
					var params = "answerid=" + answerid;

					var des_url = url + "?nocache=" + new Date().getTime() + "&" + params;

					xhr.get(des_url, function(data){
						handleResult(data, shownode);
					});
				}
			} else {
				shownode.style.display = "none";
			}
		}

		// 处理返回结果
		function handleResult(data, shownode) {
			shownode.innerHTML = data;
		}
	</script>

</html>

GetFaqDetailServlet.java:用于逻辑处理:

package com.gordon.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.gordon.service.GetAnswerDetailService;

/**
 * 获取FAQ问题详情
 */
@WebServlet(urlPatterns = { "/GetFaqDetailServlet" })
public class GetFaqDetailServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public GetFaqDetailServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String question = ""; 

		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/text;charset=utf-8;");

		String answerid = request.getParameter("answerid");

		try {
			question = GetAnswerDetailService.getAnswerDetailById(answerid);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		response.getWriter().print(question);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

GetAnswerDetailService.java:用于根据id获取答案的详细代码结构:

package com.gordon.service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.gordon.util.DBUtil;

public class GetAnswerDetailService {

	/**
	 * 根据问题id获取解答信息
	 * @param answerid
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static String getAnswerDetailById(String answerid) throws ClassNotFoundException, SQLException {

		String result = "";

		Connection conn = DBUtil.getConnection();

		String sql = "SELECT question FROM faqdetail WHERE id = ?";

		PreparedStatement pst = conn.prepareStatement(sql);
		pst.setInt(1, Integer.valueOf(answerid));

		ResultSet rs = pst.executeQuery();
		while (rs.next()) {
			result = rs.getString("question");
		}

		rs.close();
		pst.close();
		conn.close();

		return result;
	}
}

DBUtil.java用于获取数据库连接:

package com.gordon.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtil {

	private static final String URL = "jdbc:mysql://localhost:3306/ajaxexample_1";
	private static final String DRIVER = "com.mysql.jdbc.Driver";
	private static final String USERNAME = "root";
	private static final String PASSWORD = "root";

	public static Connection getConnection() throws ClassNotFoundException, SQLException {
		Class.forName(DRIVER);
		return DriverManager.getConnection(URL, USERNAME, PASSWORD);
	}
}

+++++++++++++++++++++++++++

参考:ajax实用案例大全-1动态加载数据  https://wenku.baidu.com/view/c7897bf4700abb68a982fb91.html

时间: 2024-10-29 19:07:51

Ajax-ajax实例1-动态加载的 FAQ的相关文章

Ajax与DOM实现动态加载

首先说下问题背景:想要通过异步请求一个文本文件,然后通过该文件的内容动态创建一个DOM节点添加到网页中. 基于这个需要了解: 1 DOM如何动态添加节点 2 Ajax异步请求 3 Chrome浏览器如何处理本地请求 DOM如何动态添加节点 想要动态的添加节点,就需要良好的理解DOM文档. 常用的几个方法: getElementById()  getElementsByTagName() getAttribute() setAttribute() 以及 createElement() create

Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页

1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 几个常见的用到ajax的场景. 比如你在逛知乎,你没有刷新过网页,但是你却能看到你关注的用户或者话题有了新动态的消息提示. 还比如,我们在看视频时,可以看到下面

Ajax动态加载数据

前言: 1.这个随笔实现了一个Ajax动态加载的例子. 2.使用.net 的MVC框架实现. 3.这个例子重点在前后台交互,其它略写. 开始: 1.控制器ActionResult代码(用于显示页面) /// <summary> /// 电话查询页面 /// </summary> /// <returns></returns> public ActionResult PhoneSearch(string sql) { phoneList=从数据库查询数据: V

Echarts ajax动态加载json数据

后台php写的,给前台准备好json格式数据 public function actionGetOffline(){ $userid = Yii::$app->user->identity->user_id; $connection = Yii::$app->db; $command = $connection->createCommand("SELECT proc_phase_id from tb_pro where user_id like '%$userid%

爬取Ajax动态加载网页

常见的反爬机制及处理方式 1.Headers反爬虫 :Cookie.Referer.User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2.IP限制 :网站根据IP地址访问频率进行反爬,短时间内进制IP访问 解决方案: 1.构造自己IP代理池,每次访问随机选择代理,经常更新代理池 2.购买开放代理或私密代理IP 3.降低爬取的速度 3.User-Agent限制 :类似于IP限制 解决方案: 构造自己的User-Agent池,每次访问随机选择 5.

Jquery chosen动态设置值 select Ajax动态加载数据 设置chosen和获取他们选中的值

在做一个编辑对话框时,要对里面带有select option的操作.主要是想动态加载option和对option的选中.但是由于项目中使用了jquery里的chosen()方法,怎么也无法实现效果.原码如下: Java代码   <select id="viewOLanguage" data-rel="chosen"> <option value="zh">简体中文(简体中文 Chinese)</option>

黄聪:AngularJS 动态加载控制器实例-ocLoazLazy

一.AngularJS动态加载控制器和视图实例 路由配置关键代码: [javascript] view plain copy print? //二级页面 $stateProvider.state('main', { url: '/:name', /**如果需要动态加载数据和控制器***/ views: { "": { templateUrl: function ($stateParams) { console.info($stateParams); return '/template/

7、jQuery的Ajax与Java交互带加载图片

1.jQuery的Ajax与Java交互带加载图片 1.1 html代码 <body> <div id="main"> <button id="myBut">Ajax获取数据</button> <div id="container"> <img src="./img/load.jpg" id="myimg"> </div>

Winform动态加载TabControl用法实例

本文实例讲述了Winform动态加载TabControl用法.分享给大家供大家参考. 具体实现代码如下: 代码如下: private void BindTabData() { dtIPD = new DataTable(); //drItem = new DataTable(); //获取[项目大类]列表显示于 TabPage MRD_Score model = new MRD_Score(); model.ActiveFlag = "Y"; DataTable dtScore = f