技术标签: 学习 ajax javascript 开发技术学习笔记
视频教程来自:https://www.bilibili.com/video/BV15k4y167XM?spm_id_from=333.999.0.0
整个浏览器被新的数据覆盖,在网络中传输大量的数据,浏览器需要加载,渲染页面
在浏览器的内部,发起请求,获取数据,改变页面中的部分内容
局部刷新的速度更快,可以按需获取数据
ajax是用来做局部刷新的,局部刷新使用的核心对象是 异步对象(XMLHttpRequest)
这个异步对象是存在浏览器内存中的,使用javascript语法创建和使用 XMLHttpRequest 对象
Asynchronous Javascript and XML(异步的 Javascript 和 XML)
Ajax是一种做局部刷新的新方法(2003年左右),不是一种语言。
Ajax包含的技术主要有JavaScript,dom,css,xml等等,核心是JavaScript和xml。
JavaScript负责创建异步对象,发送请求,更新页面的dom对象。
Ajax请求需要服务器端的数据。
xml:可扩展标记语言
网络中的传输的数据格式
目前使用 json 替换了 xml
<datas>
<data1> Car_01 </data1>
<data2> Car_02 </data2>
<data3> Car_03 </data3>
<data4> Car_04 </data4>
</datas>
ajax中使用XMLHttpRequest对象
var xmlHttp = new XMLHttpRequest();
给异步对象绑定onreadstatechange事件,获知请求的状态的变化
onreadystatechange事件
这个事件需要指定一个函数,在函数中处理状态的变化
bth.onclick = fun1(); // 点击这个按钮会触发fun1函数
function fun1(){
alert("按钮单击");
}
// For example,
xmlHttp.onreadystatechange = function(){
// 用匿名函数直接指定
// 处理请求的状态变化
if( xmlHttp.readyState == 4 && xmlHttp.status == 200 ){
// 数据已经返回来准备好了 && 网络请求是成功的
// 可以处理服务器端的数据,更新当前页面
var data = xmlHttp.responseText;
// 获取服务器返回的数据,使用异步对象的属性 responseText
document.getElementById("name").value = data;
}
}
XMLHttpRequest对象的三个重要的属性
onreadystatechange 属性
readyState 属性:存有 XMLHttprequest 的状态,表示异步对象请求从0到4的状态变化
readyState == 0:请求未初始化,创建异步请求对象,var xmlHttp = new XMLHttpReaquest()
readyState == 1:初始化异步请求对象,xmlHttp.open( 请求方式,请求地址,true ) 。
readyState == 2:异步对象发送请求,xmlHttp.send() 。
readyState == 3:异步对象接收应答数据,从服务端返回数据,XMLHttpRequest 内部处理。
readyState == 4:异步请求对象已经将数据解析完毕,此时才可以读取数据。
state 属性:表示网络请求的状况
异步的方法 open()
xmlHttp.open(请求方式get|post,"服务端的访问地址",同步|异步请求)
同步|异步请求:默认为true,表示异步请求
xmlHttp.open("get","loginServlet?name=zhangsan&pwd=123",true);
获取服务器返回的数据,使用异步对象的属性 responseText
使用需要配合服务器端,因为需要到服务端拿数据,单独使用没有意义
回调:当请求的状态变化时,异步对象会自动调用 onreadystatechange事件 对应的函数
第一步:打开 index.jsp 页面
第二步:准备服务器端
(1) 创建 Servlet
(2) 设置 tomcat
不然会出大问题!(tomcat服务更新异常,无法更新或更新不完全)
(3) 创建 jsp 结果页面
第三步:编写服务器端
(1) 编写 web.xml
<servlet></servlet>
标签对
xml文件中给出了 servlet 标签对 的内容
<servlet>
<servlet-name>Servlet模块名</servlet-name>
<servlet-class>com.XXX.controller(包名).Servlet模块名</servlet-class>
</servlet>
<servlet-mapping></servlet-mapping>
标签对
编写servlet-mapping
标签对 的内容
<servlet-mapping>
<servlet-name>Servlet模块名</servlet-name>
<url-pattern>/路径访问地址</url-pattern>
</servlet-mapping>
注意,若url路径落下 ” / “ ,启动 tomcat 会出现下图描述的报错
(2) 编写 myServlet.java 类
src \ com.XXX.controller \ myServlet.java
在doGet()方法中编写程序
// 接收参数
String strname = request.getParameter("name");
String height = request.getParameter("height");
String weight = request.getParameter("weight");
// 计算BMI
float h = Float.valueOf(height);
float w = Float.valueOf(weight);
float bmi = w / ( h * h );
// 判断bmi的范围
String msg;
if ( bmi < 18.5 ){
msg = "您的身材较瘦";
}else if ( bmi >= 18.5 && bmi <= 23.9 ){
msg = "您的身材是正常的";
}else if ( bmi > 24 && bmi <27){
msg = "您的身材较胖";
}else {
msg = "您的身材过胖";
}
System.out.println("msg="+msg);
msg = "您好," + strName + "先生/女士,您的BMI指数为:" + bmi + "," + msg;
// 把数据存入到request
request.setAttribute("msg",msg);
// 转发到新的页面
request.getRequestDispatcher("/result.jsp").forward(request,response);
(3) 编写 result.jsp 页面
web \ result.jsp
<title>结果页面</title>
<p>显示BMI计算结果</p>
<h3>${msg}</h3>
第四步:运行tomcat,访问8080端口
改写 myServlet.java 类
更改其中数据输出方式(使用应答对象输出数据)
/*
// 把数据存入到request
request.setAttribute("msg",msg);
// 转发到新的页面
request.getRequestDispatcher("/result.jsp").forward(request,response);
*/
// 使用HttpServletResponse输出数据
response.setContentType("text/html;charset=utf-8");
// 获取PrintWriter
PrintWriter pw = response.getWriter();
// 输出数据
pw.println(msg);
// 清空缓存
pw.flush();
// 关闭close
pw.close();
成功运行!
局部刷新方式概述
使用ajax的局部刷新
1.新建jsp,使用XMLHttpRequest异步对象。
使用异步对象有四个步骤:
1.创建
2.绑定事件
3.初始请求
4.发送请求
2.创建服务器的servlet,接收并处理数据,把数据输出给异步对象。
第一步:打开 index.jsp 页面
打开 web \ index.jsp 文件,设计页面布局
标题 title 标签自定义
提示文字 p 标签自定义
div 标签圈定范围
input 标签设置id,以便后续…
input 标签设置 onclick 触发 doAjax() 函数
注意,Ajax的数据传输不是通过form表单提交的
<!-- 写在head中 -->
<script type="text/javascript">
// 使用内存中的异步对象,代替浏览器发起请求。异步对象是使用js创建和管理的。
function doAjax(){
// 1.创建异步对象
var xmlHttp = new XMLHttpRequest();
// 2.绑定事件
xmlHttp.onreadystatechange = function (){
// 处理服务器端返回的数据,更新当前页面
// alert("readyState属性值====" + xmlHttp.readyState + " | status:" + xmlHttp.status);
if( xmlHttp.readyState == 4 && xmlHttp.status==200 ){
alert(xmlHttp.responseText);
}
}
// 3.初始请求数据
xmlHttp.open("get","bmiAjax",true);
// 4.发起请求
xmlHttp.send();
}
</script>
第二步:准备服务器端
(1) 创建 Servlet
(2) 设置 tomcat
补充:如果是子模块使用同项目配置好的tomcat,只需要设置:
第三步:编写服务器端
(1) 编写 web.xml
<servlet>
<servlet-name>MyBmiAjaxServlet</servlet-name>
<servlet-class>com.ding.controller.MyBmiAjaxServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyBmiAjaxServlet</servlet-name>
<url-pattern>/myBmiAjaxServlet</url-pattern>
</servlet-mapping>
(2) 编写 myServlet.java 类
@WebServlet(name = "MyBmiAjaxServlet", value = "/MyBmiAjaxServlet")
public class MyBmiAjaxServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接受了Ajax的请求");
// 接收参数
String strName = request.getParameter("name");
String weight = request.getParameter("weight");
String height = request.getParameter("height");
// 计算BMI
float h = Float.valueOf(height);
float w = Float.valueOf(weight);
float bmi = w / ( h * h );
String msg;
// 判断bmi的范围
if ( bmi < 18.5 ){
msg = "您的身材较瘦";
}else if ( bmi >= 18.5 && bmi <= 23.9 ){
msg = "您的身材是正常的";
}else if ( bmi > 24 && bmi <27){
msg = "您的身材较胖";
}else {
msg = "您的身材过胖";
}
System.out.println("msg="+msg);
msg = "您好," + strName + "先生/女士,您的BMI指数为:" + bmi + "," + msg;
// 响应Ajax需要的数据,使用HttpServletResponse输出数据
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(msg);
pw.flush();
pw.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
编写 index.jsp 页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>我的局部刷新测试-Ajax练习</title>
<script type="text/javascript">
// 使用内存中的异步对象,代替浏览器发起请求。异步对象是使用js创建和管理的。
function doAjax(){
// 1.创建异步对象
var xmlHttp = new XMLHttpRequest();
// 2.绑定事件
xmlHttp.onreadystatechange = function (){
// 处理服务器端返回的数据,更新当前页面
if( xmlHttp.readyState == 4 && xmlHttp.status == 200 ) {
var data = xmlHttp.responseText;
// 更新dom对象,更新页面数据
document.getElementById("mydata").innerText = data;
}
}
// 3.初始请求数据
// 获取dom对象的value属性值
var name = document.getElementById("name").value;
var weight = document.getElementById("weight").value;
var height = document.getElementById("height").value;
// bmiPrintServlet?name=张三&weight=100&height=1.85
var param = "name=" + name + "&weight=" + weight + "&height=" + height;
xmlHttp.open("get","myBmiAjaxServlet?" + param,true);
// 4.发起请求
xmlHttp.send();
}
</script>
</head>
<body>
<p>局部刷新-Ajax-计算BMI</p>
<div>
姓名:<input type="text" id="name"/><br/>
体重(公斤):<input type="text" id="weight"/><br/>
身高(米):<input type="text" id="height"/><br/>
<input type="button" value="计算BMI" οnclick="doAjax()">
<br/> <br/>
<div id = "mydata">
等待加载数据......
</div>
</div>
</body>
</html>
从全局刷新到局部刷新
第一步:打开 index.jsp 页面
第二步:准备服务器端
【上述三大步二小步同局部刷新方式步骤内容】
第三步:编写服务器端
重写服务器端 Version 1.0
目的:验证异步对象是否可以发起请求
更改对象:myServlet.java
// 以下内容均写在doGet()方法中
System.out.println("接受了Ajax的请求");
如果这句话可以输出(控制台可以显示),说明请求发起成功
web.xml设置路径
启动 tomcat,服务成功发布
证明异步对象确实可以发起请求啦
// 异步对象在发起请求的过程中是有状态变化的(5种状态)
重写服务器端 Version 2.0
目的:观察异步对象发起请求过程中的状态变化
更改对象:index.jsp
<!-- 写在head中 -->
<script type="text/javascript">
// 使用内存中的异步对象,代替浏览器发起请求。异步对象是使用js创建和管理的。
function doAjax(){
// 1.创建异步对象
var xmlHttp = new XMLHttpRequest();
// 2.绑定事件
xmlHttp.onreadystatechange = function (){
// 处理服务器端返回的数据,更新当前页面
alert("readyState属
性值====" + xmlHttp.readyState);
}
// 3.初始请求数据
xmlHttp.open("get","bmiAjax",true);
// 4.发起请求
xmlHttp.send();
}
</script>
服务器端是空数据,但整个流程步骤完成执行,所以状态码变化为 0 => 1 => 2 => 4(0看不到)
重写服务器端 Version 3.0
在 index.jsp 加上状态码,观察其变化
// 2.绑定事件
xmlHttp.onreadystatechange = function (){
// 处理服务器端返回的数据,更新当前页面
alert("readyState属性值====" + xmlHttp.readyState +
" | status:" + xmlHttp.status);
}
重写服务器端 Version 4.0
目的:观察异步对象发起请求过程中完整的状态变化
更改对象:myServlet.java
// 写在doGet()方法中
System.out.println("接受了Ajax的请求");
PrintWriter pw = response.getWriter();
pw.println("Hello,Ajax!");
pw.flush();
pw.close();
重写服务器端 Version 5.0
目的:观察异步对象发起请求过程中完整的状态变化
更改对象:index.jsp
// 2.绑定事件
xmlHttp.onreadystatechange = function (){
// 处理服务器端返回的数据,更新当前页面
if( xmlHttp.readyState == 4 && xmlHttp.status == 200 ){
alert(xmlHttp.responseText);
}
}
点击按钮弹窗后,数据并未发生变化
按钮中有一个异步对象xmlHttp,该异步对象发起请求
把数据给Servlet,Servlet又把数据给了异步对象xmlHttp
重写服务器端 Version 5.0
传参
怎么获取身高、体重、姓名的数据呢? ==> dom对象的值
更改对象:index.jsp
访问地址:使用get方式传递参数
http://localhost:8080/Ajax_Dongli_war_exploded/bmiPrintServlet**?name=张三&weight=100&height=1.85**
// 3.初始请求数据
// 获取dom对象的value属性值
var name = document.getElementById("name").value;
var weight = document.getElementById("weight").value;
var height = document.getElementById("height").value;
// bmiPrintServlet?name=张三&weight=100&height=1.85
var param = "name=" + name + "&weight=" + weight + "&height=" + height;
alert("param=" + param);
xmlHttp.open("get","bmiAjax?" + param,true);
重写服务器端 Version 5.1
收参
更改对象:myServlet.java
// 写在doGet()方法中
System.out.println("接受了Ajax的请求");
// 接收参数
String strName = request.getParameter("name");
String weight = request.getParameter("weight");
String height = request.getParameter("height");
// 计算BMI
float h = Float.valueOf(height);
float w = Float.valueOf(weight);
float bmi = w / ( h * h );
String msg;
// 判断bmi的范围
if ( bmi < 18.5 ){
msg = "您的身材较瘦";
}else if ( bmi >= 18.5 && bmi <= 23.9 ){
msg = "您的身材是正常的";
}else if ( bmi > 24 && bmi <27){
msg = "您的身材较胖";
}else {
msg = "您的身材过胖";
}
System.out.println("msg="+msg);
msg = "您好," + strName + "先生/女士,您的BMI指数为:" + bmi + "," + msg;
// 响应Ajax需要的数据,使用HttpServletResponse输出数据
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(msg);
pw.flush();
pw.close();
重写服务器端 Version 5.2
拿到数据之后如何更新页面?
更改页面:index.jsp
<!-- 在jsp页面body标签的div标签内添加如下代码 -->
<br/> <br/>
<div id = "mydata">等待加载数据......</div>
// 在jsp页面head标签的script标签内修改如下代码
// 2.绑定事件
xmlHttp.onreadystatechange = function (){
// 处理服务器端返回的数据,更新当前页面
if( xmlHttp.readyState == 4 && xmlHttp.status == 200 ){
// alert(xmlHttp.responseText);
var data = xmlHttp.responseText;
// 更新dom对象,更新页面数据
document.getElementById("mydata").innerText = data;
}
}
将关于弹窗提示的测试代码注释掉
用户在文本框架输入省份的编号id,在其他文本框显示省份名称
数据库:springdb
数据表
省份信息表
SET FOREIGN_KEY_CHECKS=0 ;
DROP TABLE IF EXISTS `pro`;
CREATE TABLE `pro`(
`id`int(11) NOT NULL AUTO_INCREMENT ,
`name`varchar(255) DEFAULT NULL COMMENT '省份名称',
`jiancheng`varchar(255) DEFAULT NULL COMMENT '简称',
`shenghui` varchar(255) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ;
INSERT INTO `pro` VALUES ('1','河北','冀','石家庄');
INSERT INTO `pro` VALUES ('2','山西','晋','太原市');
INSERT INTO `pro` VALUES ('3','内蒙古','蒙','呼和浩特市');
INSERT INTO `pro` VALUES ('4','辽宁','辽','沈阳');
INSERT INTO `pro` VALUES ('5','江苏','苏','南京');
INSERT INTO `pro` VALUES ('6','浙江','浙','杭州');
INSERT INTO `pro` VALUES ('7','安徽','皖','合肥');
INSERT INTO `pro` VALUES ('8','福建','闽','福州');
INSERT INTO `pro` VALUES ('9','江西','赣','南昌');
城市信息表
SET FOREIGN_KEY_CHECKS=0 ;
DROP TABLE IF EXISTS `city`;
CREATE TABLE `city` (
`id` int (11) NOT NULL AUTO_INCREMENT ,
`name` varchar (255) DEFAULT NULL,
`provinceid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= 17 DEFAULT CHARSET=utf8 ;
INSERT INTO `city` VALUES ('1','石家庄','1') ;
INSERT INTO `city` VALUES ('2','秦皇岛','1') ;
INSERT INTO `city` VALUES ('3','保定市','1') ;
INSERT INTO `city` VALUES ('4','张家口','1') ;
INSERT INTO `city` VALUES ('5','南昌市','9') ;
INSERT INTO `city` VALUES ('6','九江市','9') ;
INSERT INTO `city` VALUES ('7','宜春市','9') ;
INSERT INTO `city` VALUES ('8','福州市','8') ;
INSERT INTO `city` VALUES ('9','厦门市','8') ;
INSERT INTO `city` VALUES ('10','泉州市','8') ;
INSERT INTO `city` VALUES ('11','龙岩市','8') ;
INSERT INTO `city` VALUES ('12','太原市','2') ;
INSERT INTO `city` VALUES ('13','大同','2') ;
INSERT INTO `city` VALUES ('14','呼和浩特','3') ;
INSERT INTO `city` VALUES ('15','包头','3') ;
INSERT INTO `city` VALUES ('16','呼伦贝尔','3') ;
编写 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>QueryInfoServlet</servlet-name>
<servlet-class>com.ding.controller.QueryInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>QueryInfoServlet</servlet-name>
<url-pattern>/queryInfoServlet</url-pattern>
</servlet-mapping>
</web-app>
编写 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Ajax根据省份id获取名称</title>
<script type="text/javascript">
function search(){
// 发起Ajax请求,传递参数给服务器,服务器返回数据
// 1.创建异步对象
var xmlHttp = new XMLHttpRequest();
// 2.绑定事件
xmlHttp.onreadystatechange = function(){
if( xmlHttp.readyState == 4 && xmlHttp.status == 200 ){
var data = xmlHttp.responseText;
// 更新dom对象,更新页面数据
document.getElementById("proname").value = xmlHttp.responseText;
}
}
// 3.初始异步对象
// 获取proid文本框的值
var proid = document.getElementById("proid").value;
xmlHttp.open("get","queryInfoServlet?proid=" + proid,true);
// 4.发送请求
xmlHttp.send();
}
</script>
</head>
<body>
<p>Ajax根据省份id获取名称</p>
<table>
<tr>
<td>省份编号:</td>
<td>
<input type="text" id="proid">
<input type="button" value="搜索" onclick="search()">
</td>
</tr>
<tr>
<td>省份名称:</td>
<td><input type="text" id="proname"></td>
</tr>
</table>
</body>
</html>
编写 Dao 层
package com.ding.dao;
import java.sql.*;
// 使用jdbc访问数据库
public class ProvinceDao {
// 根据id获取名称
public String queryProvinceNameById(Integer provinceId){
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
String sql = "";
String url = "jdbc:mysql://localhost:3306/springdb?serverTimezone=UTC";
String username = "root";
String password = "123456";
String name = "";
// 加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url,username,password);
// 创建prepareStatement
sql = "select name from pro where id=?";
pst = conn.prepareStatement(sql);
// 设置参数值
pst.setInt(1,provinceId);
// 执行sql
rs = pst.executeQuery();
// 遍历rs
// while(rs.next()){ // 当你的rs中有多于一条记录时
// name = rs.getString("name");
// }
if(rs.next()){
// 因为记录集就一行
name = rs.getString("name");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try{
if(rs != null){
rs.close();
}
if(pst != null){
pst.close();
}
if(conn != null){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
return name;
}
}
编写 myServlet.java 类
package com.ding.controller;
import com.ding.dao.ProvinceDao;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "QueryInfoServlet", value = "/queryInfoServlet")
public class QueryInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理get请求
System.out.println("响应了Ajax请求");
String strProid = request.getParameter("proid");
System.out.println("strProid");
String name = "默认是无数据";
// 访问dao,查询数据库
if(strProid != null){
// 创建dao对象,调用它的方法
ProvinceDao dao = new ProvinceDao();
name = dao.queryProvinceNameById(Integer.valueOf(strProid));
}
// 使用HttpServletResponse输出数据
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
// pw.println("中国");
pw.println(name);
pw.flush();
pw.close();
}
}
问题的引入
请求过程
JSONObject,这种对象的格式是 名称:值 (所谓的“名称-值对”),也可以看作是 key : value 格式
{
名称 : 值} 或者说 {
key : value }
JSONArray,基本格式 [ { name:“河北” , jiancheng:“冀”,"shenghui:“石家庄” } , {name:“山西” , jiancheng:“晋”,"shenghui:“太原”} ]
[ {
name:"河北" , jiancheng:"冀","shenghui:"石家庄" } , {name:"山西" , jiancheng:"晋","shenghui:"太原"} ]
json格式理解简单,含义清晰
json格式数据在多种语言中比较容易处理。使用java、js等读写json格式的数据比较容易
json格式数据占用的空间小,在网络中传输的速度快,用户的体验好
Java中处理json的工具库:gson,fastjson,jackson,json-lib
在程序中如何处理json?
使用jackson工具库,把一个java对象转为一个json格式的字符串
// 那么需要有一个java对象
// 创建数据表对应的实体类
局部刷新方式概述
使用ajax的局部刷新
1.新建jsp,使用XMLHttpRequest异步对象。
使用异步对象有四个步骤:
1.创建
2.绑定事件
3.初始请求
4.发送请求
2.创建服务器的servlet,接收并处理数据,把数据输出给异步对象。
**第一步:**打开 index.jsp 页面
创建使用 json 的页面
打开 web \ index.jsp 文件,设计页面布局
标题 title 标签自定义
提示文字 p 标签自定义
div 标签圈定范围
input 标签设置id,以便后续…
input 标签设置 onclick 触发 doAjax() 函数
注意,Ajax的数据传输不是通过form表单提交的
输入一个省份的编号,有很多数据信息返回,更新dom页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用json格式的数据</title>
</head>
<body>
<p>Ajax请求使用json格式的数据</p>
<table>
<tr>
<td>省份编号:</td>
</td>
<input type="text" id="proid" >
<input type="button" value="搜索" onclick="doSearch()">
</td>
</tr>
<tr>
<td>省份名称:</td>
</td>
<input type="text" id="proname" >
</td>
</tr>
<tr>
<td>省份简称:</td>
</td>
<input type="text" id="projiancheng" >
</td>
</tr>
<tr>
<td>省会:</td>
</td>
<input type="text" id="proshenghui" >
</td>
</tr>
</table>
</body>
</html>
**第二步:**准备服务器端
(1) 创建 Servlet
(2) 设置 tomcat
**第三步:**编写服务器端
搭建服务器端的基本结构
(1) 编写 web.xml
<servlet>
<servlet-name>QueryInfoServlet</servlet-name>
<servlet-class>com.ding.controller.QueryInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>QueryInfoServlet</servlet-name>
<url-pattern>/queryInfoServlet</url-pattern>
</servlet-mapping>
(2) 编写entity层 Province.java
package com.ding.entity;
public class Province {
private Integer id;
private String name;
private String jiancheng;
private String shenghui;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJiancheng() {
return jiancheng;
}
public void setJiancheng(String jiancheng) {
this.jiancheng = jiancheng;
}
public String getShenghui() {
return shenghui;
}
public void setShenghui(String shenghui) {
this.shenghui = shenghui;
}
}
(3) 编写 dao 层 ProvinceDao.java
dao层返回一个province对象
package com.ding.dao;
import com.ding.entity.Province;
import java.sql.*;
// 使用jdbc访问数据库
public class ProvinceDao {
// 根据id获取名称
public String queryProvinceNameById(Integer provinceId){
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
String sql = "";
String url = "jdbc:mysql://localhost:3306/springdb?serverTimezone=UTC";
String username = "root";
String password = "123456";
String name = "";
// 加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url,username,password);
// 创建prepareStatement
sql = "select name from pro where id=?";
pst = conn.prepareStatement(sql);
// 设置参数值
pst.setInt(1,provinceId);
// 执行sql
rs = pst.executeQuery();
// 遍历rs
// while(rs.next()){ // 当你的rs中有多于一条记录时
// name = rs.getString("name");
// }
if(rs.next()){
// 因为记录集就一行
name = rs.getString("name");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try{
if(rs != null){
rs.close();
}
if(pst != null){
pst.close();
}
if(conn != null){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
return name;
}
// 根据id获取一个完整的Province对象
public Province queryProvinceById(Integer provinceId){
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
String sql = "";
String url = "jdbc:mysql://localhost:3306/springdb?serverTimezone=UTC";
String username = "root";
String password = "123456";
Province province = null;
// 加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url,username,password);
// 创建prepareStatement
sql = "select id,name,jiancheng,shenghui from pro where id=?";
pst = conn.prepareStatement(sql);
// 设置参数值
pst.setInt(1,provinceId);
// 执行sql
rs = pst.executeQuery();
// 遍历rs
// while(rs.next()){ // 当你的rs中有多于一条记录时
// name = rs.getString("name");
// }
if(rs.next()){
province = new Province();
province.setId( rs.getInt("id") );
province.setName( rs.getString("name") );
province.setJiancheng( rs.getString("jiancheng") );
province.setShenghui( rs.getString("shenghui") );
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try{
if(rs != null){
rs.close();
}
if(pst != null){
pst.close();
}
if(conn != null){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
return province;
}
}
(4) 编写 myServlet.java 类
package com.ding.dao;
import com.ding.entity.Province;
import java.sql.*;
// 使用jdbc访问数据库
public class ProvinceDao {
// 根据id获取名称
public String queryProvinceNameById(Integer provinceId){
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
String sql = "";
String url = "jdbc:mysql://localhost:3306/springdb?serverTimezone=UTC";
String username = "root";
String password = "123456";
String name = "";
// 加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url,username,password);
// 创建prepareStatement
sql = "select name from pro where id=?";
pst = conn.prepareStatement(sql);
// 设置参数值
pst.setInt(1,provinceId);
// 执行sql
rs = pst.executeQuery();
// 遍历rs
// while(rs.next()){ // 当你的rs中有多于一条记录时
// name = rs.getString("name");
// }
if(rs.next()){
// 因为记录集就一行
name = rs.getString("name");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try{
if(rs != null){
rs.close();
}
if(pst != null){
pst.close();
}
if(conn != null){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
return name;
}
// 根据id获取一个完整的Province对象
public Province queryProvinceById(Integer provinceId){
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
String sql = "";
String url = "jdbc:mysql://localhost:3306/springdb?serverTimezone=UTC";
String username = "root";
String password = "123456";
Province province = null;
// 加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url,username,password);
// 创建prepareStatement
sql = "select id,name,jiancheng,shenghui from pro where id=?";
pst = conn.prepareStatement(sql);
// 设置参数值
pst.setInt(1,provinceId);
// 执行sql
rs = pst.executeQuery();
// 遍历rs
// while(rs.next()){ // 当你的rs中有多于一条记录时
// name = rs.getString("name");
// }
if(rs.next()){
province = new Province();
province.setId( rs.getInt("id") );
province.setName( rs.getString("name") );
province.setJiancheng( rs.getString("jiancheng") );
province.setShenghui( rs.getString("shenghui") );
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try{
if(rs != null){
rs.close();
}
if(pst != null){
pst.close();
}
if(conn != null){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
return province;
}
}
写完servlet,还没写ajax的请求呢,先测试一下servlet能不能用(可不可以正常返回数据)
serlvet写完之后测一下
编写 index.jsp 页面
在js中,可以将json格式的字符串,转为json对象,json中的key,就是json对象的属性名
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用json格式的数据</title>
<script type="text/javascript">
function doSearch(){
// 1.创建异步对象
var xmlHttp = new XMLHttpRequest();
// 2.绑定事件
xmlHttp.onreadystatechange = function (){
if( xmlHttp.readyState == 4 && xmlHttp.status == 200 ){
var data = xmlHttp.responseText;
var jsonobj = eval("(" + data + ")");
// eval是执行括号中的代码,把json字符串转为json对象
// 更新dom对象
document.getElementById("proname").value = jsonobj.name;
document.getElementById("projiancheng").value = jsonobj.jiancheng;
document.getElementById("proshenghui").value = jsonobj.shenghui;
}
}
// 3. 初始异步对象的数据
var proid = document.getElementById("proid").value;
xmlHttp.open("get","queryInfoServlet?proid=" + proid,true);
// 4.发起请求
xmlHttp.send();
}
</script>
</head>
<body>
<p>Ajax请求使用json格式的数据</p>
<table>
<tr>
<td>省份编号:</td>
<td>
<input type="text" id="proid" >
<input type="button" value="搜索" οnclick="doSearch()">
</td>
</tr>
<tr>
<td>省份名称:</td>
<td>
<input type="text" id="proname" >
</td>
</tr>
<tr>
<td>省份简称:</td>
<td>
<input type="text" id="projiancheng" >
</td>
</tr>
<tr>
<td>省会:</td>
<td>
<input type="text" id="proshenghui" >
</td>
</tr>
</table>
</body>
</html>
open函数第三个参数的作用(true)
同步还是异步?——> 真表示异步,假表示同步;
true:异步处理请求,使用异步对象发起请求后,不用等待数据处理完毕就可以执行其他的操作。
按理说,发送到servlet的数据,返回后才可以继续使用,
但异步可以同时处理多个请求,不会妨碍其他代码的执行。
同步的方式,在任意时刻只能执行一个请求。
文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文
文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作 导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释: cwy_init/init_123..._达梦数据库导入导出
文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js
文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6
文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输
文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...
文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure
文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割
文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答
文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。
文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入
文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf