android studio中怎么创建web
在项目根目录下建立一个libraries文件夹,移动你要使用的library project到libraries目录(为什么是移动?本人试过复制到工程,但复制过来的库工程里面的src目录下的代码会丢失) 注意:你的library project一定要保证有自己的buildgradle,如果
jQuery UI是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库。包含底层用户交互、动画、特效和可更换主题的可视控件。我们可以直接用它来构建具有很好交互性的web应用程序。所有插件测试能兼容IE 60+, Firefox 3+, Safari 31+, Opera 96+, 和GoogleChrome。
目前,前端开发领域类似于有一下几个:
1、jQuery EasyUI
jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript,也不需要对css样式有深入的了解,开发者需要了解的只有一些简单的html标签。
2、Bootstrap
Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。 它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目。 国内一些移动开发者较为熟悉的框架,如WeX5前端开源框架等,也是基于Bootstrap源码进行性能优化而来。
3、Boilerplate
Boilerplate是一个由 Paul Irish(Google Chrome 开发人员、jQuery 项目成员、Modernizr 作者、yayQuery 播客主持人)主导的“前端开发模版”。
HTML5 Boilerplate 是一套具有非常多先进特性的框架,其特性简单介绍如下:
(1)由 Paul Irish 首创的在 HTML 页面的 body 上使用 IE 条件注释判断浏览器版本,从而大大简化了针对 IE Hack 的成本(在后来的版本中升级为在 <html> 标签中加入条件注释) (2)HTML5 集成,默认使用了很多 HTML5 的特性,并且使其兼容旧版本浏览器
(3)大量针对服务器的默认配置,无需修改即可配置一个安全、标准的 web 服务器
(4)完整的 JS 调试机制 —— 即使在 IE 下
(5)大量使用 CSS3 技术,并且集成了几乎所有来自框架中和技术大牛们口头相传的 CSS 技巧
(6)为所有浏览环境做了优化,包括移动版本和打印版本
(7)默认内置 Modernizr,可以检测浏览器对新特性的支持能力,方便针对旧版本浏览器优化
4、 jQuery Mobile
jQuery Mobile是jQuery 在手机上和平板设备上的版本。jQuery Mobile 不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架。支持全球主流的移动平台。jQuery Mobile开发团队说:能开发这个项目,我们非常兴奋。移动Web太需要一个跨浏览器的框架,让开发人员开发出真正的移动Web网站。
利用webservice实现
1,注册数据应该保存在服务器端控制的数据库里,
2,服务器可以用。net搭建
也可以用java写
3,eclipse
android开发用
进入到注册界面输入信息后
点击确认按钮
在点击事件里面获取输入的信息,String
username
=
edittextgettext();
存到map键值对里面
根据服务器的ip和对应的方法名发送
服务器端的对应方法记得要发布到IS上
服务器接收到数据后操作数据库
。就OK了,如果哪里不明白可以继续追问。
HttpClient 与 HttpURLConnection 共用 SessionId
下面给出访问服务器的截图,向后滑动有http协议那一章,里面与源码,例子来自android学习手册,里面有源码。android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳:
HttpClient 与 HttpUrlConnection 是Android 中HTTP操作最常见的访问方式。在一个应用程序中有时候会用到这两种方式,如何能让他们共用Cookie,让客户端访问服务器保持Session进行通信。
针对httpClient 和HttpUrlConnection 获取和发送Cookie,主要是sessionID的共享。
httpClient获取及发送Session 值:
[java] view plain copy print
HttpPost httpPost = new HttpPost(url);
// 将SessionId发给服务器
if(null != mSESSIONID){
httpPostsetHeader("Cookie", "SESSIONID=" + mSESSIONID);
}
DefaultHttpClient httpClient = new DefaultHttpClient();
httpResponse = httpClientexecute(httpPost);
if (httpResponsegetStatusLine()getStatusCode() == HttpStatusSC_OK) {
HttpEntity entity = httpResponsegetEntity();
CookieStore mCookieStore = httpClientgetCookieStore();
List<Cookie> cookies = mCookieStoregetCookies();
//这里是读取指定Cookie 的值
for (int i = 0; i < cookiessize(); i++) {
if ("SESSIONID"equals(cookiesget(i)getName())) {
mSESSIONID = cookiesget(i)getValue();
break;
}
}
}
HttpPost httpPost = new HttpPost(url);
// 将SessionId发给服务器
if(null != mSESSIONID){
httpPostsetHeader("Cookie", "SESSIONID=" + mSESSIONID);
}
DefaultHttpClient httpClient = new DefaultHttpClient();
httpResponse = httpClientexecute(httpPost);
if (httpResponsegetStatusLine()getStatusCode() == HttpStatusSC_OK) {
HttpEntity entity = httpResponsegetEntity();
CookieStore mCookieStore = httpClientgetCookieStore();
List<Cookie> cookies = mCookieStoregetCookies();
//这里是读取指定Cookie 的值
for (int i = 0; i < cookiessize(); i++) {
if ("SESSIONID"equals(cookiesget(i)getName())) {
mSESSIONID = cookiesget(i)getValue();
break;
}
}
}
在程序中保存上面的sessionId ,或用全局变量,或者SharedPreferences 保存,看这个sessionId 的会话时间及程序业务。
HttpUrlConnection 获取及发送Session 值:
[java] view plain copy print
HttpURLConnection url_con = null;
URL url = new URL(reqUrl);
url_con = (HttpURLConnection) urlopenConnection();
//设置session
if (mSESSIONID!= null) {
url_consetRequestProperty("Cookie","JSESSIONID="+mSESSIONID);
}
String cookieVal =congetHeaderField("Set-Cookie");
// 获取session
if (cookieVal != null) {
StringmSESSIONID= cookieValsubstring(0, cookieValindexOf(";"));
}
HttpURLConnection url_con = null;
HttpURLConnection url_con = null;
URL url = new URL(reqUrl);
url_con = (HttpURLConnection) urlopenConnection();
//设置session
if (mSESSIONID!= null) {
url_consetRequestProperty("Cookie","JSESSIONID="+mSESSIONID);
}
String cookieVal =congetHeaderField("Set-Cookie");
// 获取session
if (cookieVal != null) {
StringmSESSIONID= cookieValsubstring(0, cookieValindexOf(";"));
}
HttpURLConnection url_con = null;
HttpURLConnection和HttpClient比较(Android):
HttpURLConnection和HttpClient 都支持HTTPS协议、IPv6、以流的形式进行上传和下载、配置超时时间、以及连接池等功能。
DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。
HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。不过在Android 22版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。那么我们通常的解决办法就是直接禁用掉连接池的功能:
在Android 23版本中还增加了一些HTTPS方面的改进,现在HttpsURLConnection会使用SNI(Server Name Indication)的方式进行连接,使得多个HTTPS主机可以共享同一个IP地址。除此之外,还增加了一些压缩和会话的机制。如果连接失败,它会自动去尝试重新进行连接。这使得HttpsURLConnection可以在不破坏老版本兼容性的前提下,更加高效地连接最新的服务器。
在Android 40版本中,我们又添加了一些响应的缓存机制。当缓存被安装后(调用HttpResponseCache的install()方法),所有的HTTP请求都会满足以下三种情况:
1所有的缓存响应都由本地存储来提供。因为没有必要去发起任务的网络连接请求,所有的响应都可以立刻获取到。
2视情况而定的缓存响应必须要有服务器来进行更新检查。比如说客户端发起了一条类似于 “如果/foopng这张发生了改变,就将它发送给我” 这样的请求,服务器需要将更新后的数据进行返回,或者返回一个304 Not Modified状态。如果请求的内容没有发生,客户端就不会下载任何数据。
3没有缓存的响应都是由服务器直接提供的。这部分响应会在稍后存储到响应缓存中。
由于这个功能是在40之后的版本才有的,通常我们就可以使用反射的方式来启动响应缓存功能。下面的示例代码展示了如何在Android 40及以后的版本中去启用响应缓存的功能,同时还不会影响到之前的版本:
[java] view plain copy print
private void enableHttpResponseCache() {
try {
long httpCacheSize = 10 1024 1024; // 10 MiB
File httpCacheDir = new File(getCacheDir(), "http");
ClassforName("androidnethttpHttpResponseCache")
getMethod("install", Fileclass, longclass)
invoke(null, httpCacheDir, httpCacheSize);
} catch (Exception httpResponseCacheNotAvailable) {
}
private void enableHttpResponseCache() {
try {
long httpCacheSize = 10 1024 1024; // 10 MiB
File httpCacheDir = new File(getCacheDir(), "http");
ClassforName("androidnethttpHttpResponseCache")
getMethod("install", Fileclass, longclass)
invoke(null, httpCacheDir, httpCacheSize);
} catch (Exception httpResponseCacheNotAvailable) {
}
}
你也应该同时配置一下你的Web服务器,在HTTP响应上加入缓存的消息头。
哪一种才是最好的?
在Android 22版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。
而在Android 23版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection。
方法/步骤
1
在eclipse上安装好android开发环境,android调用webservice使用ksoap,本经验使用的是ksoap2-android-assembly-264-jar-with-dependenciesjar
2
AndroidManifestxml中需添加相应的权限,例子:
<xml version="10" encoding="utf-8">
<manifest xmlns:android="http://schemasandroidcom/apk/res/android"
package="comexamplecamera"
android:versionCode="1"
android:versionName="10" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="9" />
<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="androidpermissionMOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="androidpermissionINTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="comexamplecameraMainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="androidintentactionMAIN" />
<category android:name="androidintentcategoryLAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3
activity_mainxml文件代码
<xml version="10" encoding="utf-8">
<LinearLayout xmlns:android="http://schemasandroidcom/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="点击启动相机"/>
<Button
android:id="@+id/savePic"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="保存到服务器"/>
<TextView
android:id="@+id/textView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#999999" />
</LinearLayout>
4
MainActivity具体代码
package comexamplecamera;
import javaioByteArrayOutputStream;
import javaioFile;
import javaioFileInputStream;
import javaioFileNotFoundException;
import javaioFileOutputStream;
import javaioIOException;
import orgkobjectsbase64Base64;
import orgksoap2SoapEnvelope;
import orgksoap2serializationSoapObject;
import orgksoap2serializationSoapSerializationEnvelope;
import orgksoap2transportHttpTransportSE;
import androidappActivity;
import androidcontentIntent;
import androidgraphicsBitmap;
import androidosBundle;
import androidosEnvironment;
import androidproviderMediaStore;
import androidutilLog;
import androidviewView;
import androidviewViewOnClickListener;
import androidwidgetButton;
import androidwidgetImageView;
import androidwidgetTextView;
public class MainActivity extends Activity {
TextView tv = null;
String fileName = "/sdcard/myImage/myjpg"; //保存sd地址
String namespace = "http://webserviceservicecom"; // 命名空间
String url = "http://19216820019:8080/Web/webservices/Portal"; //对应的url
String methodName = "uploadImage"; //webservice方法
@Override
public void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
tv = (TextView)findViewById(RidtextView);
//启用相机按钮
Button button = (Button) findViewById(Ridbutton);
buttonsetOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
}
});
//保存到服务器按钮(通过webservice实现)
Button saveButton = (Button) findViewById(RidsavePic);
saveButtonsetOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
testUpload();
}
});
}
/
拍照完成后,回掉的方法
/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
superonActivityResult(requestCode, resultCode, data);
if (resultCode == ActivityRESULT_OK) {
String sdStatus = EnvironmentgetExternalStorageState();
if (!sdStatusequals(EnvironmentMEDIA_MOUNTED)) { // 检测sd是否可用
Logv("TestFile",
"SD card is not avaiable/writeable right now");
return;
}
Bundle bundle = datagetExtras();
Bitmap bitmap = (Bitmap) bundleget("data");// 获取相机返回的数据,并转换为Bitmap格式
FileOutputStream b = null;
File file = new File("/sdcard/myImage/");
filemkdirs();// 创建文件夹
try {
b = new FileOutputStream(fileName);
bitmapcompress(BitmapCompressFormatJPEG, 100, b);// 把数据写入文件
} catch (FileNotFoundException e) {
eprintStackTrace();
} finally {
try {
bflush();
bclose();
} catch (IOException e) {
eprintStackTrace();
}
}
((ImageView) findViewById(RidimageView))setImageBitmap(bitmap);// 将显示在ImageView里
}
}
/
上传方法
1把信息通过Base64转换成字符串
2调用connectWebService方法实现上传
/
private void testUpload(){
try{
FileInputStream fis = new FileInputStream(fileName);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count = 0;
while((count = fisread(buffer)) >= 0){
baoswrite(buffer, 0, count);
}
String uploadBuffer = new String(Base64encode(baostoByteArray())); //进行Base64编码
connectWebService(uploadBuffer);
Logi("connectWebService", "start");
fisclose();
}catch(Exception e){
eprintStackTrace();
}
}
/
通过webservice实现上传
@param imageBuffer
/
private void connectWebService(String imageBuffer) {
//以下就是 调用过程了,不明白的话 请看相关webservice文档
SoapObject soapObject = new SoapObject(namespace, methodName);
soapObjectaddProperty("filename", "myjpg"); //参数1 名
soapObjectaddProperty("image", imageBuffer); //参数2 字符串
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelopeVER11);
envelopedotNet = false;
envelopesetOutputSoapObject(soapObject);
HttpTransportSE httpTranstation = new HttpTransportSE(url);
try {
httpTranstationcall(namespace, envelope);
Object result = envelopegetResponse();
Logi("connectWebService", resulttoString());
tvsetText(resulttoString());
} catch (Exception e) {
eprintStackTrace();
tvsetText(egetStackTrace()toString());
}
}
}
5
服务端webservice方法(cxf)
public String uploadImage(String filename, String image) {
FileOutputStream fos = null;
try{
String toDir = "D:\\work\\image"; //存储路径
byte[] buffer = new BASE64Decoder()decodeBuffer(image); //对android传过来的字符串进行解码
File destDir = new File(toDir);
if(!destDirexists()) {
destDirmkdir();
}
fos = new FileOutputStream(new File(destDir,filename)); //保存
foswrite(buffer);
fosflush();
fosclose();
return "上传成功!" + "路径为:" + toDir;
}catch (Exception e){
eprintStackTrace();
}
return "上传失败!";
}
操作步骤
(1)点击“点击启动相机”按钮,回到拍照模式下,拍照完成,回到初始界面,显示刚拍的照片
(2)点击“保存照片到服务器”按钮,通过webservice把照片保存到服务器中,TextView显示保存信息。
在elipse中创建一个Web 工程, 重写do get或者do post方法 ,接收android客户端的数据。
这是我写的一个简单的注册的服务器端代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = requestgetParameter("name" );
String password = requestgetParameter("password");
Systemoutprintln("用户名:" + name + "||密码:" + password );
//链接数据库
try {
ClassforName("commysqljdbcDriver");
Connection con =(Connection) DriverManager
getConnection("jdbc:mysql://localhost:3306/musicdbuser=root&password=root");
Statement sta = (Statement) concreateStatement();
//注册 插入数据到数据库
PreparedStatement psta = (PreparedStatement)conprepareStatement("insert into usertable values ( , )");
pstasetString(1, name);
pstasetString(2, password);
pstaexecute();
//打印数据库中所有用户名和密码
ResultSet res = (ResultSet) staexecuteQuery("select from usertable");
while(resnext()){
Systemoutprintln("yonghuming :" + resgetString("name"));
Systemoutprintln("pass : " + resgetString("password"));
android 端
private String SERVER_URL = "http://1921681106:8080/Web/servlet/NetServlet";
inname = (EditText) findViewById(Ridaddname);
inpassword = (EditText) findViewById(Ridaddpassword);
add_user = (Button) findViewById(Ridadd_user);
add_usersetOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String mname = innamegetText()toString();
String mpass = inpasswordgetText()toString();
Map<String, String> userinfo = new HashMap<String, String>();
userinfoput("name", mname);
userinfoput("password", mpass);
try {
register(SERVER_URL, userinfo);
} catch (Exception e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
});
//通过URL拼接的 用户名和密码 发送给服务端
private void register(String SERVER_URL, Map<String, String> param)
throws Exception {
StringBuilder sb = new StringBuilder(SERVER_URL);
sbappend("");
for (MapEntry<String, String> entry : paramentrySet()) {
sbappend(entrygetKey())append("=")append(entrygetValue())
append("&");
}
sbdeleteCharAt(sblength() - 1);
String newurl = sbtoString();
URL url = new URL(newurl);
HttpURLConnection conn = (HttpURLConnection) urlopenConnection();
connsetRequestMethod("GET");
connsetConnectTimeout(5000);
if (conngetResponseCode() == 200) {
ToastmakeText(MainActivitythis, "连接成功", 1)show();
}
}
0条评论