服务器怎么让APP用户后台访问一个网页,然后获取信息,再传到服务器
这个问题的关键不在服务器,而是在app的设计。服务器通知app好办,越好一个数据标志即可,app发现服务器传来这个标记,就在app内嵌入一个浏览器,或者直接请求这个这个网页,这个网页本来就是你服务器上的,你也就拉到你要的数据了。
一:基于Http协议获取数据方法。二:基于SAOP协议获取数据方法,
这篇文章主要是将关于使用Http协议获取服务器端数据,这里我们采取的服务器端技术为java,框架为Struts2,或者可以有Servlet,又或者可直接从JSP页面中获取数据。
那么,接下来我们便开始这一路程:
首先:编写服务器端方法,我这里采用的MVC框架是Struts2,目的很单纯,就是为了以后做个完整的商业项目,技术配备为:android+SSH。当然,篇幅有限,我这里就直接用Strtus2而已。
服务器端:新建WebProject ,选择Java ee 50
为了给项目添加Struts2的支持,我们必须导入Struts2的一些类库,如下即可(有些jar包是不必的,但是我们后来扩展可能是要使用到的,就先弄进去):
1: xwork-core-2211jar
2: struts2-core-2211jar
3: commons-logging-104jar
4: freemarker-2316jar
5: ognl-30jar
6: javassist-37gajar
7:commons-ileuploadjar
8:commons-iojar
9:json-lib-21-jdk15jar 处理JSON格式数据要使用到
10:struts2-json-plugin-2211jar 基于struts2的json插件
以上的jar包,需要放在WebRoot/WEB-INF/lib目录下
然后在webxml文件中敲下:
View Code
<xml version="10" encoding="UTF-8">
<web-app version="25"
xmlns="http://javasuncom/xml/ns/javaee"
xmlns:xsi="http://wwww3org/2001/XMLSchema-instance"
xsi:schemaLocation="http://javasuncom/xml/ns/javaee
http://javasuncom/xml/ns/javaee/web-app_2_5xsd">
<!-- 定义Struts2的核心控制器:FilterDispatcher -->
<filter>
<!-- 定义核心Filter的名称 -->
<filter-name>struts2</filter-name>
<!-- 定义Filter的实现类 -->
<filter-class>orgapachestruts2dispatcherFilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>indexjsp</welcome-file>
</welcome-file-list>
</web-app>
然后编写strutsxml文件,并放在WebRoot/WEB-INF/lib目录下:如下代码:
View Code
<xml version="10" encoding="UTF-8">
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 20//EN"
"http://strutsapacheorg/dtds/struts-20dtd">
<struts>
<!-- setting encoding,DynamicMethod,language
<constant name="strutscustomi18nresources" value="messageResource"></constant>
-->
<constant name="strutsi18nencoding" value="UTF-8"></constant>
<constant name="strutsenableDynamicMethodInvocation" value="true"></constant>
<!-- add package here extends="struts-default"-->
<package name="dongzi" extends="json-default"> <!--需要将struts-default改为json-default-->
<!-- setting action -->
<action name="login" class="comdongziactionloginAction" method="login">
<result type="json"></result> <!--返回值类型设置为json,不设置返回页面-->
</action>
</package>
</struts>
配置好后,我们再根据<action>标签内容来编写action。方法为method对应的login,类名为loginAction,
注意:包继承为:json-default ,输出结果类型为json
如下:
View Code
public class loginAction extends ActionSupport implements
ServletRequestAware,ServletResponseAware {
/
/
private static final long serialVersionUID = 1L;
HttpServletRequest request;
HttpServletResponse response;
public void setServletRequest(HttpServletRequest request) {
thisrequest=request;
}
public void setServletResponse(HttpServletResponse response) {
thisresponse=response;
}
public void login(){
try {
//HttpServletRequest request =ServletActionContextgetRequest();
// HttpServletResponse response=ServletActionContextgetResponse();
thisresponsesetContentType("text/html;charset=utf-8");
thisresponsesetCharacterEncoding("UTF-8");
if(thisrequestgetParameter("username")equals("123456")){
thisresponsegetWriter()write("真的很奇怪,日本人!");
}else if(thisrequestgetParameter("username")equals("zhd")){
thisresponsegetWriter()write("没有错,我就是东子哥!");
}else{
thisresponsegetWriter()write("我就是东子哥!");
}
//将要返回的实体对象进行json处理
// JSONObject json=JSONObjectfromObject(thisgetUsername());
//输出格式如:{"id":1, "username":"zhangsan", "pwd":"123"}
// Systemoutprintln(json);
// thisresponsegetWriter()write(jsontoString());
/
JSONObject json=new JSONObject();
jsonput("login", "login");
responsesetContentType("text/html;charset=utf-8");
Systemoutprintln(json);
byte[] jsonBytes = jsontoString()getBytes("utf-8");
responsesetContentLength(jsonByteslength);
responsegetOutputStream()write(jsonBytes);
/
/
JSONObject json=new JSONObject();
jsonput("login", "login");
byte[] jsonBytes = jsontoString()getBytes("utf-8");
responsesetContentType("text/html;charset=utf-8");
responsesetContentLength(jsonByteslength);
responsegetOutputStream()write(jsonBytes);
responsegetOutputStream()flush();
responsegetOutputStream()close();
/
} catch (Exception e) {
eprintStackTrace();
}
// return null;
}
}
网络连接问题、版本不匹配。
1、网络连接问题:如果网络连接不稳定或者信号弱,会导致爱南宁app下载无法正常获取数据。
2、版本不匹配:如果使用的是旧版本的爱南宁app,会存在与服务器不兼容的情况,导致数据获取失败。
软件获取数据失败首先查验软件权限是否有关键项被禁,比如获取位置信息,访问储存位置及应用信息,虽然这些都是敏感信息,但是这些软件都会要求获取你的这些信息,再有就是软件服务器出现问题,软件无法访问系统数据,造成软件无法打开和使用。
1
全屏加载
全屏加载也叫白屏加载,就是整个屏幕白屏进行数据加载,一般会有菊花转或进度条配合,常用于手机网页的加载中,例如列表页进入详情页,详情等。(可考虑融入趣味性较强的小动画,增强愉悦感,从用户心理上去缩短等待时间。
优点:能保证内容的整体性,全部加载完才能够系统化的阅读。
缺点:有非常强烈的等待感,3s以上会产生焦躁情绪,所以在地铁等信号 不好的地方,使用手机网 页获取内容实在是比较灾难的一件事情。
2分布加载
分布加载就是分步骤的加载网页,优先加载占网络资源较小的元素,包括优先加载,懒加载,预加载,渐进加载。
a优先加载
如果一个页面有有文字,可以先把文字都加载出来,保证用户可以有内容可读,然后再加载比较费流量的。但是活动页什么的,千万不能把重要信息全部放在上,导致加载不出来。这种加载形式更加适用于内容阅读型的APP。
懒加载主要是针对前端页面比较大而设计出来的一种方式,假如一个网页很大,又含有很多、视频内容,那么想一次性加载就会等待很久,懒加载就是只有在屏幕显示范围内的资源,被用户看到的内容才会真正去加载。
预加载就是提前加载,比如启动APP时,当显示启动画面时,就可以预先把首页内容加载出来,这样可以减少用户加载内容时的等待时间,还有一个很典型的使用场景就是浏览视频网站或者购物网站,当我们快要滑到页面底部时,下面已经几乎加载完成了,这就是预加载的好处,在使用上感觉更加流畅。
渐进加载
在 PC 端用浏览器看的时候,经常是先看到一张模糊图,然后再渐渐的变得清晰,这种效果就叫做渐进式加载。
优点:可以帮助用户快速阅读内容,了解信息。
缺点:也许会丢失掉重要的关键信息,无法建立信息获取的闭环。
3整页加载
当当前页与下一页是整页切换的时候,可以考虑采用整页加载的形式,但是要保证每个页面的数据量不是特别的大。一般适用于宫格模式、全屏模式、网状详情页模式。
优点:能保证每个页面的完整性,体验比较整体。
缺点:不好保证整页的加载效率,且有可能影响浏览的流畅度。
4自动加载
当你浏览信息时,不停的向上滑动,新的内容会不停的从底部出现,这种方式称为自动加载。关于自动加载,要注意每次加载多少条内容,或者多少屏的内容,我无聊的数了数今日头条每次会自动加载60条新闻。
优点:把用户代入无尽浏览模式,让用户一直向下滚动,不需要手动点击下一页。
缺点:没有尽头,容易迷失,不方便快速索引定位到某个内容。
5智能加载
这个加载模式我经常使用到,假如是在WIFI情况下,使用QQ浏览器去看视频,那么它会自动加载视频播放,而使用4G的流量去访问视频页面的话,会有一个弹窗来确认是否要播放,以免耗费大量流量造成用户扣费。智能加载模式就是根据用户使用场景来改变加载形式的。
例如今日头条在WiFi模式下,大图展示,当处于非WiFi模式下时,展示小缩略图,当用户觉得某张图有足够的吸引力时,点击小缩略图加载大图,帮助用 户节省流量。再比如爱奇艺在非WiFi的模式下播放视频时,会提示用户继续播放会产生流量费用,这类设计就比较人性化,也容易让用户产生好感,建户忠诚 度。(用户知道你是在为他着想,毕竟流量还是挺贵的!)
优点:根据具体场景来控制流量和加载速度。
缺点:不一定真实有效的命中用户需求,所以还是需要给予用户一定的查看详情的入口,或者是设置项。
6离线加载
当用户没网的时候,往往很多功能都不能用了,内容也无法加载出来,导致APP变得根本不可用,这时候就要考虑预加载 离线缓存的设计了。首先在有网 的时候把数据提前加载下来,缓存到本地,当没网的时候,直接加载已经缓存下来的内容。一般会提供给用户选择,是否开启有WiFi的情况下预加载功能,或者 是否开始WiFi下全部离线缓存的功能。这样便可在一定程度上减少地铁上信号时好时差而无法正常使用产品所带来的困扰了。但考虑到手机空间,要设计合适的离线机制。并配合一定的清理缓存的机制。适用于小说阅读、新闻阅读、视频类APP。
优点:解决了没网获取数据的问题,且节约了流量,保证了流畅。
缺点:占用本地存储空间,而且有时候预加载的内容根本没有用到。
三、4种减少等待感的设计
1使用模态加载
尽量使用非模态的加载方式,在加载的过程不打断用户,不需要等待加载完就可以做别的事情的,而不用傻傻等待数据加载完成,大大降低了等待的焦躁感,提升用户体验流畅度。
模态加载:app在触发加载后,出现模态提示层,防止用户在加载过程中进行其他操作,导致当前加载出错。如果采用模态加载,会因为网络原因或内容过多导致长时间处于加载状态,建议提供一个“取消”的操作。同时在安卓中的后退按钮能关闭模态提示。
2 情感化的加载动画
用户等待加载的过程是相当痛苦的,因为他迫切的想看到页面内容,通过设计一些呆萌可爱的加载动画,让用户在等待的过程中享受动画的愉悦感,让产品情感化,在心理层面上去减少用户的急躁感。
3
进度条加载
如果是时间较长的加载过程,最好能清晰的告知过程进度,让用户有更加明确的知情权,和加载的时间预期。一个非常经典的体验设问,同样是3s的加载时 间,匀速的进度条、先慢后快的进度条、先快后慢的进度条,哪个让用户感觉上最快经过科学的实验证实,先慢后快的进度条是让用户心理感受上最快的设计。这是因为用户最容易记住最后一瞬间的感觉,如果最后一瞬间,感知到了快,就觉得顺畅了。
4
尽量提前加载
尽可能的利用预加载或有WiFi的情况下离线缓存的方式,把内容提前加载下来,这样能做到最大限度的降低加载给用户带来的卡顿感。如果能判断出来用户下一步要做的事情,提前帮用户加载相应的内容,肯定是最符合需求场景的事情。当我开始读第一页的时候,第二页第三页就开始陆续缓存下来了
5启动页加载
这个主要是APP启动时的一个页面,由于APP启动需要时间,因此可以加入一个启动页来自然过渡,而且很多启动页是广告,这样也可以带来一些收益,这个页面一般可以点击跳过。
移动互联网的场景多种多样,我们在设计的时候需要考虑各种各样的场景,例如WiFi下、非WiFi下、无网络、又或者说电梯里、地铁上等等。但是咋们的目的也只有一个:优化用户体验,提高商业价值。所以无论设计什么功能模块都应该多考虑一下用户的使用场景。
如何降低用户的焦虑感?
由于存在网速不快,网络异常,服务器异常等情况,让用户等待的情况是必不可少的。但是我们都知道,等待会产生焦虑感,分分钟让用户卸载你的产品,那么我们可以通过哪些手段来降低或缓解用户的焦虑感?
第一:优化App的加载算法,使得App与服务器数据传输的时间减短。 这个需要开发人员的精益求精了。这个是从根本上解决了问题,因为直接减少了加载数据的时间,也就减少了用户需要等待的时间。
第二:采用预加载和智能加载的方式。 拿阅读App打比方,当用户在看第一页的时候,App在后台加载完后面的几页,等用户翻到第二页的时候就不需要等待加载了,因为App已经帮用户提前加载好了。这种加载机制对用户体验特别好,但是存在一个问题,就是要预测用户行为,加载其他数据,这样会消耗不少流量,所以建议在WiFi网络环境下采取这种预加载机制,而在蜂窝网络状态下则不采用预加载机制。这个要和开发人员讨论沟通,确保预加载机制完美运行。
第三:异步处理。 这一点做得好的App莫过于Instagram,不知道你有没有发现,用Instagram的时候会觉得特别流畅,即使在网络不好的情况下。这是为什么?因为在网络不好的情况下,你给好友点了赞,Instagram并不会提示你网络不好,操作失败,而是提示你点赞成功了,其实它只是将你点赞的操作记录了下来,等网络一好就将点赞的行为上传到服务器,从而完成点赞行为。这就是让产品自己去解决问题,而不是把问题抛给用户。
第四:设计有趣的loading动画,如上文介绍的美团APP奔跑的小人,这是提升产品情感的重要手段。
0条评论