サーブレットとAndroidネットワークの相互作用の基礎_MVP(2)
17713 ワード
第1章では,最も基本的なサーブレットとAndroidのgetによるネットワークインタラクション機能を実現した.実際の開発では基本的にパラメータ付きで、get/post、head、cookie、parameterなどを処理する必要があります.また、業務処理、データベースへのアクセス、データの組み立ても行います.その後、クライアントにデータが送信されます.ここではコードの業務がますます複雑になり、バージョンの反復などの要因でサーブレットのコードもますます多くなり、ITスタッフの高度な流動性がコードのメンテナンス作業量を激化させ、後期になると災害的になる.次にMVPを用いてコードの結合型を低減し,サーバ側ではView層がないためSVPと呼ぶことができる.ここではMVPのアイデアを紹介しないで、直接コードは実現します
サーブレット実装
Presenterセクション
FirstPresenterはデータ解析とビジネスロジックスケジューリングを処理し、コードは以下の通りである.
FirstPresenterInterfaceはFirstPresenterメソッドをサーブレットに暴露し、サーブレットは暴露メソッドにしかアクセスできません.コードは次のとおりです.
Serverセクション
FirstServiceletはデータを受信し、送信し、ビジネス処理を行わない.コードは次のとおりです.
FirstServeretInterface Pレイヤがビジネスロジックを処理した後にインタフェース定義をスケジューリングする方法.ここでresponseとPが生成したデータmsgを渡す
Moduleセクション
データモジュールは、私たちの比較的簡単なため、まだデータベースに関連していません.ここは一時的に空いています.具体的に実P解析データを実現した後、ビジネスロジックとmoduleのインタラクションに基づいて、リソースを取得してS層に伝達する
HttpType定数定義
Android実装
上記のサービスと同様に、モバイルのプロジェクトはUIの修正、バージョンの反復、技術の更新、人員の離職、機種の適合などによって、プロジェクトのメンテナンスがますます難しくなっています.途中でエラーが発生した場合、後期のデバッグには時間がかかります.次に、この例androidコードを示します.
Presenterセクション
MainPresenterはUIに直接触れていないし、Activityのページジャンプロジックもできず、業務だけを処理している.
Viewセクション
MainActivityはネットワークリクエストを処理していません.ここではview関連の仕事だけに関心を持っています.MainInterfaceを継承し、通常の要求データと要求異常のヒントを表示する2つの方法を実装します.
サーブレット実装
Presenterセクション
FirstPresenterはデータ解析とビジネスロジックスケジューリングを処理し、コードは以下の通りである.
package servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstPresenter implements FirstPresenterInterface {
private FirstServletInterface mFirstServletInterface;
public FirstPresenter(FirstServletInterface servletInterface){
mFirstServletInterface = servletInterface;
}
public void parseParameters(HttpServletRequest request,
HttpServletResponse response,int type) {
// TODO Auto-generated method stub
System.out.println(" 。。。type="+type);
response.setContentType("text/html;charset=utf-8");
String sendMsg = " FirstServlet ";
mFirstServletInterface.sendMSG(response,sendMsg);
}
}
FirstPresenterInterfaceはFirstPresenterメソッドをサーブレットに暴露し、サーブレットは暴露メソッドにしかアクセスできません.コードは次のとおりです.
package servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface FirstPresenterInterface {
public void parseParameters(HttpServletRequest request, HttpServletResponse response,int httpType);
}
Serverセクション
FirstServiceletはデータを受信し、送信し、ビジネス処理を行わない.コードは次のとおりです.
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet implements FirstServletInterface{
FirstPresenterInterface mPresenter;
/** * Constructor of the object. */
public FirstServlet() {
super();
}
/** * Destruction of the servlet. <br> */
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// super.doDelete(req, resp);
System.out.println(" Get 。。。");
mPresenter.parseParameters(request, response, HttpType.HTTP_TYPE_GET);
// response.setContentType("text/html;charset=utf-8");
// PrintWriter out = response.getWriter();
//
// out.println("<strong>Hello servlet</strong>");
// out.flush();
// out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// super.doGet(request, response);
System.out.println(" Post 。。。");
mPresenter.parseParameters(request, response, HttpType.HTTP_TYPE_POST);
// response.setContentType("text/html;charset=utf-8");
// PrintWriter out = response.getWriter();
//
// out.println("<strong>Hello servlet</strong>");
// out.flush();
// out.close();
}
/** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */
public void init() throws ServletException {
// Put your code here
mPresenter = new FirstPresenter(this);
}
public void sendMSG(HttpServletResponse response,String msg) {
PrintWriter out;
try {
out = response.getWriter();
out.println(msg);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FirstServeretInterface Pレイヤがビジネスロジックを処理した後にインタフェース定義をスケジューリングする方法.ここでresponseとPが生成したデータmsgを渡す
package servlet;
import javax.servlet.http.HttpServletResponse;
public interface FirstServletInterface {
public void sendMSG(HttpServletResponse response,String msg);
}
Moduleセクション
データモジュールは、私たちの比較的簡単なため、まだデータベースに関連していません.ここは一時的に空いています.具体的に実P解析データを実現した後、ビジネスロジックとmoduleのインタラクションに基づいて、リソースを取得してS層に伝達する
HttpType定数定義
package servlet;
public class HttpType {
public static final int HTTP_TYPE_GET = 0;
public static final int HTTP_TYPE_POST = 1;
}
Android実装
上記のサービスと同様に、モバイルのプロジェクトはUIの修正、バージョンの反復、技術の更新、人員の離職、機種の適合などによって、プロジェクトのメンテナンスがますます難しくなっています.途中でエラーが発生した場合、後期のデバッグには時間がかかります.次に、この例androidコードを示します.
Presenterセクション
MainPresenterはUIに直接触れていないし、Activityのページジャンプロジックもできず、業務だけを処理している.
package com.example.zqw.servletdemo;
import android.util.Log;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import okhttp3.Call;
import okhttp3.Request;
/** * Created by zqw on 2016/2/24. */
public class MainPresenter implements PresenterInterface{
MainInterface mInterface;
public MainPresenter(MainInterface mainInterface){
this.mInterface = mainInterface;
}
@Override
public void getInfo() {
String url = "http://172.16.41.113:8080/FirstServletDemo/servlet/HelloServlet";
OkHttpUtils
.get()
.url(url)
.build()
.execute(new MyStringCallback());
}
public class MyStringCallback extends StringCallback {
@Override
public void onBefore(Request request)
{
super.onBefore(request);
// setTitle("loading...");
}
@Override
public void onAfter()
{
super.onAfter();
// setTitle("Sample-okHttp");
}
@Override
public void onError(Call call, Exception e)
{
mInterface.showErrorInfo(" :"+e.toString());
}
@Override
public void onResponse(String response)
{
mInterface.showErrorInfo(" :"+response);
}
@Override
public void inProgress(float progress)
{
// Log.e(TAG, "inProgress:" + progress);
}
}
}
Viewセクション
MainActivityはネットワークリクエストを処理していません.ここではview関連の仕事だけに関心を持っています.MainInterfaceを継承し、通常の要求データと要求異常のヒントを表示する2つの方法を実装します.
package com.example.zqw.servletdemo;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import okhttp3.Call;
import okhttp3.Request;
public class MainActivity extends AppCompatActivity implements MainInterface{
private static final String TAG = "MainActivity";
TextView mTV;
MainPresenter mainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTV = (TextView)findViewById(R.id.servletTV);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
mainPresenter = new MainPresenter(this);
mainPresenter.getInfo();
}
public void showInfo(String msg) {
mTV.setText(msg);
}
public void showErrorInfo(String msg) {
mTV.setText(msg);
Toast toast = Toast.makeText(this,msg,Toast.LENGTH_LONG);
toast.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}