JAVA AJAX教程第四章—AJAX和MVC的简单结合

这里我们再理解了AJAX后,开始来用实例感受AJAX的力量。
今天我最后要实现的效果,当鼠标放到图片上时会根据,会把数据库库里的数据读出,通过显示框显示出来。这个在很多网上商店都有用到这里效果,我们这里用AJAX来实现这个效果。这个实例里结合了MySql、Servlet还有Js,理论性很少,但通过实践来感受理论知识。
一个页面中应用了AJAX,同时他也能实现MVC框架,可以吗?当然可以的。通过页面调用AJAX,这个页面就是MVC中的V,他用来前台显示与用户交互的内容。用JavaBean作为MVC中的M,来封装一些我们需要的功能和数据,这样便于C将信息传给V。这里就牵涉到C,什么是C呢,这里我们在Model2中的C就是Servlet,他用来对具体的事情进行控制。M-V-C都齐全了,这样我们就完成一个MVC了。在下面的文件结构中,让我给你指出哪些是M-V-C。main.html和login.jsp是V,DB.java和Product.java是JavaBean也就是M,而LoginAction.java和TipServlet.java是C,下面就来看看如何把AJAX和MVC结合起来。
clip_image004
这里是我们的文件结构,我们需要一个页面main.html来承载前台;一个数据库数据来存储我们的设备;由于这里还是基于MVC框架来做的,所以除了页面外,我们还需要Servlet来实现具体的功能,DB.java、Product.java和TipServlet.java类。详细的注释写在代码,这样方便理解和查看。
我们先来看main.html代码(详细注释写在代码):
<!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">
<script type="text/javascript">
//定义显示框
var datadiv;
var datatablebody;
//当前DOM节点
var curelement;
var XMLHttpReq = false;
//创建XMLHttpRequest对象
function createXMLHttpRequest(){
if(window.XMLHttpRequest){
XMLHttpReq = new XMLHttpRequest();
}else if(window.ActiveXObject){
try{
XMLHttpReq = new ActiveXObject("MSXML2.XMLHTTP");
}catch(e){
try{
XMLHttpReq = new ActiveXObject("Mircsoft.XMLHTTP");
}catch(e1){}
}
}
}
//发送请求函数
function getdatail(element){
datatablebody = document.getElementById("databody");
datadiv = document.getElementById("popup");
createXMLHttpRequest();
curelement = element;
var url = "TipServlet?key=" + escape(element.id);
XMLHttpReq.open("GET",url,true);
XMLHttpReq.onreadystatechange = processResponse;
XMLHttpReq.send(null);
}
//处理返回信息
function processResponse(){
if(XMLHttpReq.readyState == 4){
if(XMLHttpReq.status == 200){
//下面的内容时显示提示框
//首先先删除之前显示提示框中的内容
cleardata();
//设置提示框的坐标位置
setoffsets();
//alert(data);
//解析从服务端返回的数据内容
var content = XMLHttpReq.responseXML.getElementsByTagName("content")[0].firstChild.data;
//alert(content);
var row = createrow(content);
//将数据填写到提示框中
datatablebody.appendChild(row);
}else{
window.alert("你请求的页面有异常");
}
}
}
//清楚提示框
function cleardata(){
//alert(datatablebody.childNodes.length);
//获得datatablebody的值的子节点的长度
var ind = datatablebody.childNodes.length;
for( var i = ind -1; i &gt;= 0; i-- ){
//清楚每个子节点
datatablebody.removeChild(datatablebody.childNodes[i]);
}
datadiv.style.border="none";
}
//生成表格内容行
//这里牵涉到DOM技术,所以还是需要大家掌握一定的DOM知识
function createrow(data){
var row,cell,txtnode;
row = document.createElement("tr");
cell = document.createElement("td");
cell.setAttribute("bgcolor", "#fffafa");
cell.setAttribute("border", "0");
txtnode = document.createTextNode(data);
cell.appendChild(txtnode);
row.appendChild(cell);
return row;
}
//设置显示位置
function setoffsets(){
datadiv.style.border = "black 1px solid";
var top = 0;
var left = 0;
while(curelement){
//当前鼠标所在元素离浏览器顶部的位置
top += curelement["offsetTop"];
//当前鼠标所在元素离浏览器左侧的位置
left += curelement["offsetLeft"];
//alert(top);
curelement = curelement.offsetParent;
}
//定义显示框距离浏览器顶部的位置
datadiv.style.left = left + "px";
//定义显示框距离浏览器左侧的位置
datadiv.style.top = top + "px";
}
</script>
<title>Insert title here</title>
</head>
<body leftmargin="0" topmargin="0">
<table cellpadding="0" cellspacing="0" >"778" align="center" border="0">
<tbody>
<tr>
<td height="10"></td>
</tr>
</tbody>
</table>
<table height="148" cellpadding="0" cellspacing="0" >"778" align="center" border="0">
<tbody>
<tr valign="top">
<td >"236">
<table >"375" border="1">
<tr>
<td >"348" height="1">&nbsp;</td>
<td >"29" height="1">&nbsp;</td>
</tr>
<tr>
<td >"348" height="13">
<table id="autonumber" style="border-collapse:collapse" bordercolor="#111111" height="20" cellpadding="0" cellspacing="0" >"100%" border="0">
<tbody>
<tr>
<td align="center">
<b>蜀国武将</b>
</td>
</tr>
</tbody>
</table>
</td>
<td >"29" height="13">&nbsp;</td>
</tr>
<tr>
<td valign="top" height="328" >"348">
<table cellpadding="0" cellspacing="0" >"100%" border="1">
<tbody>
<tr>
<td >"50%">
<!-- 以下的的img的id通过onMouseOver方法作为参数传入到调用servlet的url中 -->
<img id="1" onMouseOver="getdatail(this);" onMouseOver="clear();" vspace="6" border="0" alt="" src="images/zf.jpg">
<br>
</td>
<td >"50%">
<br>
武将名称:
张飞
<br>
会员价:2500元
<br>
</td>
</tr>
<tr>
<td >"50%">
<img id="2" onMouseOver="getdatail(this);" onMouseOver="clear();" vspace="6" border="0" alt="" src="images/gy.jpg">
<br>
</td>
<td >"50%">
<br> 武将名称:
关羽
<br>
会员价:2500元
<br>
</td>
</tr>
<tr>
<td >"50%">
<img id="3" onMouseOver="getdatail(this);" onMouseOver="clear();" vspace="6" border="0" alt="" src="images/zy.jpg">
<br>
</td>
<td >"50%">
<br> 武将名称:
赵云
<br> 会员价:2500元
<br>
</td>
</tr>
</tbody>
</table>
</td>
<td>&nbsp;</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
<div style="position:absolute;" id="popup">
<table bgcolor="#fffafa" border="0" cellpadding="2" cellspacing="2">
<tbody id="databody">
</tbody>
</table>
</div>
</body>
</html>
好了,这就是main.html的代码,其中的js部门同样用到了上一节AJAX的实现步骤,万变不离其中嘛,还是他哦,所以只要改动一小部分就可以应该在很多地方,有很强的复用性。
建立数据,在MySql中建立一个名为ajaxtest的数据库,在其下添加表和数据,如下:
use ajaxtest;
show tables;
create table sort(
id integer primary key,
name varchar(40) not null
);
create table product(
id integer primary key,
sortid integer not null references sort(id),
name varchar(50) not null,
price double not null,
saleprice Double not null,
descript text(500) not null,
contents text(2000) not null,
saledate date not null,
salecount integer null,
image varchar(50) null
);
insert into sort values(1,'张飞');
insert into sort values(2,'赵云');
insert into sort values(3,'关羽');
insert into product values(1,1,'张飞',140000,13500,'张飞','五虎上将张飞','2009-10-12',100,'image/zf,jpg');
insert into product values(2,1,'赵云',140000,13500,'赵云','五虎上将赵云','2009-10-12',100,'image/zy,jpg');
insert into product values(3,1,'关羽',140000,13500,'关羽','五虎上将之首','2009-10-12',100,'image/gy,jpg');
好了,数据库做好了,现在就要有一个JavaBean来实现数据的连接和查询。
DB.java代码:
package classmate;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DB {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
public DB(){
try{
Class.forName("com.mysql.jdbc.Driver");
//System.out.println("classdb");
}catch(java.lang.ClassNotFoundException e){
e.printStackTrace();
}
}
public ResultSet executeQuery(String sql){
try{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ajaxtest", "root", "888888");
//System.out.println("conn");
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//System.out.println("stmt");
rs = stmt.executeQuery(sql);
//System.out.println("rs");
}catch(SQLException e){
e.printStackTrace();
}
return rs;
}
public void close(){
if(rs != null){
try{
rs.close();
}catch(Exception e1){
e1.printStackTrace();
}
}
if(stmt != null){
try{
stmt.close();
}catch(Exception e1){
e1.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}catch(Exception e1){
e1.printStackTrace();
}
}
}
}
当然我还需要有一个JavaBean类用来封装对商品信息进行操作的业务逻辑,也就是MVC中的M,这里我们用product来实现,product.java代码如下:
package classmate;
import java.sql.ResultSet;
public class Product {
private int id;
private String name;
private String contents;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public static Product GetDetail(DB db,Integer Id) throws Exception{
ResultSet rs;
String strSql = null;
String rplContent = null;
strSql = "select * from product where id = " + Id + ";";
System.out.println(strSql);
rs = db.executeQuery(strSql);
System.out.println(rs);
Product product = new Product();
if(rs.next()){
//System.out.println("11");
product.setName(rs.getString("name"));
//System.out.println(rs.getString("name"));
//System.out.println(strSql);
rplContent = rs.getString("contents");
rplContent = rplContent.replace("/n", "<br>");
product.setContents(rplContent);
//System.out.println(rplContent);
}
return product;
}
}
好了,最关键也是最重要的部分Servlet,也就是MVC中C他都来干嘛呢,哦,原来他是用来读取数据,并将数据写成XML发送回客户端。
package classmate;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TipServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
req.setCharacterEncoding("UTF-8");
Integer key = Integer.valueOf(req.getParameter("key"));
DB db = new DB();
Product product = null;
try{
product = Product.GetDetail(db,key);
}catch(Exception e){
e.printStackTrace();
}
resp.setContentType("text/xml;charset=UTF-8");
resp.setHeader("Cache-Control", "no-cache");
PrintWriter out = resp.getWriter();
out.println("<response>");
out.println("<content>" + product.getContents() + "</content>");
out.println("</response>");
//System.out.println("<response><content>" + product.getContents() + "</content></response>");
out.close();
}
@Override
public void init(ServletConfig config) throws ServletException {}
}
完成这些,我们就完成了所有的代码了,大家一起试试看,是不是可以了。一个简单AJAX实例完成了,同时他也是一个MVC框架的。
最终效果如:
以上内容,如果不明白,可以直接找我,我一定会为你详细的解释,QQ:540528747
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本课程详细讲解了以下内容:    1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程    2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例    3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题     4.session与cookie问题及application、cookie补充说明及四种范围对象作用域     5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别     6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据     7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)     8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析     9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)    1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)     11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet     12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题     13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove     14.过滤器、过滤器通配符、过滤器链、监听器     15.session绑定解绑、钝化活化     16.以及Ajax的各种应用     17. Idea环境下的Java Web开发
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值