首页 > 其他分享 >ajax实现搜索联想补全

ajax实现搜索联想补全

时间:2023-05-31 15:07:20浏览次数:34  
标签:insert 补全 联想 content ajax 搜索

1. 什么是搜索联想?自动补全?  40

  - 百度是一个很典型的代表。在百度的搜索框中输入相关信息的时候,会有搜索联想以及自动补全。

  - 搜索联想和自动补全:实际上是为了方便用户的使用。让用户的体验更好。

  - 搜索联想:当用户输入一些单词之后,自动联想出用户要搜索的信息,给一个提示。

  - 自动补全:当联想出一些内容之后,用户点击某个联想的单词,然后将这个单词自动补全到搜索框当中。

  - 搜索联想和自动补全功能,因为是页面局部刷新效果,所以需要使用ajax请求来完成。

1.1 搜索联想,自动补全功能的核心实现原理?  40

  - 当键盘事件发生之后,比如:keyup:键弹起事件。

  - 发送ajax请求,请求中提交用户输入的搜索内容,例如:北京(发送ajax请求,携带“北京”两个字)

  - 后端接收到ajax请求,接收到“北京”两个字,执行select语句进行模糊查询。返回查询结果。

  - 将查询结果封装成json格式的字符串,将json格式的字符串响应到前端。

  - 前端接收到json格式的字符串之后,解析这个json字符串,动态展示页面。

2. 代码   41-45

ajax实现搜索联想补全_java

代码在com.bjpowernode.javaweb.servlet

QueryServlet

package com.bjpowernode.javaweb.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.sql.*;
//ajax实现搜索联想自动补全  44

@WebServlet("/query")
public class QueryServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取用户输入的关键字
        String keywords = request.getParameter("keywords");
        // jdbc代码连接数据库,根据关键字查询数据库,返回数据,拼接json格式的字符串
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        //品川用的
        StringBuilder sb = new StringBuilder();
        sb.append("[");

        try {
            // 注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 获取连接
            String url = "jdbc:mysql://localhost:3306/bjpowernode?useUnicode=true&characterEncoding=UTF-8";
            String user = "root";
            String password = "lzl";
            conn = DriverManager.getConnection(url, user, password);
            // like 模糊查询的时候,条件不建议使用%开始,因为会让字段上的索引失效,查询效率降低。
            String sql = "select content from t_ajax where content like ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,keywords+"%");
            rs = ps.executeQuery();

            // [{"content":"javascript"},{"content":"javaweb"},{"content":"java..."}]

            while (rs.next()){
                String content = rs.getString("content");
                sb.append("{\"content\":\""+content+"\"},");
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        //直接响应
        response.setContentType("text/html;charset=UTF-8");
        //sb.substring(0,sb.length()-1)+"]"这是截取最后的逗号
        response.getWriter().print(sb.substring(0,sb.length()-1)+"]");

    }
}

E:\java学习\Ajax\course\course12\web

autocomplete.html

<!--ajax实现搜索联想自动补全  41-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax实现搜索联想自动补全</title>
<!--    这是一个类选择器 我们见文本框变大一点  41-->
    <style>
        .userInput{ /*给文本框设置一些格式*/
            width: 300px;
            height: 25px;
            font-size: 20px;/*设置字体大小*/
            padding-left: 5px;/*这个标签可以设置文本框中的字和左边框的距离*/
        }

        .showDataDiv{ /*给联想出来的选项的区域设置一些格式*/
            width: 307px;
            border: 1px solid lightgray; /*设置灰色边框*/
            background-color: antiquewhite; /*设置背景色*/
            display: none; /*隐藏div*/
        }

        .showDataDiv p{  /*给联想出来的选项设置一些格式*/
            padding-left: 5px; /*设置字和左边框的距离*/
            margin-top: 2px; /*设置字举例顶部的举例*/
            margin-bottom: 2px;  /*设置字举例低部的举例*/
        }

        .showDataDiv p:hover{ /*给联想出来的选项设置一些动作*/
            cursor: pointer; /*设置当选中时变成小手*/
            border: 1px blue solid; /*设置蓝色边框*/
            background-color: aliceblue; /*设置背景色*/
        }
    </style>


</head>
<body>

<script type="text/javascript">
    window.onload = ()=>{
        document.getElementById("keywords").onkeyup = function (){

            if (this.value==""){
                document.getElementById("datadiv").style.display = "none"
            }else{
                //发送ajax请求   43
                //创建ajax对象
                const xmlHttpRequest = new XMLHttpRequest();
                //注册回调函数
                xmlHttpRequest.onreadystatechange=()=>{
                    if (xmlHttpRequest.readyState==4){
                        if (xmlHttpRequest.status>=200 && xmlHttpRequest.status<300){
                            //返回的json肯定是个数组
                            // [{"content":"javascript"},{"content":"javaweb"},{"content":"java..."}]
                            const json = JSON.parse(xmlHttpRequest.responseText);
                            //遍历数组
                            let html = ""
                            for (let i = 0;i<json.length;i++){
                                html +="<p onclick='setInput(\""+json[i].content+"\")'>"+json[i].content+"</p>"
                            }
                            document.getElementById("datadiv").innerHTML = html
                            //把div显示出来
                            document.getElementById("datadiv").style.display = "block"
                        }
                    }
                }
                //开启通道
                xmlHttpRequest.open("GET","/ajax-autocomplete/query?_="+new Date().getTime()+"&keywords="+this.value,true)
                //发送请求
                xmlHttpRequest.send()
            }

        }
    }

    //自动补全  45
    function setInput(content){
        document.getElementById("keywords").value = content
        document.getElementById("datadiv").style.display = "none"
    }

</script>

<input type="text" class="userInput" id="keywords">
<div id="datadiv" class="showDataDiv">
    <!--<p>北京疫情最新情况</p>
    <p>北京天气</p>
    <p>北京时间</p>
    <p>北京人</p>-->
</div>

</body>
</html>

注意我们的数据库文件在E:\autocomplete.sql  42

drop table if exists t_ajax;
create table t_ajax(
    id int primary key auto_increment,
    content varchar(255)
);
insert into t_ajax(content) values('javascript');
insert into t_ajax(content) values('javaweb');
insert into t_ajax(content) values('java');
insert into t_ajax(content) values('java123');
insert into t_ajax(content) values('mysql');
insert into t_ajax(content) values('myweb');
insert into t_ajax(content) values('myapp');
insert into t_ajax(content) values('jdk');
commit;
select * from t_ajax;

标签:insert,补全,联想,content,ajax,搜索
From: https://blog.51cto.com/u_15784725/6386863

相关文章

  • ajax实现省市联动动态展示省份
    1. 什么是省市联动?  30  - 在网页上,选择对应的省份之后,动态的关联出该省份对应的市。选择对应的市之后,动态的关联出该市对应的区。(首先要清楚需求)- 进行数据库表的设计t_area(区域表)id(PK-自增) code name pcode--------------------------------------------......
  • 将ajax请求封装到jQuery库当中
    1. 手动把ajax封装到js库  28代码在com.bjpowernode.ajax.servletAjaxRequest10Servletpackagecom.bjpowernode.ajax.servlet;importjakarta.servlet.ServletException;importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.HttpServlet;importja......
  • 联想X 3650 M5备机替换操作手册
    原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。邮箱:[email protected]生产环境中经常会遇到服务器硬件故障,此时由于各种现实问题如没有相关替换件等原因导致业务长时间。针对这种情况则需要在现场准备一台备机,遇到无修复的硬件问题时可以代替顶替生产服务器......
  • 简单商品后台管理系统-应用MVC和AJAX,使用Bootstrap
    一个商品后台管理系统-应用了MVC三层设计模式以及AJAX技术,使用Bootstrap模板;是我用于练习Ajax的增删改查写的一个小系统,很简易,但是有助于理解mvc设计模式,并且简单条理清晰使得它是一个好的练习项目;效果展示: 代码部分:index.html<html><head><title>管理系统</titl......
  • Eplices 的自动补全烦恼
    例如:你本想定义StringName;但是在你打出name会自动补全下拉表单的第一个变成NameString;意味着你还需要移动光标或者删除; 解决办法:打开window》preference》JAVA>Editor》ContentAssist>Disableinsertiontriggersexcept'Enter'......
  • ajax乱码问题和异步同步问题
    1. 测试内容: 201.1 发送ajax get请求    发送数据到服务器,服务器获取的数据是否乱码?    - 服务器响应给前端的中文,会不会乱码?1.2 发送ajax post请求    - 发送数据到服务器,服务器获取的数据是否乱码?    - 服务器响应给前端的中文,会不会乱码?1.3 包括还要......
  • ajax技术学习
    ajax处理异步请求,刷新部分网页,不会将整个页面重新加载,左侧文本框输入数据,输入完成后实时显示在同业页面另一侧就用到了这个技术<scripttype="text/javascript">$(function(){//绑定键盘输入事件$('input').keyup(function(){//构造参数......
  • Django——AJAX
    AJAX(AsynchronousJavascriptAndXML)翻译成中文就是“异步的Javascript和XML”。AJAX不是新的编程语言,而是一种使用现有标准的新方法。使用Javascript语言与服务器进行异步交互的,并进行局部刷新。传输的数据为XML(当然,传输的数据不只是XML)AJAX最大的优点是在不重新加载整个......
  • 黑马AJAX part1 (未完)
    1.客户端与服务器服务器:上网过程中,负责存放和对外提供资源的电脑。(性能很高的电脑。)客户端:在因特网中,负责获取和消费资源的电脑。个人电脑中,可以通过浏览器访问服务器对外提供的各种资源。2.URL地址URL(UniformResourceLocator):统一资源定位符。用于标识互联网上每个资源的......
  • form+iframe 实现ajax文件上传
    在做文件上传时除了传入文件外,还有附件参数,并且要求不刷新页面,之前是表单提交的方式,现在修改成ajax上传的方式,由于没有选择用插件,所以用form+iframe的方式,并且这种方式对IE8以上及主流浏览器都支持。1、首先写一个iframe<iframename="myiframe"style="display:none;"onload=......