android客户端访问服务端tomcat
16lz
2021-01-26
首先,服务器端已经存在一个项目,该项目基于SSH,已经部署在tomcat上并且正在运行了.我在这个项目的action层新建了一个包,该包主要是Struts2的一些action,只是这些action不是返回某些view,而是返回json,定义这些action的XML配置如下:
<packagename="mobie"namespace="/mobie"extends="json-default"><actionname="login"class="loginAction"method="login"><!--设置返回类型为json--><resultname="success"type="json"><!--将对象放进一个map里面,这个map作为该action的一个field,必须具有setter个getter方法这样就可以向客户端返回整个实体的json对象,这个在需要返回复杂的组和对象是比较实用--><paramname="root">dataMap</param></result></action></package>
action类:
importjava.util.HashMap;importjava.util.Map;importcom.jeanselam.intf.UserService;importcom.jeanselam.pojo.User;importcom.opensymphony.xwork2.ActionSupport;publicclassLoginActionextendsActionSupport{privatestaticfinallongserialVersionUID=1L;privateStringemail;privateStringpassword;privateUseruser;privateMap<String,Object>dataMap=newHashMap<String,Object>();privateUserServiceuserService;//业务接口,不写出来,省略publicMap<String,Object>getDataMap(){returndataMap;}publicvoidsetDataMap(Map<String,Object>dataMap){this.dataMap=dataMap;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.email=email;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicUsergetUser(){returnuser;}publicvoidsetUser(Useruser){this.user=user;}publicUserServicegetUserService(){returnuserService;}publicvoidsetUserService(UserServiceuserService){this.userService=userService;}publicStringlogin()throwsException{//System.out.println("---------------------------移动端登陆");System.out.println("---------------------------移动端登陆"+email+"\t"+password);user=userService.login(email,password);dataMap.put("user",user);if(user!=null){returnSUCCESS;}returnERROR;}}
然后,在服务器端和android端都应该有相同的一个实体类,并且解析的json的字段名必须和该类的field名一致:
importjava.util.Set;/***Createdbylinon15-11-8.**/publicclassUser{privateIntegerid;privateStringemail;privateStringpassword;privateIntegergender;privateStringtel;privateStringnickname;privateIntegerisActive;//是否处于激活状态:1是0否privateAddressaddress;privateSet<Order>orders;//一对多publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.email=email;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicIntegergetGender(){returngender;}publicvoidsetGender(Integergender){this.gender=gender;}publicStringgetTel(){returntel;}publicvoidsetTel(Stringtel){this.tel=tel;}publicStringgetNickname(){returnnickname;}publicvoidsetNickname(Stringnickname){this.nickname=nickname;}publicIntegergetIsActive(){returnisActive;}publicvoidsetIsActive(IntegerisActive){this.isActive=isActive;}publicAddressgetAddress(){returnaddress;}publicvoidsetAddress(Addressaddress){this.address=address;}publicSet<Order>getOrders(){returnorders;}publicvoidsetOrders(Set<Order>orders){this.orders=orders;}@OverridepublicStringtoString(){return"User{"+"id="+id+",email='"+email+'\''+",password='"+password+'\''+",gender="+gender+",tel='"+tel+'\''+",nickname='"+nickname+'\''+",isActive="+isActive+",address="+address+",orders="+orders+'}';}}
然后主要开发android端,在android端我的思路大概是这样的:通过http协议访问服务器端的action,服务器返回json,然后android接受json后,通过解析json构造出实例,然后显示在activity上反馈给用户.于是,在android端的主要工作就是解析json和显示数据的问题了,而解析json的工作可以通过某些包来做比较方便.
新建android项目:导入一下jar包:
界面文件:
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin"tools:context="com.ddd3.ddd3.MainActivity"android:orientation="vertical"android:background="@color/colorBackground"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="JeanseLam™"android:textSize="35dp"android:textColor="@color/colorText"/><Viewandroid:layout_width="match_parent"android:layout_height="1dip"android:background="#696969"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/mainUrl"android:textSize="20dp"android:textColor="@color/colorText"/><Viewandroid:layout_width="fill_parent"android:layout_height="40dp"></View><TextViewandroid:id="@+id/loginInfo"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="15dp"android:textColor="@color/colorError"/><EditTextandroid:id="@+id/email"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:hint="TypeyourEmail"/><EditTextandroid:id="@+id/password"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:password="true"android:hint="Enterpassword"/><Buttonandroid:id="@+id/btn_login"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/button_selector"android:text="登录"android:textColor="@color/colorBtnText"android:layout_marginBottom="10dp"/><Buttonandroid:id="@+id/btn_exit"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="退出"android:background="@drawable/button_selector"android:textColor="@color/colorBtnText"android:layout_marginBottom="10dp"/><TextViewandroid:id="@+id/btn_register"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="新用户?"android:textColor="@color/colorText"android:autoLink="all"/></LinearLayout>
activity:
packagecom.ddd3.ddd3;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.TextView;importcom.android.volley.DefaultRetryPolicy;importcom.android.volley.Request;importcom.android.volley.RequestQueue;importcom.android.volley.Response;importcom.android.volley.VolleyError;importcom.android.volley.toolbox.JsonObjectRequest;importcom.android.volley.toolbox.StringRequest;importcom.android.volley.toolbox.Volley;importcom.ddd3.entity.User;importcom.ddd3.service.JSONService;publicclassMainActivityextendsAppCompatActivity{privateEditTextemailText;privateEditTextpasswordText;privateButtonbtn_login;privateButtonbtn_exit;privateTextViewinfo;privateRequestQueuerequestQueue;//用于网络网络请求,每一个activity只需要一个requestQueue//privateUserServiceuserService;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}privatevoidinitView(){emailText=(EditText)findViewById(R.id.email);passwordText=(EditText)findViewById(R.id.password);btn_login=(Button)findViewById(R.id.btn_login);btn_exit=(Button)findViewById(R.id.btn_exit);info=(TextView)findViewById(R.id.loginInfo);btn_login.setOnClickListener(newButtonListener());btn_exit.setOnClickListener(newButtonListener());requestQueue=Volley.newRequestQueue(this);//实例化请求队列}classButtonListenerimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewv){if(v.getId()==btn_login.getId()){Stringemail=emailText.getText().toString();Stringpassword=passwordText.getText().toString();if(email.equals("")||password.equals("")){info.setText("请输入您的Email和密码");}else{//服务端urlStringurl="http://192.168.56.1:8080/JeanseLam/mobie/login?email="+email+"&password="+password;JsonObjectRequestjr=newJsonObjectRequest(Request.Method.GET,url,null,newResponse.Listener<org.json.JSONObject>(){@OverridepublicvoidonResponse(org.json.JSONObjectjsonObject){//System.out.println("----------------"+jsonObject.toString());StringjsonStr=jsonObject.toString();//由于服务器端传过来的date格式gson默认是无法解析的,所以在创建gson的时候就要对date的格式进行设置Gsongson=newGsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();//在服务器端传过来的json是包含类名的,应该做些字符串的处理,把类名去掉才可解析成实体类,否则解析的类的所有属性值均为null,我实验过了Useruser=gson.fromJson(jsonStr.substring(jsonStr.indexOf(":")+1,jsonStr.length()-1),newTypeToken<User>(){}.getType());//构造实例//System.out.println("-------------------"+user.toString());application.getSession().put("user",user);//用户登陆信息作为全局变量Intentintent=newIntent(MainActivity.this,IndexActivity.class);//转到主页startActivity(intent);}},newResponse.ErrorListener(){@OverridepublicvoidonErrorResponse(VolleyErrorerror){System.out.println("-------------------"+error.getMessage());}});jr.setRetryPolicy(newDefaultRetryPolicy(20*1000,1,1.0f));requestQueue.add(jr);}}elseif(v.getId()==btn_exit.getId()){android.os.Process.killProcess(android.os.Process.myPid());}}}}
需要注意的是:由于访问本地项目,url的地址为:192.168.56.1:8080而不是localhost或其他
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- android activity 跳转与值
- Android四大组件:BroadcastReceiver史上最全面解析
- Android图片加载框架最全解析(一),Glide的基本用法
- 框架相关(MVP+Rxjava+Retrofit+OkHttp+Picasso+EventBus+ButterK
- Android(安卓)Animation 用法解析
- Android开罐头———外部存储与内部存储完全解析
- android私有文件夹的访问
- Android(安卓)API Demo实例解析