仿9GAG制作过程(三)
仿9GAG制作过程(三)
- 有话要说
- 成果
- 准备
- 搭建服务器
- NewsBean.java
- DatabaseUtil.java
- NewsDAO.java
- QueryNewsServlet.java
- 前台获取数据并展示
- 结束语
有话要说
这次准备讲述后台服务器的搭建以及前台访问到数据的过程。
成果
准备
- 安装了
eclipse
- 安装了
Tomcat7
- 安装了数据库管理工具:
Navicat
搭建服务器
用eclipse
直接创建一个web
工程,并将运行环境设置为Tomcat7
接着定义了四个类来实现了一个简单的接口(通过servlet
的方式),下面来看看这四个类
NewsBean.java
package com.lanxingren.bean;import java.util.List;public class NewsBean {//段子标识private int id;//段子文本private String title;//段子包含的图片链接private List<String> urls;//段子点赞数private int like;//段子点踩数private int unlike;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public List<String> getUrls() {return urls;}public void setUrls(List<String> urls) {this.urls = urls;}public int getLike() {return like;}public void setLike(int like) {this.like = like;}public int getUnlike() {return unlike;}public void setUnlike(int unlike) {this.unlike = unlike;}@Overridepublic String toString() {return "NewsBean [id=" + id + ", title=" + title + ", urls=" + urls + ", like=" + like + ", unlike=" + unlike+ "]";}}
该类是段子类的一个bean
类,各个属性代表的意思在代码里已经说清楚了。
DatabaseUtil.java
package com.lanxingren.util;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class DatabaseUtil {private static String url = "jdbc:mysql://localhost:3306/imitating9gag?serverTimezone=GMT%2B8&useSSL=false";private static String user = "root";private static String password = "root";private static Connection conn;//获取数据库连接public static Connection getConnection() {try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return conn;}//关闭数据库连接public static void close (Connection conn, PreparedStatement ps) {try {if (ps != null) {ps.close();}if (conn != null) {conn.close();}} catch (Exception e) {e.printStackTrace();}}//关闭数据库连接public static void close (Connection conn, PreparedStatement ps, ResultSet rs) {try {if (rs != null) {rs.close();}if (ps != null) {ps.close();}if (conn != null) {conn.close();}} catch (Exception e) {e.printStackTrace();}}}
该类是一个工具类,主要用来创建数据库连接以及关闭数据库连接。
其中,由于MySQL
更新到了最新的版本,所以设置了useSSL
为false
,否则连接会出问题。
而且,最新的MySQL
其实并不需要通过Class.forName
来加载驱动了。
NewsDAO.java
package com.lanxingren.dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.lanxingren.bean.NewsBean;
import com.lanxingren.util.DatabaseUtil;public class NewsDAO {//page是页数,pageSize是每页条数public List<NewsBean> queryNewsByPage (int page, int pageSize) {List<NewsBean> newsList = new ArrayList<NewsBean>();Connection conn = DatabaseUtil.getConnection();String sql = "select * from news order by id desc limit " + (page - 1)*pageSize + ", " + pageSize;PreparedStatement pstmt = null;try {pstmt = (PreparedStatement)conn.prepareStatement(sql);ResultSet rs = pstmt.executeQuery();while (rs.next()) {NewsBean nb = new NewsBean();nb.setId(rs.getInt("id"));nb.setTitle(rs.getString("title"));nb.setLike(rs.getInt("like"));nb.setUnlike(rs.getInt("unlike"));newsList.add(nb);}} catch (SQLException e) {e.printStackTrace();}finally {DatabaseUtil.close(conn, pstmt);}return newsList;}// 根据段子id获取段子所包含的图片public List<String> queryUrlsByNewsId (int newsId) {List<String> urls = new ArrayList<String>();Connection conn = DatabaseUtil.getConnection();String sql = "select url from news_pics where newsid = " + newsId;PreparedStatement pstmt = null;try {pstmt = conn.prepareStatement(sql);ResultSet rs = pstmt.executeQuery();while (rs.next()) {urls.add(rs.getString("url"));}} catch (Exception e) {e.printStackTrace();}finally {DatabaseUtil.close(conn, pstmt);}return urls;}}
该类定义了两个方法,分别为获取段子信息的方法和获取图片的方法。
其中sql
用了倒序是为了让段子按照时间流的顺序在前台展示。
QueryNewsServlet.java
package com.lanxingren.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.google.gson.Gson;
import com.lanxingren.bean.NewsBean;
import com.lanxingren.dao.NewsDAO;@WebServlet("/QueryNewsServlet")
public class QueryNewsServlet extends HttpServlet {private static final long serialVersionUID = 1L;int pageSize = 5;public QueryNewsServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/json; charset=utf-8");PrintWriter out = response.getWriter();String page = request.getParameter("page");List<NewsBean> newsList = new ArrayList<NewsBean>();List<NewsBean> realList = new ArrayList<NewsBean>();NewsDAO dao = new NewsDAO();String news = "";if (page != null) {newsList = dao.queryNewsByPage(Integer.parseInt(page), pageSize);}if (newsList != null && newsList.size() > 0) {for (NewsBean nb : newsList) {List<String> urls = dao.queryUrlsByNewsId(nb.getId());if (urls != null && urls.size() > 0) {nb.setUrls(urls);realList.add(nb);}}}Gson gson = new Gson();news = gson.toJson(realList);out.print(news);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
通过注解的方式来设置servlet
的地址,并将数据转化成json
输出。
通过以上的方式,就完成了后台查询段子接口的开发,并且可通过page
参数来获取第page
页的信息,接口URL为:http://localhost:8080/Imitating9GAG/QueryNewsServlet?page=2
接着,将项目在Tomcat
下启动后台服务器就正式搭建完成了,通过该URL获取的数据见下图:
前台获取数据并展示
public List<NewsBean> newsBeans = new ArrayList<NewsBean>();// 段子集合
private String baseUrl = "http://192.168.10.14:8080/Imitating9GAG/QueryNewsServlet?page=";
new Thread(new Runnable() {@Overridepublic void run() {String url = baseUrl + (currentPage);OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(url).build();try {Response response = client.newCall(request).execute();String json = response.body().string();if (json != null) {Gson gson = new Gson();newsBeans.addAll(0, (List<NewsBean>)gson.fromJson(json, new TypeToken<List<NewsBean>>(){}.getType()));}Message message = new Message();message.what = QUERY_NEWS;handler.sendMessage(message);} catch (IOException e) {e.printStackTrace();}}
}).start();
由于请求网络是一个耗时操作,因此放进了子线程中。在子线程中请求网络并将返回的数据放入段子集合中。
Handler
如下:
// 请求网络结束后的更新View
private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case QUERY_NEWS:recyclerView.getAdapter().notifyDataSetChanged();break;case UPDATE_NEWS:recyclerView.getAdapter().notifyDataSetChanged();swipeRefreshLayout.setRefreshing(false);break;case LOAD_MORE:((NewsAdapter)recyclerView.getAdapter()).changeStatus(NewsAdapter.UNLOADING);currentState = NewsAdapter.UNLOADING;break;}}
};
结束语
这样,获取数据+后台服务器搭建+前台页面展示的过程整个就已经完整了。
下一篇准备讲述官方自带的SwipeRefreshLayout
刷新控件。
由于该控件没有上拉加载功能,于是就在RecyclerView
中实现了上拉加载功能。
仿9GAG制作过程(三)相关推荐
- 手工制作机器人用彩泥_印度神奇芒果干制作过程,看一遍顶三遍,游客:不会再吃了...
印度神奇芒果干制作过程,看一遍顶三遍,游客:不会再吃了 随着我国经济迅速发展,人们生活水平得到了很大提升,物质消费得到满足以后,人们更注重精神需求,希望通过旅游要开放视野,放松心情,让自己体验不同地域 ...
- 简单三步 一看就会的数据可视化大屏制作过程
今天为大家带来销售行业销售数据可视化的模板制作教程,对销售行业来说数据的展示是相当重要的,不仅因为销售数据展示的及时对销售行业能带来多少好处,同时也是为了减轻销售工作人员的压力,不用每次做数据统计时焦 ...
- ss570122的雕刻机制作过程
ss570122的雕刻机制作过程1 作者注:我将以前发表过的几个有关机械和驱动电路的DIY帖子重新整理组合一下重新发表(并会适当增加电源和主轴的DIY内容),为的是方便初入雕刻机制作的网友能够方便的了 ...
- 电脑绣花制版-仿版的过程与注意事项
电脑绣花制版-仿版的过程与注意事项 所谓电脑绣花实样制版,指的是客户提供已经绣作好.形成绣花成品的花样.制版人员根据实样进行二次制版的过程,这也可称之为仿作.它与彩稿制版有以下几个比较: (一)实样制 ...
- (转载)连连看游戏外挂详细制作过程
标 题: [原创]新人入手第一个游戏外挂,附上详细制作过程 作 者: caigui 时 间: 2013-01-09,00:56:16 链 接: http://bbs.pediy.com/showthr ...
- 地图定义一个中间不动标注_高精度地图制作(三)
高精度地图主要用于无人驾驶路径规划,还可以应用于无人驾驶定位,ROI区域过滤等.接下来我们主要来看如何制作高精度地图. 高精度地图制作流程 高精度地图的制作过程分为4个步骤: 地图采集 点云地图制作 ...
- 简易数字时钟软件详细制作过程
这是我自己用VS2010制作的简易数字时钟小软件,在制作过程中收获知识不少,希望和初学MFC编程的朋友分享一下. 一.其功能有一下三点: 1.打开软件后,其程序自动获取当前电脑系统的日期.时间和周次, ...
- 电路制版工作笔记001---印刷电路板的制作过程
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 下面这个是比较严格的过程,四层板的制作流程: PCB 印刷电路板的制作过程 我们来看一下印刷电路板 ...
- 制作好的app需要服务器吗,在直播app制作过程中,服务器是如何配置的?
不论是一对多直播还是一对一直播app制作,关于服务器的配置和成本是大多数运营商比较关心和头疼的问题.一般来说,在直播app运营的每个阶段,所安排的服务器台数和负责的功能都是不一样的.那么如何在有限的成 ...
- uniapp、uniCloud实现微信公众号自动查询淘宝京东优惠券制作过程
uniapp.uniCloud实现微信公众号自动查询淘宝京东优惠券制作过程 微信公众号自动查询淘宝京东优惠券机器人制作教程.服务器通过uniapp提供的uniCloud云服务搭建,建议使用阿里云,不要 ...
最新文章
- 用Python建立最简单的web服务器
- 自适应滤波器_有源电力滤波器的使用意义和作用
- ModuleNotFoundError: No module named 'cv2'
- 如何产生cpk图形_在评估或选型SMT设备的时候,“印刷机、贴片机Cp、Cpk是什么意思...
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
- clover更新驱动 后不能开机_MAC 10.14 安装教程-CLOVER的简单操作说明
- c语言fltk图形库,FLTK编程模型
- Pytorch transform
- 智邦国际CRM系统实现企业信息化管理成功实施
- 基于OpenCV的土壤裂缝分割系统
- 大三学生HTML期末作业,网页制作作业——HTML+CSS+JavaScript饮品饮料茶(7页)
- 域名查询工具DMitry
- 在企业里管理机器学习:来自银行和医疗行业的经验
- 简单介绍C++中各种指令的中文意思,适合初学者
- 数据库系统概论第三单元基础知识(一)
- X210 Android wince 系统烧写流程
- 仿qq省市区三级联动js
- rman的duplicate复制数据库
- 了解Chatgpt key token计价或扣费说明
- New bing 添加候选方法(附加绕过每回合条数限制,无限制的BingChat,找回Sydney,prompt 预设管理器)