了解Ajax的概念和作用
了解同步和异步的区别
能够使用jQuery的$.get()
和$.post()
发送Ajax请求
能够使用jQuery的$.ajax()
方法发送Ajax请求
能够定义和解析json
能够使用Jackson转换json格式
能够使用fastjson转换json格式
说白了: AJax是可以做异步的请求,实现局部刷新一种客户端技术
同步
提升用户的体验。(异步)
实现页面局部刷新。
将部分的代码,写到客户端浏览器。
在网页上点击按钮, 点击按钮, 发送Ajax请求服务器,响应hello Ajax
第一步:创建异步请求对象。
第二步:打开连接。
第三步:发送请求。
第四步:设置监听对象改变所触发的函数,处理结果
//使用原生的js代码发送异步请求
function fn1() {
//1. 创建XMLHTTPRequest对象
var xhr = new XMLHttpRequest();
//2. 建立与服务器的连接
xhr.open("GET","demo01?username=jay")
//3. 发送请求
xhr.send()
//4.自己编写代码处理响应,展示响应数据
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
//获取响应数据
var responseText = xhr.responseText;
document.getElementById("msg").innerHTML = responseText
}
}
}
//使用js原生的代码发送异步的post请求
function fn2() {
//1. 创建XMLHTTPRequest对象
var xhr = new XMLHttpRequest();
//2. 建立与服务器的连接
xhr.open("POST","demo01")
//3. 发送请求
//设置一个请求头,用来设置请求参数的类型
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
xhr.send("username=jay")
//4.自己编写代码处理响应,展示响应数据
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
//获取响应数据
var responseText = xhr.responseText;
document.getElementById("msg").innerHTML = responseText
}
}
}
因为传统(js里面)的AJAX的开发中,AJAX有两个主要的问题:
浏览器的兼容的问题 , 编写AJAX的代码太麻烦而且很多都是雷同的。
在实际的开发通常使用JQuery的Ajax ,或者Vue里面的axios
请求方式 | 语法 |
---|---|
GET请求 | $.get(url, [data], [callback], [type]) |
POST请求 | $.post(url, [data], [callback], [type]) |
AJAX请求 | $.ajax([settings]) |
为什么要用JQ的Ajax?
JS的Ajax处理浏览器适配问题, 写起来过于繁琐
实际开发里面基本不会使用JS的AJAX, 一般使用JQ的AJAX或者VUE里面的axios
掌握的方法
在网页上点击按钮, 发送Ajax请求服务器,响应hello ajax…
分别使用get,post,ajax三种方法
get方式, 语法 $.get(url, [data], [callback], [type]);
参数名称 | 解释 |
---|---|
url | 请求的服务器端url地址 |
data | 发送给服务器端的请求参数,格式是key=value;get请求的参数可以直接写在url后面 |
callback | 当请求成功后的回掉函数,可以在函数体中编写我们的逻辑代码 |
type | 预期的返回数据的类型(默认为text),取值可以是 xml, html, script, json, text, _defaul等 |
实例
//声明一个方法使用jQuery的ajax发送异步的get请求
function fn3() {
$.get("/demo01?username=tom",function (result) {
//在这个回调函数中处理响应数据result
//将响应数据展示在id为msg的div中
$("#msg").html(result)
})
}
post方式, 语法 $.post(url, [data], [callback], [type])
参数名称 | 解释 |
---|---|
url | 请求的服务器端url地址 |
data | 发送给服务器端的请求参数,格式是key=value |
callback | 当请求成功后的回掉函数,可以在函数体中编写我们的逻辑代码 |
type | 预期的返回数据的类型(默认为text),取值可以是 xml, html, script, json, text, _defaul等 |
实例
//声明一个方法使用jQuery的ajax发送异步的post请求
function fn4() {
$.post("/demo01","username=jack",function (result) {
//result就是服务器端的响应数据
$("#msg").html(result)
})
}
语法 $.ajax([settings])
其中,settings是一个js字面量形式的对象,格式是{name:value,name:value… …},常用的name属性名如下
属性名称 | 解释 |
---|---|
url | 请求的服务器端url地址 |
async | (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false |
data | 发送到服务器的数据,可以是键值对形式,也可以是js对象形式 |
type | (默认: “GET”) 请求方式 (“POST” 或 “GET”), 默认为 “GET” |
dataType | 预期的返回数据的类型,取值可以是 xml, html, script, json, text, _defaul等 |
success | 请求成功后的回调函数 |
error | 请求失败时调用此函数 |
实例
//声明一个方法使用jQuery的ajax方法发送异步请求
function fn5() {
$.ajax({
url:"/demo01", //请求路径
data:"username=lucy", //请求参数
type:"POST", //请求方式
success:function (result) {
$("#msg").html(result)
}, //请求成功时候的回调函数
error:function () {
$("#msg").html("服务器异常")
} //请求失败时候的回调函数
})
}
属性名称 | 解释 |
---|---|
url | 请求的服务器端url地址 |
async | (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false |
data | 发送到服务器的数据,可以是键值对形式,也可以是js对象形式 |
type | (默认: “GET”) 请求方式 (“POST” 或 “GET”), 默认为 “GET” |
dataType | 预期的返回数据的类型,取值可以是 xml, html, script, json, text, _defaul等 |
success | 请求成功后的回调函数 |
error | 请求失败时调用此函数 |
我们有一个网站,网站中都有注册的页面,当我们在注册的页面中输入用户名的时候,这个时候会提示,用户名是否存在。
案例源码及jar包下载地址:https://download.csdn.net/download/qq_22075913/85057621
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面title>
<script src="js/jquery-3.3.1.js">script>
head>
<body>
<form action="#" method="post">
用户名<input type="text" name="username" onblur="checkUsername(this.value)">
<span id="uspan" style="color: red">span>
form>
<script>
function checkUsername(username) {
//校验用户名
//发送异步请求给UserServlet,并且携带参数action和username
$.post("user","action=checkUsername&username="+username,function (result) {
//这个result就是服务器端的响应结果
$("#uspan").html(result)
})
}
script>
body>
html>
package com.itheima.web.servlet;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user")
public class UserServlet extends BaseServlet {
private UserService userService=new UserService();
public void checkUserName(HttpServletRequest request, HttpServletResponse response){
try{
String username = request.getParameter("username");
User user=userService.findByUserName(username);
if(user==null){
//用户名可用
response.getWriter().write("用户名可用");
}else{
//用户名已被占用
response.getWriter().write("用户名已被占用");
}
}catch (Exception e){
e.printStackTrace();
try {
response.getWriter().write("服务器异常");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
public class UserService {
private UserDao userDao = new UserDao();
public User findByUsername(String username) throws SQLException {
return userDao.findByUsername(username);
}
}
public class UserDao {
private QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
public User findByUsername(String username) throws SQLException {
String sql = "select * from user where username=?";
User user = queryRunner.query(sql, new BeanHandler<>(User.class), username);
return user;
}
}
当前案例存在问题:
服务器直接向客户端响应普通的字符串,客户端拿到了普通字符串之后,只能显示该字符串,没法根据服务器端的响应数据的不同而做一些自定义的处理,所以我们的想法是接下来将服务器端的响应数据封装成一个JavaBean对象
服务器要响应哪些数据给客户端?
封装的ResultBean的代码
package com.itheima.pojo;
import java.io.Serializable;
/**
* 包名:com.itheima.pojo
* @author Leevi
* 日期2020-10-22 10:41
* 封装服务器端给客户端的响应数据
*/
public class ResultBean implements Serializable {
/**
* 服务器端是否出现异常
*/
private Boolean flag;
/**
* 服务器端处理请求之后要响应的数据
*/
private Object data;
/**
* 服务器端的异常信息
*/
private String errorMsg;
@Override
public String toString() {
return "ResultBean{" +
"flag=" + flag +
", data=" + data +
", errorMsg='" + errorMsg + '\'' +
'}';
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
封装好ResultBean之后,服务器的响应数据就会封装在ResultBean对象中;然后再想办法将ResultBean对象的信息响应给客户端,但是客户端是无法解析ResultBean对象的,所以我们需要先将ResultBean对象转换成客户端能够认识的数据格式,然后再响应给客户端
用我们自己的话来说: JSON就是一个容易生成和解析的数据格式;
常用作客户端(前端,IOS,安卓)和服务器(JavaEE)之间的数据交换
json对象.key
数组[索引]
var person01 = {name:"张三疯",age:189,address:"武当山"}
var person02 = { name:"张三疯",age:189,address:"武当山",wife:{
name:"小花",
age:18
}
}
//二,JSON数组 [ele,ele]
var sons = [{"name": "张三", "age": 18}, {"name": "张四", "age": 19}];
var person03 = {name:"张三疯", age:189, address:"武当山",
wife:{
name:"小花",
age:18
},
sons:[
{
nickanme:"张三",
age:1
},
{
nickname:"张四",
age:2
}
]
}
List
;这些数据通常要转换成json格式,把json格式字符串返回客户端ObjectMapper
ObjectMapper
的构造方法:无参构造ObjectMapper
的常用方法:方法 | 说明 |
---|---|
writeValueAsString(Object obj) |
把obj对象里的数据转换成json格式 |
步骤:
writeValueAsString(Object obj)
实现
package com.itheima;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.pojo.ResultBean;
import com.itheima.pojo.User;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
* 包名:com.itheima
* @author Leevi
* 日期2020-10-22 10:59
* 测试json转换
* 为什么要将java对象转成json:因为我们要将java对象中的数据通过http协议传给各种客户端,而json是一种所有语言都能解析的数据格式
* 在Java代码中怎么将Java对象转成json: 使用框架
* 1. json-lib: 很古老的很重量级的框架,一般不用
* 2. jackson: spring默认支持的json解析框架
* 3. fastjson: 阿里开发的速度飞快的json解析框架
* 4. gson: 谷歌开发一款使用特别简单的json解析框架
*
* 一: 使用jackson进行json和java对象的转换
* 目标: 将Java对象转成json字符串
*/
public class TestJson {
@Test
public void test01() throws JsonProcessingException {
User user = new User(1, "张三丰", "123456", "[email protected]", "18999999999");
//使用jackson将user对象转换成json字符串
String jsonStr = new ObjectMapper().writeValueAsString(user);
System.out.println(jsonStr);
}
@Test
public void test02() throws JsonProcessingException {
User user = new User(1, "张三丰", "123456", "[email protected]", "18999999999");
ResultBean resultBean = new ResultBean(true, user);
//将resultBean对象转成json字符串
String jsonStr = new ObjectMapper().writeValueAsString(resultBean);
System.out.println(jsonStr);
}
@Test
public void test03() throws JsonProcessingException {
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三丰", "123456", "[email protected]", "18999999999"));
userList.add(new User(2, "周杰棍", "654321", "[email protected]", "19898989898"));
userList.add(new User(3, "奥巴马", "666666", "[email protected]", "19866666666"));
String jsonStr = new ObjectMapper().writeValueAsString(userList);
System.out.println(jsonStr);
}
@Test
public void test04() throws JsonProcessingException {
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三丰", "123456", "[email protected]", "18999999999"));
userList.add(new User(2, "周杰棍", "654321", "[email protected]", "19898989898"));
userList.add(new User(3, "奥巴马", "666666", "[email protected]", "19866666666"));
ResultBean resultBean = new ResultBean(true, userList);
String jsonStr = new ObjectMapper().writeValueAsString(resultBean);
System.out.println(jsonStr);
}
}
JSON
JSON
提供了一些常用的静态方法:方法 | 说明 |
---|---|
toJSONString(Object obj) |
把obj对象里的数据转换成json格式 |
步骤
实现
@Test
public void test06(){
//使用fastjson将user对象转换成json字符串
User user = new User(1,"奥巴马","123456","[email protected]","18999999999");
String jsonStr = JSON.toJSONString(user);
System.out.println(jsonStr);
}
//其它的map、list转成json对象也是一样的调用JSON.toJSONString(obj)实现
实现一个搜索页面,在文本框中输入一个值以后(键盘抬起的时候),给出一些提示
inputEle.keyup(function(){
//1.获得用户输入关键词
//2.发送Ajax请求WordServlet 携带关键词, 获得响应的数据
//3.解析响应的数据 填充页面
});
//1.获得请求参数(关键词)
//2.调用业务 根据关键词获得List list
//3.将list存储到ResultBean中,转成json字符串输出到浏览器
public List findByKeyWord(String keyWord){
//调用Dao 查询
}
SELECT * FROM words WHERE word LIKE '%a%' LIMIT 0,5
SELECT * FROM words WHERE word LIKE ? LIMIT 0,5
create table words(
id int primary key auto_increment,
word varchar(50)
);
insert into words values (null, 'all');
insert into words values (null, 'after');
insert into words values (null, 'app');
insert into words values (null, 'apple');
insert into words values (null, 'application');
insert into words values (null, 'applet');
insert into words values (null, 'and');
insert into words values (null, 'animal');
insert into words values (null, 'back');
insert into words values (null, 'bad');
insert into words values (null, 'bag');
insert into words values (null, 'ball');
insert into words values (null, 'banana');
insert into words values (null, 'bear');
insert into words values (null, 'bike');
insert into words values (null, 'car');
insert into words values (null, 'card');
insert into words values (null, 'careful');
insert into words values (null, 'cheese');
insert into words values (null, 'come');
insert into words values (null, 'cool');
insert into words values (null, 'dance');
insert into words values (null, 'day');
insert into words values (null, 'dirty');
insert into words values (null, 'duck');
insert into words values (null, 'east');
insert into words values (null, 'egg');
insert into words values (null, 'every');
insert into words values (null, 'example');
创建JavaBean
package com.itheima.bean;
import java.io.Serializable;
public class Words implements Serializable{
private int id;
private String word;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
@Override
public String toString() {
return "Words{" +
"id=" + id +
", word='" + word + '\'' +
'}';
}
}
导入jar,工具类, 配置文件
创建页面,search.html
Title
黑马
<script>
//声明一个搜索的方法
function searchWords(keyword) {
//判断输入框中的内容是否是空字符串,如果不是空字符串,才发请求
if (keyword != "") {
$("#divId").show()
//发送异步请求给WordsServlet,携带参数action以及搜索关键字keyword
$.post("words","action=search&keyword="+keyword,function (result) {
//判断是否查询成功
if (result.flag) {
//查询成功
var data = result.data;//json数组,每一个json对象就对应一个Words对象
//每次遍历添加之前,先要清除原来的数据
$("#tabId").empty()
//遍历出每一个json对象
$.each(data,function (index,words) {
//words就是遍历出来的每一个json
//获取word属性的值
var word = words.word;
//有一个word就往展示的table中添加一行
$("#tabId").append($(""+word+" "))
})
}else {
//查询失败
$("#msg").html("网络异常")
}
},"json")
}else {
//说明:输入框的内容为空,就应该隐藏那个展示框
$("#divId").hide()
}
}
</script>
package com.itheima.web.servlet;
import com.alibaba.fastjson.JSON;
import com.itheima.pojo.ResultBean;
import com.itheima.pojo.Words;
import com.itheima.service.WordsService;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* @author Leevi
* 日期2020-10-22 11:58
*/
@WebServlet("/words")
public class WordsServlet extends BaseServlet {
private WordsService wordsService = new WordsService();
/**
* 搜索提示
* @param request
* @param response
*/
public void search(HttpServletRequest request, HttpServletResponse response) throws IOException {
ResultBean resultBean = new ResultBean(true);
try {
//1. 获取请求参数keyword的值
String keyword = request.getParameter("keyword");
//2. 调用业务层的方法,根据搜索关键字进行搜索
List<Words> wordsList = wordsService.search(keyword);
//3. 将搜索到的内容封装到ResultBean对象中
resultBean.setData(wordsList);
} catch (Exception e) {
e.printStackTrace();
//服务器出现异常
resultBean.setFlag(false);
resultBean.setErrorMsg("查询失败");
}
//将resultBean转换成json字符串响应给客户端
String jsonStr = JSON.toJSONString(resultBean);
response.getWriter().write(jsonStr);
}
}
package com.itheima.service;
import com.itheima.dao.WordsDao;
import com.itheima.pojo.Words;
import java.util.List;
/**
* 包名:com.itheima.service
*
* @author Leevi
* 日期2020-10-22 11:58
*/
public class WordsService {
private WordsDao wordsDao = new WordsDao();
public List<Words> search(String keyword) throws Exception {
return wordsDao.search(keyword);
}
}
package com.itheima.dao;
import com.itheima.pojo.Words;
import com.itheima.utils.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.util.List;
/**
* 包名:com.itheima.dao
*
* @author Leevi
* 日期2020-10-22 11:58
*/
public class WordsDao {
private QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
public List<Words> search(String keyword) throws Exception {
String sql = "select * from words where word like ? limit 0,11";
List<Words> wordsList = queryRunner.query(sql, new BeanListHandler<>(Words.class), "%" + keyword + "%");
return wordsList;
}
}
方法 | 功能 |
---|---|
readValue(String json, Class type) |
把json字符串,还原成type类型的Java对象 |
readValue(String json, TypeReference reference) |
把json字符串,还原成带泛型的复杂Java对象(比如List) |
TypeReference
,com.fasterxml.jackson.core.type.TypeReference
// List 类型的映射信息
TypeReference ref1 = new TypeReference<List<Integer>>() {};
// List 类型的映射信息
TypeReference ref2 = new TypeReference<List<User>>() {};
// Map 类型的映射信息
TypeReference ref3 = new TypeReference<Map<String,User>>(){};
@Test
//把json转成JavaBean(user对象)
public void test06() throws IOException {
String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"[email protected]\",\"phone\":\"1386789898\"}";
//1.调用JSON.parseObject(String json,Class clazz);
//转换成user
User user = JSON.parseObject(jsonStr, User.class);
System.out.println(user);
//转换成map
Map map = JSON.parseObject(jsonStr, Map.class);
System.out.println(map);
}
@Test
//把json转成List对象
public void test07() throws Exception {
String jsonStr = "[{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"[email protected]\",\"phone\":\"1386789898\"},{\"id\":2,\"username\":\"ls\",\"password\":\"123456\",\"email\":\"[email protected]\",\"phone\":\"1386781898\"},{\"id\":3,\"username\":\"ww\",\"password\":\"123456\",\"email\":\"[email protected]\",\"phone\":\"1386782898\"}]";
//1.创建ObjectMapper对象
ObjectMapper objectMapper = new ObjectMapper();
//2.调用readValue()
TypeReference<List<User>> ref = new TypeReference<List<User>>(){};
List<User> list = objectMapper.readValue(jsonStr, ref);
System.out.println(list);
}
方法 | 功能 |
---|---|
parseObject(String json, Class type) |
把json字符串,还原成type类型的Java对象 |
parseArray(String json, Class type) |
把json字符串,还原成List |
@Test
//把json转成JavaBean(user对象)
public void test08() throws IOException {
String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"[email protected]\",\"phone\":\"1386789898\"}";
//1.调用JSON.parseObject(String json,Class clazz);
User user = JSON.parseObject(jsonStr, User.class);
System.out.println(user);
}
@Test
//把json转成Map
public void test09() throws IOException {
String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"[email protected]\",\"phone\":\"1386789898\"}";
//1.调用JSON.parseObject(String json,Class clazz);
Map map = JSON.parseObject(jsonStr, Map.class);
System.out.println(map);
}
@Test
public void test11(){
//使用fastjson将json数组的字符串,转换成List
String jsonArr = "[{\"id\":1,\"username\":\"奥巴马\",\"password\":\"123456\",\"email\":\"[email protected]\",\"phone\":\"18999999999\"},{\"id\":2,\"username\":\"周杰棍\",\"password\":\"654321\",\"email\":\"[email protected]\",\"phone\":\"18666666666\"},{\"id\":3,\"username\":\"王丽红\",\"password\":\"777777\",\"email\":\"[email protected]\",\"phone\":\"18777777777\"}]";
List<User> userList = JSON.parseArray(jsonArr, User.class);
for (User user : userList) {
System.out.println(user.getUsername());
}
}
DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>联系人信息展示页面title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-2.1.0.min.js">script>
<script src="js/bootstrap.min.js">script>
<style type="text/css">
td, th {
text-align: center;
}
style>
head>
<body>
<div class="container">
<h3 style="text-align: center">显示所有联系人h3>
<table border="1" class="table table-bordered table-hover">
<tr class="success">
<th>编号th>
<th>姓名th>
<th>性别th>
<th>年龄th>
<th>籍贯th>
<th>QQth>
<th>邮箱th>
<th>操作th>
tr>
<tbody>
tbody>
<tfoot>
<tr>
<td colspan="8" align="center"><a class="btn btn-primary" href="/add.html">添加联系人a>td>
tr>
tfoot>
table>
<script>
//当这个页面加载的时候,就发送一个异步请求给服务器,获取所有联系人的信息
$.get("linkman?action=findAll",function (result) {
if (result.flag) {
//服务器没有异常
//取出要显示在页面的结果
var linkmanList = result.data;
//遍历出每一个linkMan
$.each(linkmanList,function (index,linkman) {
//每遍历出一条数据,就往tbody中添加一行
$("tbody").append("\n" +
" "+(index+1)+" \n" +
" "+linkman.name+" \n" +
" "+linkman.sex+" \n" +
" "+linkman.age+" \n" +
" "+linkman.address+" \n" +
" "+linkman.qq+" \n" +
" "+linkman.email+" \n" +
" 修改 \n" +
" 删除 \n" +
" ")
})
}
},"json")
script>
div>
body>
html>
/**
* 查询所有联系人
*/
private void findAll(HttpServletRequest request,HttpServletResponse response) throws IOException {
ResultBean resultBean = new ResultBean(true);
try {
//1. 调用业务层的方法,查询所有联系人
List<LinkMan> linkManList = linkManService.findAll();
//2. 将响应数据封装到ResultBean对象中
resultBean.setData(linkManList);
} catch (Exception e) {
e.printStackTrace();
//查询失败
resultBean.setFlag(false);
resultBean.setErrorMsg("查询联系人失败");
}
//将resultBean对象转换成json字符串,响应给客户端
String jsonStr = JSON.toJSONString(resultBean);
response.getWriter().write(jsonStr);
}
DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>添加用户title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-2.1.0.min.js">script>
<script src="js/bootstrap.min.js">script>
head>
<body>
<div class="container">
<center><h3>添加联系人页面h3>center>
<div id="msg" style="color: red">div>
<form action="/linkman" id="myForm" method="post" onsubmit="return false">
<input type="hidden" name="action" value="add">
<div class="form-group">
<label for="name">姓名:label>
<input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
div>
<div class="form-group">
<label>性别:label>
<input type="radio" name="sex" value="男" checked="checked"/>男
<input type="radio" name="sex" value="女"/>女
div>
<div class="form-group">
<label for="age">年龄:label>
<input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
div>
<div class="form-group">
<label for="address">籍贯:label>
<select name="address" class="form-control" id="address">
<option value="广东">广东option>
<option value="广西">广西option>
<option value="湖南">湖南option>
select>
div>
<div class="form-group">
<label for="qq">QQ:label>
<input type="text" class="form-control" name="qq" id="qq" placeholder="请输入QQ号码"/>
div>
<div class="form-group">
<label for="email">Email:label>
<input type="text" class="form-control" name="email" id="email" placeholder="请输入邮箱地址"/>
div>
<div class="form-group" style="text-align: center">
<input class="btn btn-primary" type="submit" value="提交" onclick="addLinkman()"/>
<input class="btn btn-default" type="reset" value="重置" />
<input class="btn btn-default" type="button" value="返回" />
div>
form>
<script>
//声明一个添加联系人的方法
function addLinkman() {
//获取表单中的所有请求参数
var parameter = $("#myForm").serialize();
//发送异步请求给"/linkman",请求方式post,提交表单中的所有数据
$.post("linkman",parameter,function (result) {
if (result.flag) {
//添加成功
//跳转到list.html
location.href = "list.html"
}else {
//添加失败
$("#msg").html(result.errorMsg)
}
},"json")
}
script>
div>
body>
html>
/**
* 添加联系人
* @param request
* @param response
* @throws IOException
*/
private void add(HttpServletRequest request,HttpServletResponse response) throws IOException {
ResultBean resultBean = new ResultBean(true);
try {
//1. 获取所有请求参数
Map<String, String[]> parameterMap = request.getParameterMap();
//2. 将请求参数封装到LinkMan对象中
LinkMan linkMan = new LinkMan();
BeanUtils.populate(linkMan,parameterMap);
//3. 调用业务层的方法添加联系人
linkManService.add(linkMan);
//4. 添加成功
// 告诉客户端添加成功
} catch (Exception e) {
e.printStackTrace();
//告诉客户端添加失败
resultBean.setFlag(false);
resultBean.setErrorMsg("添加失败");
}
String jsonStr = JSON.toJSONString(resultBean);
response.getWriter().write(jsonStr);
}
DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>联系人信息展示页面title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-2.1.0.min.js">script>
<script src="js/bootstrap.min.js">script>
<style type="text/css">
td, th {
text-align: center;
}
style>
head>
<body>
<div class="container">
<h3 style="text-align: center">显示所有联系人h3>
<table border="1" class="table table-bordered table-hover">
<tr class="success">
<th>编号th>
<th>姓名th>
<th>性别th>
<th>年龄th>
<th>籍贯th>
<th>QQth>
<th>邮箱th>
<th>操作th>
tr>
<tbody>
tbody>
<tfoot>
<tr>
<td colspan="8" align="center"><a class="btn btn-primary" href="/add.html">添加联系人a>td>
tr>
tfoot>
table>
<script>
//当这个页面加载的时候,就发送一个异步请求给服务器,获取所有联系人的信息
$.get("/linkman?action=findAll",function (result) {
if (result.flag) {
//服务器没有异常
//取出要显示在页面的结果
var linkmanList = result.data;
//遍历出每一个linkMan
$.each(linkmanList,function (index,linkman) {
//每遍历出一条数据,就往tbody中添加一行
$("tbody").append("\n" +
" "+(index+1)+" \n" +
" "+linkman.name+" \n" +
" "+linkman.sex+" \n" +
" "+linkman.age+" \n" +
" "+linkman.address+" \n" +
" "+linkman.qq+" \n" +
" "+linkman.email+" \n" +
" +linkman.id+"\">修改 \n" +
" +linkman.name+"','"+linkman.id+"')\">删除 \n" +
" ")
})
}
},"json")
//声明一个删除联系人的方法
function deleteLinkMan(name,id) {
//1. 弹出一个确认框
var flag = confirm("你确定要删除"+name+"吗?");
if (flag) {
//确定要删除
//向LinkManServlet发送异步请求,并且携带要删除的联系人的id
$.post("linkman","action=delete&id="+id,function (result) {
if (result.flag) {
//删除成功,跳转到list.html页面
location.href = "list.html"
}else {
//删除失败
alert(result.errorMsg)
}
},"json")
}
}
script>
div>
body>
html>
/**
* 删除联系人
* @param request
* @param response
* @throws IOException
*/
private void delete(HttpServletRequest request,HttpServletResponse response) throws IOException {
ResultBean resultBean = new ResultBean(true);
try {
//1. 获取要删除的联系人的id
Integer id = Integer.valueOf(request.getParameter("id"));
//2. 调用业务层的方法,根据id删除联系人
linkManService.deleteById(id);
} catch (Exception e) {
e.printStackTrace();
resultBean.setFlag(false);
resultBean.setErrorMsg("删除失败");
}
//将resultBean转换成json字符串,响应给客户端
response.getWriter().write(JSON.toJSONString(resultBean));
}
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
<!-- 指定字符集 -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>修改联系人</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-2.1.0.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/getParameter.js"></script>
</head>
<body>
<div class="container" style="width: 400px;">
<h3 style="text-align: center;">修改联系人</h3>
<form id="updateForm" action="linkman" method="post" onsubmit="return false">
<input type="hidden" name="id" id="id">
<input type="hidden" name="action" value="update">
<div class="form-group">
<label for="name">姓名:</label>
<input type="text" class="form-control" id="name" name="name"
placeholder="请输入姓名" />
</div>
<div class="form-group">
<label>性别:</label>
<input type="radio" name="sex" value="男" />男
<input type="radio" name="sex" value="女" />女
</div>
<div class="form-group">
<label for="age">年龄:</label>
<input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄" />
</div>
<div class="form-group">
<label for="address">籍贯:</label>
<select name="address" id="address" class="form-control" >
<option value="广东">广东</option>
<option value="广西">广西</option>
<option value="湖南">湖南</option>
</select>
</div>
<div class="form-group">
<label for="qq">QQ:</label>
<input type="text" id="qq" value="${linkman.qq}" class="form-control" name="qq" placeholder="请输入QQ号码"/>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="text" id="email" value="${linkman.email}" class="form-control" name="email" placeholder="请输入邮箱地址"/>
</div>
<div class="form-group" style="text-align: center">
<input class="btn btn-primary" type="submit" value="提交"/>
<input class="btn btn-default" type="reset" value="重置" />
<input class="btn btn-default" type="button" value="返回"/>
</div>
</form>
<script>
//获取要修改的联系人的id
var id = getParameter("id");
//页面加载的时候,就应该向服务器发送异步请求,进行数据回显
$.post("linkman","action=findOne&id="+id,function (result) {
if (result.flag) {
//数据回显成功
//回显姓名
$("#name").val(result.data.name)
//回显性别
if (result.data.sex == "男") {
$(":radio[value='男']").prop("checked",true)
}else {
$(":radio[value='女']").prop("checked",true)
}
//回显年龄
$("#age").val(result.data.age)
//回显address
$("#address").val(result.data.address)
//回显qq和email
$("#qq").val(result.data.qq)
$("#email").val(result.data.email)
//回显id
$("#id").val(result.data.id)
}else {
//数据回显失败
alert(result.errorMsg)
}
},"json")
</script>
</div>
</body>
</html>
/**
* 根据id查询联系人
* @param request
* @param response
*/
private void findOne(HttpServletRequest request, HttpServletResponse response) throws IOException {
ResultBean resultBean = new ResultBean(true);
try {
//1. 获取要查询的联系人的id
Integer id = Integer.valueOf(request.getParameter("id"));
//2. 调用业务层的方法,根据id查询联系人
LinkMan linkMan = linkManService.findById(id);
//3. 将响应结果封装到ResultBean对象
resultBean.setData(linkMan);
} catch (Exception e) {
e.printStackTrace();
resultBean.setFlag(false);
resultBean.setErrorMsg("数据回显失败");
}
//将resultBean转换成json字符串,响应给客户端
response.getWriter().write(JSON.toJSONString(resultBean));
}
DOCTYPE html>
<html lang="zh-CN">
<head>
<base href="<%=basePath%>"/>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>修改联系人title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-2.1.0.min.js">script>
<script src="js/bootstrap.min.js">script>
<script src="js/getParameter.js">script>
head>
<body>
<div class="container" style="width: 400px;">
<h3 style="text-align: center;">修改联系人h3>
<form action="linkman" id="updateForm" method="post" onsubmit="return false">
<input type="hidden" name="action" value="update">
<input type="hidden" name="id" id="id">
<div class="form-group">
<label for="name">姓名:label>
<input type="text" class="form-control" id="name"
name="name" placeholder="请输入姓名"/>
div>
<div class="form-group">
<label>性别:label>
<input id="male" type="radio" name="sex" value="男" checked/>男
<input id="female" type="radio" name="sex" value="女" />女
div>
<div class="form-group">
<label for="age">年龄:label>
<input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄" />
div>
<div class="form-group">
<label for="address">籍贯:label>
<select name="address" id="address" class="form-control" >
<option value="广东" selected>广东option>
<option value="广西">广西option>
<option value="湖南">湖南option>
select>
div>
<div class="form-group">
<label for="qq">QQ:label>
<input type="text" id="qq" class="form-control" name="qq" placeholder="请输入QQ号码"/>
div>
<div class="form-group">
<label for="email">Email:label>
<input type="text" id="email" class="form-control" name="email" placeholder="请输入邮箱地址"/>
div>
<div class="form-group" style="text-align: center">
<input class="btn btn-primary" type="submit" value="提交" onclick="updateLinkMan()"/>
<input class="btn btn-default" type="reset" value="重置" />
<input class="btn btn-default" type="button" value="返回"/>
div>
form>
div>
<script>
//发送异步请求给LinkManServlet,根据id查询联系人信息
var id = getParameter("id");
$.post("linkman","action=findOne&id="+id,function (result) {
if (result.flag) {
//查询成功
var linkman = result.data;
$("#name").val(linkman.name)
if (linkman.sex == "男") {
$("#male").prop("checked",true)
}else {
$("#female").prop("checked",true)
}
$("#age").val(linkman.age)
$("#address").val(linkman.address)
$("#qq").val(linkman.qq)
$("#email").val(linkman.email)
$("#id").val(linkman.id)
}
},"json")
function updateLinkMan() {
//发送异步请求提交修改数据
$.post("linkman",$("#updateForm").serialize(),function (result) {
if (result.flag) {
//修改成功
location.href = "list.html"
}else {
alert("修改失败")
}
},"json")
}
script>
body>
html>
/**
* 修改联系人的方法
* @param request
* @param response
*/
private void update(HttpServletRequest request, HttpServletResponse response) throws IOException {
ResultBean resultBean = new ResultBean(true);
try {
//1. 获取所有请求参数封装到LinkMan对象中
Map<String, String[]> parameterMap = request.getParameterMap();
LinkMan linkMan = new LinkMan();
BeanUtils.populate(linkMan,parameterMap);
//2. 调用业务层的方法,修改联系人信息
linkManService.update(linkMan);
} catch (Exception e) {
e.printStackTrace();
resultBean.setFlag(false);
resultBean.setErrorMsg("修改失败");
}
//将resultBean转换成json字符串,响应给客户端
response.getWriter().write(JSON.toJSONString(resultBean));
}
DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap模板title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-2.1.0.min.js">script>
<script src="js/bootstrap.min.js">script>
<style type="text/css">
td, th {
text-align: center;
}
style>
<script src="js/getParameter.js">script>
head>
<body>
<div class="container">
<h3 style="text-align: center">显示所有联系人h3>
<table border="1" class="table table-bordered table-hover">
<thead>
<tr class="success">
<th>编号th>
<th>姓名th>
<th>性别th>
<th>年龄th>
<th>籍贯th>
<th>QQth>
<th>邮箱th>
<th>操作th>
tr>
thead>
<tbody>
tbody>
<tfoot>
<tr>
<td id="total" colspan="8" align="center">
td>
tr>
<tr>
<td colspan="8" align="center">
<ul class="pagination success">
ul>
td>
tr>
tfoot>
table>
div>
<script>
//获取currentPage和pageSize的值
var currentPage = parseInt(getParameter("currentPage"));
var pageSize = parseInt(getParameter("pageSize"));
//发送异步请求给LinkManServlet进行分页查询
$.post("linkman","action=findByPage¤tPage="+currentPage+"&pageSize="+pageSize,function (result) {
if (result.flag) {
//分页查询成功
//获取并展示当前页的联系人集合
var linkmanList = result.data.list;
$.each(linkmanList,function (index,linkman) {
$("tbody").append($("\n" +
" "+(index+1)+" \n" +
" "+linkman.name+" \n" +
" "+linkman.sex+" \n" +
" "+linkman.age+" \n" +
" "+linkman.address+" \n" +
" "+linkman.qq+" \n" +
" "+linkman.email+" \n" +
" 修改 删除 \n" +
" "))
})
var totalSize = result.data.totalSize;
var totalPage = result.data.totalPage;
//展示总条数和每页条数
$("#total").html("总数据条数为"+totalSize+"条
\n" +
" 每页显示"+pageSize+"条数据")
//展示页码
//先展示上一页
if(currentPage > 1){
$(".pagination").append($("\n" +
" +(currentPage-1)+"&pageSize="+pageSize+"\" aria-label=\"Previous\">\n" +
" «\n" +
" \n" +
" "))
}
//遍历展示页码
for(var i=1;i<=totalPage;i++){
//判断是否是当前页
if (currentPage == i) {
//高亮
$(".pagination").append($("" +i+""))
}else {
$(".pagination").append($(" +i+"&pageSize="+pageSize+"\">"+i+" "))
}
}
//展示下一页
if(currentPage < totalPage){
$(".pagination").append($("\n" +
" +(currentPage+1)+"&pageSize="+pageSize+"\" aria-label=\"Next\">\n" +
" »\n" +
" \n" +
" "))
}
}
},"json")
script>
body>
html>
private void findByPage(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
ResultBean resultBean = new ResultBean(true);
try {
//1. 获取请求参数currentPage和pageSize的值
Long currentPage = Long.valueOf(request.getParameter("currentPage"));
Integer pageSize = Integer.valueOf(request.getParameter("pageSize"));
//2. 调用业务层的方法,查询当前页的pageBean
PageBean<LinkMan> pageBean = linkManService.findByPage(currentPage,pageSize);
resultBean.setData(pageBean);
} catch (Exception e) {
e.printStackTrace();
//分页查询失败
resultBean.setFlag(false);
resultBean.setErrorMsg("分页查询失败");
}
//将resultBean转换成json字符串,响应给客户端
response.getWriter().write(JSON.toJSONString(resultBean));
}