回忆下需求二是什么
需求分析:
当搜索框有文本时或者文本值发生变化时,前台发送这个文本到后台,后台会查询数据库与这个文本相关信息,若查找到相关信息返回这个相关信息的标题,由于数据可能会很多,只返回十个数据,更多的数据需要用户点击提交键后才会返回更多的信息,这里还有个问题返回十个数据依据什么确定返回用户想要得到的数据,很明显依据就是访问量,用户访问的次数越多,说明用户想得到这个信息可能性很大
新增一个TopSearchKeyServlet类,在web.xml添加相应的servlet代码,我们发现当我们获取到数据后,都需要转换为json格式,在TopSearchServlet类中也需要转化为json格式,所以为了避免代码重复,把这个功能放在com.util包下,可以重复使用
JSON类
package com.util;
import java.util.List;
public class JSON {
public static String toJson(List<String> list) {
String data = "";
int count=1;
for (String str : list) {
// "1":"title1","2":"title2",
data+="\""+count+"\":\""+str+"\",";
count++;
}
data+="\"length\":"+count;
return "{"+data+"}";
}
}
TopSearchKeyServlet类
package com.servlet;
import com.service.TopSearchService;
import com.service.impl.TopSearchServiceImpl;
import com.util.JSON;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
public class TopSearchKeyServlet extends HttpServlet {
TopSearchService topSearchService=new TopSearchServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//设置跨域请求
response.setHeader("Access-Control-Allow-Origin","*");
//处理请求中文乱码
request.setCharacterEncoding("utf-8");
//处理中文乱码
response.setContentType("text/html;charset=utf-8");
//获取搜索框的文本
String key=request.getParameter("search");
//获取热搜列表
List<String> lists=topSearchService.list(key);
PrintWriter out=response.getWriter();
if (lists.size()>0) {
out.println(JSON.toJson(lists));
}
}
}
对TopSearchServlet做一个小修改
package com.servlet;
import com.service.TopSearchService;
import com.service.impl.TopSearchServiceImpl;
import com.util.JSON;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
public class TopSearchServlet extends HttpServlet {
TopSearchService topSearchService=new TopSearchServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//设置跨域请求
response.setHeader("Access-Control-Allow-Origin","*");
//处理中文乱码
response.setContentType("text/html;charset=utf-8");
//获取热搜列表
List<String> lists=topSearchService.list();
PrintWriter out=response.getWriter();
if (lists.size() > 0) {
out.println(JSON.toJson(lists));
}
}
}
接下来需要编写对数据库的操作代码
TopSearchService
package com.service;
import java.util.List;
public interface TopSearchService {
/**
* 获取热搜前10名
* @return
*/
public List<String> list();
/**
* 获取与关键字相关的信息列表访问量最多的前10条记录
* @param key
* @return
*/
List<String> list(String key);
}
TopSearchServiceImpl
package com.service.impl;
import com.service.TopSearchService;
import com.util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class TopSearchServiceImpl implements TopSearchService {
private Connection connection = null;
private Statement statement = null;
private PreparedStatement preparedStatement=null;
private ResultSet resultSet = null;
@Override
public List<String> list() {
String sql = "select top 10 ts_key from topSearch order by ts_count desc";
List<String> list = new ArrayList<>(10);
try {
connection = DBUtil.getConn();
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
list.add(resultSet.getString("ts_key"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(connection, statement, resultSet);
}
return list;
}
@Override
public List<String> list(String key) {
String sql = "select top 10 info_title from info where info_title like ? order by info_clickCount desc";
List<String> list = new ArrayList<>(10);
try {
connection = DBUtil.getConn();
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"%"+key+"%");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
list.add(resultSet.getString("info_title"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(connection, preparedStatement, resultSet);
}
return list;
}
}
后台需求二功能开发完毕,看下效果,访问http://localhost:8080/你的项目名/topSearchKey?search=的
按照访问量排序输出包含关键字"的"列表数据
(二)你今天上热搜了吗(前台篇_需求一)
(四)你今天上热搜了吗(前台篇_需求二)