仿9GAG制作过程(三)

  • 有话要说
  • 成果
  • 准备
  • 搭建服务器
    • NewsBean.java
    • DatabaseUtil.java
    • NewsDAO.java
    • QueryNewsServlet.java
  • 前台获取数据并展示
  • 结束语

有话要说

这次准备讲述后台服务器的搭建以及前台访问到数据的过程。

成果

准备

  1. 安装了eclipse
  2. 安装了Tomcat7
  3. 安装了数据库管理工具: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更新到了最新的版本,所以设置了useSSLfalse,否则连接会出问题。

而且,最新的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制作过程(三)相关推荐

  1. 手工制作机器人用彩泥_印度神奇芒果干制作过程,看一遍顶三遍,游客:不会再吃了...

    印度神奇芒果干制作过程,看一遍顶三遍,游客:不会再吃了 随着我国经济迅速发展,人们生活水平得到了很大提升,物质消费得到满足以后,人们更注重精神需求,希望通过旅游要开放视野,放松心情,让自己体验不同地域 ...

  2. 简单三步 一看就会的数据可视化大屏制作过程

    今天为大家带来销售行业销售数据可视化的模板制作教程,对销售行业来说数据的展示是相当重要的,不仅因为销售数据展示的及时对销售行业能带来多少好处,同时也是为了减轻销售工作人员的压力,不用每次做数据统计时焦 ...

  3. ss570122的雕刻机制作过程

    ss570122的雕刻机制作过程1 作者注:我将以前发表过的几个有关机械和驱动电路的DIY帖子重新整理组合一下重新发表(并会适当增加电源和主轴的DIY内容),为的是方便初入雕刻机制作的网友能够方便的了 ...

  4. 电脑绣花制版-仿版的过程与注意事项

    电脑绣花制版-仿版的过程与注意事项 所谓电脑绣花实样制版,指的是客户提供已经绣作好.形成绣花成品的花样.制版人员根据实样进行二次制版的过程,这也可称之为仿作.它与彩稿制版有以下几个比较: (一)实样制 ...

  5. (转载)连连看游戏外挂详细制作过程

    标 题: [原创]新人入手第一个游戏外挂,附上详细制作过程 作 者: caigui 时 间: 2013-01-09,00:56:16 链 接: http://bbs.pediy.com/showthr ...

  6. 地图定义一个中间不动标注_高精度地图制作(三)

    高精度地图主要用于无人驾驶路径规划,还可以应用于无人驾驶定位,ROI区域过滤等.接下来我们主要来看如何制作高精度地图. 高精度地图制作流程 高精度地图的制作过程分为4个步骤: 地图采集 点云地图制作 ...

  7. 简易数字时钟软件详细制作过程

    这是我自己用VS2010制作的简易数字时钟小软件,在制作过程中收获知识不少,希望和初学MFC编程的朋友分享一下. 一.其功能有一下三点: 1.打开软件后,其程序自动获取当前电脑系统的日期.时间和周次, ...

  8. 电路制版工作笔记001---印刷电路板的制作过程

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 下面这个是比较严格的过程,四层板的制作流程: PCB 印刷电路板的制作过程 我们来看一下印刷电路板 ...

  9. 制作好的app需要服务器吗,在直播app制作过程中,服务器是如何配置的?

    不论是一对多直播还是一对一直播app制作,关于服务器的配置和成本是大多数运营商比较关心和头疼的问题.一般来说,在直播app运营的每个阶段,所安排的服务器台数和负责的功能都是不一样的.那么如何在有限的成 ...

  10. uniapp、uniCloud实现微信公众号自动查询淘宝京东优惠券制作过程

    uniapp.uniCloud实现微信公众号自动查询淘宝京东优惠券制作过程 微信公众号自动查询淘宝京东优惠券机器人制作教程.服务器通过uniapp提供的uniCloud云服务搭建,建议使用阿里云,不要 ...

最新文章

  1. 用Python建立最简单的web服务器
  2. 自适应滤波器_有源电力滤波器的使用意义和作用
  3. ModuleNotFoundError: No module named 'cv2'
  4. 如何产生cpk图形_在评估或选型SMT设备的时候,“印刷机、贴片机Cp、Cpk是什么意思...
  5. 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
  6. clover更新驱动 后不能开机_MAC 10.14 安装教程-CLOVER的简单操作说明
  7. c语言fltk图形库,FLTK编程模型
  8. Pytorch transform
  9. 智邦国际CRM系统实现企业信息化管理成功实施
  10. 基于OpenCV的土壤裂缝分割系统
  11. 大三学生HTML期末作业,网页制作作业——HTML+CSS+JavaScript饮品饮料茶(7页)
  12. 域名查询工具DMitry
  13. 在企业里管理机器学习:来自银行和医疗行业的经验
  14. 简单介绍C++中各种指令的中文意思,适合初学者
  15. 数据库系统概论第三单元基础知识(一)
  16. X210 Android wince 系统烧写流程
  17. 仿qq省市区三级联动js
  18. rman的duplicate复制数据库
  19. 了解Chatgpt key token计价或扣费说明
  20. New bing 添加候选方法(附加绕过每回合条数限制,无限制的BingChat,找回Sydney,prompt 预设管理器)

热门文章

  1. 学生图书馆系统mysql数据库设计
  2. 道士下山与黎万强的摄影展
  3. 高德地图开放平台(js免费引入)
  4. hdu2079选课时间(动态规划母函数)
  5. iOS开发之颜色渐变
  6. tp摄像头的默认地址_tplink的ip默认地址是什么?
  7. 主分区损坏diskgenius_Diskgenius硬盘分区表坏了不要紧 用软件三步就能修复
  8. word中尾注分隔符删除后还有一个回车符怎么删
  9. npoi Excel图表制作
  10. DEM、DTM、DSM、DOM的区别