首先是要确定app这边发送的http请求是什么,然后服务器怎么处理,然后返回什么数据。
请求: /wgnum 然后需要参数吗?不需要
服务器怎么处理: 由前面的数据库的讨论,我们知道,这里要返回的是正常运行的网关的号码,即wg1,wg2 .然后怎么把数据封装在json里面呢?
放在msg里,然后是我想着直接 wg1!wg2#wg3 这样分割,然后到了安卓这边直接以感叹号和井号进行分割,然后取出来。#号之前是好的,之后的就是坏的。先以#号进行分割,然后再用!号做单个分割。 嗯,这是我能想到的办法了 。 大家由想法的欢迎交流讨论。
这样,我们的准备工作就ok了。
然后先把服务器的dao层sql什么的都加上去吧,然后先用浏览器进行测试,然后再拿app进行实验。
先是mapper的xml文件的修改,然后是dao层的Java文件,然后是service层,然后是controller层。(感觉自己就是在零零星星地补洞。。)
这里由于我的工程经验不足,所以每写完dao层后需要测试一下,不然出问题就不好了。但是感觉没什么大问题,所以暂时不写测试程序。
首先是实现正常和异常的网关号码按上面的格式返回:
这里我就偷懒了,直接在usermapper写代码了,按理说一般都是一个表对应一个操作文件的,我就不搞那么麻烦了,反正就那回事。
下面是xml增加的:
<select id="selectNormal" resultType="java.lang.String">
select wgname from first_table where normal= "1"
</select>
<select id="selectUnNormal" resultType="java.lang.String">
select wgname from first_table where normal= "0"
</select>
由于不需要输入参数,或者你把0,1作为输入也许,反正我是直接把 parameterType去掉了。 然后由于返回的可能是同一字段的多个数据,但是这里 resultType还是使用string来接收。 但是注意:对应的Java文件那里使用 :List<String>来接收,不然就会报
Expected one result (or null) to be returned by selectOne(), but found: 2 这个错误
public List<String> selectNormal();
public List<String> selectUnNormal();
然后是service层,在这里我就把数据拼装好了。这里还直接在ssm目录里写了个main函数测试一下字符串的拼装。平常操作得比较少。如下
public class aa {
static List<String> name = new ArrayList<>(Arrays.asList("xxx","yyy","zzz"));
public static void main(String[] args) {
StringBuffer result=new StringBuffer();
for(String i:name){
result.append(i).append("#");
}
result.deleteCharAt(result.length()-1);
System.out.println(result);
}
}
输出: xxx#yyy#zzz
ok
然后就开始正式写service层:
public String getWg(){
StringBuffer result=new StringBuffer();
List<String> list1= userMapper.selectNormal();
for(String i:list1){
result.append(i).append("#");
}
result.deleteCharAt(result.length()-1);
result.append("!");
List<String> list2=userMapper.selectUnNormal();
for(String i:list2){
result.append(i).append("#");
}
result.deleteCharAt(result.length()-1);
return result.toString();
}
这里就拿stringbuffer来弄了,什么效率之类得就不考虑了,先搞完再说。这个是线程安全的。
然后controller层我就写得简单了。在知乎的代码区加了@就很麻烦,不得不吐槽这里的文本编辑还是不尽如人意。。。
@RequestMapping(value = "/wgnum", method = RequestMethod.GET)
@ResponseBody
@Transactional
public Msg findWg(){
System.out.println("进入查询网关"+new Date());
String wg=IUserService.getWg();
if(wg!=null){
return Msg.success().add("meg", wg);
}else {
return Msg.fail().add("meg", "查询网关失败");
}
}
最后用浏览器访问得到如下图:
![7e43296c44c92bfd105debb3585ab876.png](https://img-blog.csdnimg.cn/img_convert/7e43296c44c92bfd105debb3585ab876.png)
嗯,这样就很完美了。然后就可以去写app的界面,然后发出http请求,然后解析json数据了。
设置布局方式的时候,
![f38ce48e7d2486cfd1acdfbfda8bf10c.png](https://img-blog.csdnimg.cn/img_convert/f38ce48e7d2486cfd1acdfbfda8bf10c.png)
这个居中功能可能不行,这个时候要考虑一下前面的宽度高度的设置问题,要生效的话,得都使用match_parent。
表格布局里button不能居中,一直在左边。
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" >
这样就ok了,直接控制table得长度和宽度和gravity即可。
这里要注意由于本地的ip地址断网后会随时更改,所以每次都要记得更改安卓代码里面的ip地址喔。
第一次测试的时候忘记取出对象的msg了,结果截图如下:
![eeb38a1122d416975e1f0f43040ef189.png](https://img-blog.csdnimg.cn/img_convert/eeb38a1122d416975e1f0f43040ef189.png)
然后修改后如下所示:(中间专门放一个textView进行调试的)
![01401f4279eb81a2677b68ab1001020b.png](https://img-blog.csdnimg.cn/img_convert/01401f4279eb81a2677b68ab1001020b.png)
这样就达到我们的效果了。
代码如下:activity的
public class LoginSuccessActivity extends AppCompatActivity {
private Handler handler;
private String result = "";
private TextView logText;
private Button button1;
private Button button2;
private Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_success);
logText=findViewById(R.id.txtOne);
button1=findViewById(R.id.Button1);
button2=findViewById(R.id.Button2);
button3=findViewById(R.id.Button3);
final List<Button> buttonList=new ArrayList<>();
buttonList.add(button1);
buttonList.add(button2);
buttonList.add(button3);
new Thread(new Runnable() {
public void run() {
send(); //发送文本内容到Web服务器
Message m = handler.obtainMessage(); // 获取一个Message
handler.sendMessage(m); // 发送消息
}
}).start(); // 开启线程
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (result != null) {
Gson gson=new Gson();
Msg message=gson.fromJson(result,Msg.class);
if(message.code==100){
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
String wgmsg=message.extend.meg;
String[] allString=wgmsg.split("!");
String[] normalString=allString[0].split("#");
String[] unnormalString=allString[1].split("#");
logText.setText(result+" "+normalString.length+" "+unnormalString.length);
int i=0;
for(Button button :buttonList){
if(i<normalString.length){
button.setText(normalString[i]);
button.setBackgroundColor(Color.GREEN);
}else if(i>=normalString.length && i<normalString.length+unnormalString.length) {
button.setText(unnormalString[i-normalString.length]);
button.setBackgroundColor(Color.RED);
}else{
break;
}
i++;
}
}else{
logText.setText("error number");
}
}
super.handleMessage(msg);
}
};
}
public void send() {
String target="";
target = "http://175.10.207.22/wgnum"; //要访问的URL地址
URL url;
try {
url = new URL(target);
HttpURLConnection urlConn = (HttpURLConnection) url
.openConnection(); //创建一个HTTP连接
InputStreamReader in = new InputStreamReader(
urlConn.getInputStream()); // 获得读取的内容
BufferedReader buffer = new BufferedReader(in); // 获取输入流对象
String inputLine = null;
//通过循环逐行读取输入流中的内容
while ((inputLine = buffer.readLine()) != null) {
result += inputLine + "n";
}
in.close(); //关闭字符输入流对象
urlConn.disconnect(); //断开连接
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
xml的:这里用的表格布局
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
tools:context=".LoginSuccessActivity"
>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="buttuon1"
android:background="#FF009688"
android:id="@+id/Button1" />
</TableRow>
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<TextView
android:id="@+id/txtOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="" />
</TableRow>
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="buttuon2"
android:background="#FF009688"
android:id="@+id/Button2" />
</TableRow>
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<TextView
android:id="@+id/txtTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="" />
</TableRow>
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<Button
android:id="@+id/Button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FF009688"
android:text="buttuon3" />
</TableRow>
</TableLayout>
这里出现了一个小小的问题,记录一下,就是gson解析json数据的时候,由于这里嵌入了数据,如下,这是修改后的json类,原来是没有 public Extend extend; 属性的。然后我 String wgmsg=message.extend.meg; 调用的时候,就一直报 expected class or package 这个错误,就很尴尬,想想发现自己直接调用对象就很尴尬。。。
![21327deb01379fcc5e389ac9cac7892e.png](https://img-blog.csdnimg.cn/img_convert/21327deb01379fcc5e389ac9cac7892e.png)
然后感觉这里字符串处理比较多,如果对Java的字符串处理不太熟悉的话可能不太理解得过来。百度一下就好。
然后我们的目的就达到了。后面就是再进行http请求,然后实现终端数据的查询了。
源码: 安卓端的:
https://github.com/jackhbr/--stm32f4-/blob/master/android%20%E5%AE%A2%E6%88%B7%E7%AB%AF%20main.zipgithub.com服务器端:
https://github.com/jackhbr/--stm32f4-/blob/master/ssm%20%E6%9C%8D%E5%8A%A1%E5%99%A8main.zipgithub.com欢迎交流讨论。(写得非常菜。。自己知道。。以后慢慢补)