如何搭建一个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 ...
随机推荐
- MacOs下安装Kong网关
写在前面: 持续记录一下自己在解决api网关kong上的各种问题. 1.关于Kong网关 这是官网地址:https://konghq.com/ 2.通过brew安装postgres 因为kong的数据 ...
- Inno Setup打包之先卸载再安装
使用Inno Setup打包程序之后,如果想要在安装前先卸载,那么需要加下面代码,需要注意的是红色标注的改为你们自己的.网上看到有些说_is1前面用AppName,但是我这边验证不行. [Setup] ...
- Docker简单操作(二)
1.docker容器简单操作 docker search 镜像名 #搜索镜像.如docker search nginx docker pull alpine #拉取镜像.alpine是比较小的镜像 d ...
- Excel导入异常Cannot get a text value from a numeric cell解决及poi导入时注意事项
POI操作Excel时偶尔会出现Cannot get a text value from a numeric cell的异常错误. 异常原因:Excel数据Cell有不同的类型,当我们试图从一个数字类 ...
- js 运动函数篇(二) (加速度运动、弹性运动、重力场运动(多方向+碰撞检测+重力加速度+能量损失运动)拖拽运动)层层深入
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS写加速度运动.弹性运动.重力场运 ...
- 【Linux常见命令】mv命令
mv - move (rename) files mv命令用来为文件或目录改名.或将文件或目录移入其它位置. 语法: mv [OPTION]... [-T] SOURCE DEST mv [OPTIO ...
- Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转
问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...
- TCP连接过程及报文解析
可能大家都听过TCP建立连接时需要经历三次握手和四次挥手的. 那么具体的握手挥手的过程是怎么样的呢? 这篇文章就通过WireShark抓包来了解TCP连接建立和断开的过程. 实验方法: 写一段简单的代 ...
- 【用AI开挂的人生】5岁学编程,12岁进IBM
" 跟普通孩子比起来,14岁少年Tanmay Bakshi身上有无数光环: 5岁开始对计算机感兴趣 9岁发布了第1个iOSAPP 12岁成为IBM沃森最年轻的程序员 现任IBM Watson ...
- webpack4.x开发环境配置
写这篇文章的初衷在于,虽然网络上关于webpack的教程不少,但是大多已经过时,由于webpack版本更新后许多操作变化很大,很多教程的经验已经不适合.当我们使用npm安装webpack时,若不指定w ...