サーブレットとAndroidネットワークの相互作用の基礎_MVP(2)


第1章では,最も基本的なサーブレットとAndroidのgetによるネットワークインタラクション機能を実現した.実際の開発では基本的にパラメータ付きで、get/post、head、cookie、parameterなどを処理する必要があります.また、業務処理、データベースへのアクセス、データの組み立ても行います.その後、クライアントにデータが送信されます.ここではコードの業務がますます複雑になり、バージョンの反復などの要因でサーブレットのコードもますます多くなり、ITスタッフの高度な流動性がコードのメンテナンス作業量を激化させ、後期になると災害的になる.次にMVPを用いてコードの結合型を低減し,サーバ側ではView層がないためSVPと呼ぶことができる.ここではMVPのアイデアを紹介しないで、直接コードは実現します
サーブレット実装
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);
    }
}