如何搭建一个WEB服务器项目(五)—— Controller返回JSON字符串
从服务器获取所需数据(JSON格式)
观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟。欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验。先谢谢了( ̄▽ ̄)"!
虽然说可以利用session会话来进行传值,但是使用json字符串这么一种通用的数据格式或许更方便一点,具体做法也不困难,分步骤来看看吧!
服务器端:
首先在pom.xml里添加如下依赖:
<!--阿里FastJson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.55</version>
</dependency>
然后就可以使用了,还是以用户实体类为例,方便起见可以只保留三个属性:姓名、密码和头像,类型均为varchar(在第二期中有代码)。这里只贴出本期内容涉及到的关键部分代码,Controller的编写如下:
package dolphin.controller; import com.alibaba.fastjson.JSON;
import dolphin.entity.*;
import dolphin.service.*;
import dolphin.utils.Singleton;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;
import java.util.List; /**
* @description :数据展示控制层
* @author :郭小柒w
* @date :2020/3/26 16:02
* @version :1.0
*/
@Controller
public class ShowController {
private UserService userService = (UserService) Singleton.GetApplicationContext().getBean("UserServiceImpl");
/**
* @Description :展示全部用户信息
* @return :java.lang.String
**/
@RequestMapping("value="/showUser", produces="text/html;charset=UTF-8")
@ResponseBody
public String showUser(HttpServletRequest request){
List<UserEntity> list = userService.getAll();
String users = JSON.toJSONString(list);
return users;
}
}
其中produce=“text/html;charset=UTF-8”是为了防止出现中文乱码,注解@ResopnseBody则表明返回的是数据,不是页面。
客户端:
首先添加依赖:implementation 'com.alibaba:fastjson:1.2.55',然后编写对应XML、Fragment和Adapter代码,如下:
用户fragment的XML布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="170dp"
android:background="#fff"> <TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="用户数据适配展示"
android:textSize="25sp" /> <GridView
android:id="@+id/gv_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="1"
/> </LinearLayout>
具体的每个用户信息的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical" > <ImageView
android:id="@+id/head"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginTop="5dp"
android:src="@mipmap/ic_launcher_round"
/>
<TextView
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_toRightOf="@+id/head"
android:layout_gravity="center"
android:textColor="#000000"
android:text="姓名"
/>
<TextView
android:id="@+id/key"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_toRightOf="@+id/head"
android:layout_below="@+id/name"
android:layout_gravity="center"
android:textColor="#000000"
android:text="密码"
/> </RelativeLayout>
用户fragment:
package com.example.dolphin.user; import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView; import com.alibaba.fastjson.JSON;
import com.bumptech.glide.Glide;
import com.example.dolphin.R;
import com.example.dolphin.base.BaseFragment;
import com.example.dolphin.bean.Product;
import com.example.dolphin.bean.User;
import com.example.dolphin.home.HomeFragmentAdapter;
import com.example.dolphin.utils.Constants;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback; import java.util.List; import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import okhttp3.Call; /**
* 用户Fragment
*/
public class UserFragment extends BaseFragment { private final static String TAG = UserFragment.class.getSimpleName();
private List<User> users;
private GridView gv; @Override
public View initView() {
Log.e(TAG,"用户页面的Fragment的UI被初始化了");
View view = View.inflate(mContext, R.layout.fragment_user,null);
gv = (GridView)view.findViewById(R.id.gv_user);
return view;
} @Override
public void initData() {
super.initData();
Log.e(TAG,"用户页面的Fragment的数据被初始化了");
new Thread(()->getDataFromNet()).start();
} private void getDataFromNet() {
//请求服务器端的数据接口
String url = Constants.BASE_URL + "/showUser";
OkHttpUtils
.get()
.url(url)
.build()
.execute(new StringCallback()
{ /**
* 请求失败的时候回调
* @param call
* @param e
* @param id
*/
@Override
public void onError(Call call, Exception e, int id) {
Log.e(TAG,"首页请求失败=="+e.getMessage());
} /**
* 当请求成功的时候回调
* @param response 请求成功数据
* @param id
*/
@Override
public void onResponse(String response, int id) {
Log.e(TAG,"首页请求成功=="+response);
//解析数据
processData(response);
}
});
} private void processData(String json) {
//使用FastJson去解析Json数据,将json字符串转换成一个UserBean对象
users = JSON.parseArray(json, User.class);
//设置对应的数据适配器
UserFragmentAdapter adapter = new UserFragmentAdapter(mContext, users);
gv.setAdapter(adapter);
}
}
fragment对应的数据适配器:
package com.example.dolphin.user; import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import com.bumptech.glide.Glide;
import com.example.dolphin.R;
import com.example.dolphin.bean.User;
import com.example.dolphin.utils.Constants; import java.util.List; /**
* @author :created by 郭小柒w
* 时间 2020/5/8 19
*/
class UserFragmentAdapter extends BaseAdapter { private List<User> users;
private Context mContext; public UserFragmentAdapter(Context mContext, List<User> list) {
this.mContext = mContext;
this.users = list;
} @Override
public int getCount() {
return users.size();
} @Override
public Object getItem(int position) {
return null;
} @Override
public long getItemId(int position) {
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null){
convertView = View.inflate(mContext, R.layout.item_user,null);
viewHolder = new ViewHolder();
viewHolder.head = (ImageView) convertView.findViewById(R.id.head);
viewHolder.name = (TextView) convertView.findViewById(R.id.name);
viewHolder.key = (TextView) convertView.findViewById(R.id.key);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
//根据位置得到相对应的数据
User user = users.get(position);
//设置头像
Glide.with(mContext).load(Constants.HEAD_URL + user.getHeadImage()).error(R.mipmap.ic_launcher_round).into(viewHolder.head);
//设置姓名
viewHolder.name.setText("姓名:"+user.getUserName());
//设置密码
viewHolder.key.setText("密码:"+user.getUserKey());
return convertView;
} static class ViewHolder{
private TextView name;
private TextView key;
private ImageView head;
}
}
好了,我们来看一看最终效果如何:
网页上访问的效果如下,已经变成了JSON字符串:

客户端的效果如下,字符串被正确解析并赋值给对应控件:

方便起见,我还是把用到的头像图片贴在这里,有需要的可以直接取走(我也算个伪V家粉吧,差一张公主殿下的就不贴了~( ̄▽ ̄)~*):

—————————————我———是———分———割———线————————————
我是一名(合格的鸽子)周更博主!
今天差那么一丢丢就断更了(终于赶上了),跟同学出去聚餐回来真是颓废,什么都不想干
如何搭建一个WEB服务器项目(五)—— Controller返回JSON字符串的更多相关文章
- 如何搭建一个WEB服务器项目(二)—— 对数据库表进行基本的增删改查操作
使用HibernateTemplate进行增删改查操作 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出 ...
- 如何搭建一个WEB服务器项目(三)—— 实现安卓端联网登录
安卓端调用服务器登录函数进行验证登录 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验 ...
- 如何搭建一个WEB服务器项目(四)—— 实现安卓端图片加载
使用Glide安卓图片加载库 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...
- 如何搭建一个WEB服务器项目(六)—— 上传图片至服务器
上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...
- 如何搭建一个WEB服务器项目(一)—— 开篇 ,搭建SSH整合框架
使用Intellij IDEA2019创建SSH(Spring+SpringMVC+Hibernate+Maven整合)项目 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解, ...
- 搭建一个Web API项目(DDD)
传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...
- django uWSGI nginx搭建一个web服务器 确定可用
网上的找了很多篇 不知道为什么不行,于是自己搭建了一个可用的Web 大家可按步骤尝试 总结下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: .确保有一个能够用runserver ...
- express搭建一个web服务器
npm install express -g express这个库可以使用了. npm install express-generator -g ...
- Go搭建一个Web服务器
package main import ( "fmt" "net/http" "strings" "log" ) fun ...
随机推荐
- LeetCode 面试题56 - I. 数组中数字出现的次数 | Python
面试题56 - I. 数组中数字出现的次数 题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). ...
- 2019-2020-1 20199308《Linux内核原理与分析》第一周作业
Linux 基础入门(新版)学习笔记 实验二 基本概念及操作 重要快捷键 Tab 补全命令 Ctrl+c 强行终止当前命令 历史命令 方向上键↑,恢复之前输入过的命令 通配符 在命令行中获取帮助 某个 ...
- 文件上传漏洞(pikachu)
文件上传漏洞 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像,附件等等.当用户点击上传按钮后,后台会对上传的文件进行判断,比如是否是指定的类型.后缀名.大小等等,然后将其按照设 ...
- Scala教程之:静态类型
文章目录 泛类型 型变 协变 逆变 不变 类型上界 类型下界 内部类 抽象类型 复合类型 自类型 隐式参数 隐式转换 多态方法 类型推断 Scala是静态类型的,它拥有一个强大的类型系统,静态地强制以 ...
- 数据开源工具:Hadoop为企业带来什么?
熟悉大数据的人一定不会对大名鼎鼎的Hadoop工具陌生,Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.Hadoop的框架最核 ...
- memcached 原子性操作 CAS模式
2019独角兽企业重金招聘Python工程师标准>>> 应用场景分析: 如原来MEMCACHED中的KES的内容为A,客户端C1和客户端C2都把A取了出来,C1往准备往其中加B,C2 ...
- Muduo网络库实战(二):实现服务器与客户端的连接
1. 方案的确定 1)基本需求 用户1000+, IO压力不大: 多个客户端打开网站,输入查询字符串strclient,发送给服务器=>服务器接收客户端发过来的数据并处理,将结果返回给客户端: ...
- 实战-MySQL定时增量备份(2)
概要 引言 增量备份 恢复增量备份 定时备份 引言 在产品上线之后,我们的数据是相当重要的,容不得半点闪失,应该做好万全的准备,搞不好哪一天被黑客入侵或者恶意删除,那就 gg 了.所以要对我们的线上数 ...
- HR问了一句DB是啥?SQL是啥?DB是Database数据库,SQL是数据库语言! 然后呢? 数据库从入门到精通--入门必看!
写在前面 本文的写作知识体系来源于我的数据库老师SDAU张承明,部分知识来自于网络,我呢对知识进行了细化和添加了自己的一些看法,并且加入了一些实例帮助理解,本文不是面向SQL高手写的,可以看作是数据库 ...
- CF1324D Pair of Topics
好像题解里都是树状数组(起码我翻到的是 说一种cdq分治的(这应该算是cdq分治了 用cdq比较简单,所以可以作为一个练手题 cdq分治其实是一种模糊的思想,处理\([l,r]\)区间内,有多少\(( ...