Servlet和Android网络交互基础(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zh_qianwei/article/details/50717736

e####开发准备

在本篇文章开始前先介绍一下我使用的开发环境
Web MyEclipse+jdk +tomact
这里没有使用eclipse是因为MyEclipse已经继承了好多插件,无需自己去安装了
Android androidStudio+jdk+sdk
这里没有使用Eclipse,如果还在使用的建议转型用androidStudio
Google官网被和谐了,大家可以到这个网站下载http://www.androiddevtools.cn/

最简单的Get请求

Servlet编写

Web的同学比较熟悉可以直接略过,Android的如果熟悉Eclipse的也比较简单,如果没用过的需求去恶补一下Eclipse的使用了

  • 创建web工程 选择File或者直接在Package Explorer右击选择new->Web Project,弹出窗口如下

    这里写图片描述

    项目名称我们写FirstServletDemo对应blog第一章,然后finish。弹出窗口直接yes项目就创建成功了

这里写图片描述

下面我们来编写简单的页面,首先是index.jsp文件

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
   <h1>第一个servlet小程序</h1>
   <hr>
   <a href="servlet/HelloServle">Get方式请求servlet</a>
<!-- 一个超链接就是一个Get请求-->
  </body>
</html>

接下来是处理这个请求,在src包下创建servlet,然后再新创建的包下右击选择new->servlet

这里写图片描述

这里的名称我们直接填写FirstServlet,继续next

这里写图片描述
这个是ide自动给我们设置的一些配置我们默认就可以了

下面是FirstServlet的代码

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 {

    /**
     * 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请求。。。");
        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请求。。。");
        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 Servxception if an error occurs
     */
    public void init() throws ServletException
    {
    // Put your code here
    }
}

doGet,doPost是用来处理get和post类型的请求的,这里面我们直接输出加粗的Hello servlet
接下来是位于WebRoot->WEB-INF下的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>FirstServlet</servlet-name> <!-- 服务的名称 -->
    <servlet-class>servlet.FirstServlet</servlet-class> <!-- 服务的路径 -->
  </servlet>

  <servlet-mapping>
    <servlet-name>FirstServlet</servlet-name><!-- 服务的名称和上面对应 -->
    <url-pattern>/servlet/HelloServlet</url-pattern><!-- 服务能接收的接口地址,和index.jsp里面的一致 -->
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

到此我们代码编写阶段已经完成,下面是项目运行的配置,在配置之前需要进行一下Tocmat的配置,这里不做介绍了

这里写图片描述

弹出如下界面,再Project里面选择我们的项目FirstServletDemo

这里写图片描述

然后Add弹出窗口选择Yes,选择ide配置的Tocmat

这里写图片描述

选择完毕后,会回到窗口。点击OK就配置完成了
接下来就是运行了,选择配置旁边的按钮,在选择我们选择的Tocmat就可以了

这里写图片描述

然后我们就可以在浏览器中验证我们的程序了
在浏览器中输入http://localhost:8080/FirstServletDemo/index.jsp
如果没有错误就会有以下的界面

这里写图片描述

点击下面的超链接就会显示我们servlet输出的加了粗体的Hello servlet

关于IP上面我们在浏览器的地址也可以使用本机的IP,http://127.0.0.1:8080/FirstServletDemo/index.jsp
还可以使用自己的网络地址

练习题

  • 如果把index.jsp里面超链接改成
   <a href="firstapi">Get方式请求servlet</a>

其它地方还需要修改什么

  • 尝试使用Post访问这个Servlet
  • 如果本机网络ip是192.168.15.22,那么别的机器访问这个怎么输入这个网络地址
Android编写

注意 这里的网络请求用到了一个基于OKHttp二次封装的库okhttp-utils
同样如果比较熟悉Android的同学这一步也可以忽略。同样在使用studio之前也是需要配置的,主要是配置jdk的路径,至于sdk在studio里面可以直接下载。这个在后面会提到
这里我们分2部第一步,第一步我们直接用这个提供的demo直接访问我们写好的servlet。
第二步我们重新创建项目使用他这个类库,来访问这个项目。接下来的文章都会基于这个项目

首选我们看第一步,File ->Open File 选择okhttp-utils-master

这里写图片描述
可能有的童鞋显示和这个不一样,进行什么设置即可
这里写图片描述

如果是使用Eclipse的注意一下区别,studio使用gradle构建工程Gradle基本使用

然后我们只需要修改一个地方sample-okhttp->java->com.zhy.sample_okhttp->MainActivity,运行就可以了

  public void getHtml(View view)
  {
      String url = "http://你自己机器的ip地址:8080/FirstServletDemo/servlet/HelloServlet";
      OkHttpUtils.get()
                .url(url)
                .build()
                .execute(new MyStringCallback());

  }

因为在模拟器中127.0.0.1代表的是模拟器ip,所以这里需要使用机器ip

第二部创建我们自己的项目,上面直接打开的是demo自带的项目。下图是我你们自己创建项目步骤
File->New -> New Project

这里写图片描述
每个需要填的都很直白,其中注意一下Package name后面有一个Edit是可以改的,这个也是程序的唯一标志。填好以后我们一路next,都是一些系统给的默认配置信息,我们在项目里面都是可以修改的。下面会提到。完成以后会新打开一个窗口
这里写图片描述
到这一部hello word就完事了,运行就可以了。如果没有真机还需要配置模拟器
这里写图片描述
选择AVD Manager就会弹出模拟器的创建界面,这里就不详细说明了
在上面这个图有一个向右的箭头就是来运行程序的
注意事项真机运行Windows需要装手机的驱动,一般装一个手机助手会自动下载。手机需要开启开发者模式并允许你的电脑调试。Mac 下面会无需驱动这一步。

下面我们开始编写代码,这里我们不自己写网络请求,因为Android系统的底层用的就是OKHttp,自己调用的api最终还是这个库实现的
首先在项目的gradle配置网络框架的支持,选择module那个gradleGradle基本使用有说明

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.0'
    compile 'com.android.support:design:23.1.0'
    compile 'com.zhy:okhttputils:2.2.0'
}

配置完毕以后我们需要让Studio把这个类库下载下来

这里写图片描述
点击右边的Gradle,在弹出的菜单点击刷新就会自动下载了。
注意事项如果这个时候写代码用到这个api,提示未找到那么只需要运行一下项目就可以了。前提有忘了支持。如果没有网络可以采用它demo里面附件module方式

类库下载完毕以后我们打开Activity类修改代码。
这里写图片描述

我们需要Textview用于显示我们从servlet里面得到的数据,在Android中UI的加载一般采用xml方式

   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//设置窗口加载的UI布局文件
        .....
   }

因为我们刚才创建项目是一路next,系统默认选中的是第一种方式,给我们自动写了很多代码。
我们需要修改的xml文件是这个在activity_main里面有include标签

这里写图片描述
选中的是我们需要添加的代码,给这个TextView添加一个id
在MainActivity中我们需要获取这TextView
代码如下

public class MainActivity extends AppCompatActivity {
    TextView mTV;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTV = (TextView)findViewById(R.id.servletTV);
        ......
    }
    ......
  }

获取完毕以后我们就可以用okhttp获取数据了,完整的代码如下

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 com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;

import okhttp3.Call;
import okhttp3.Request;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    TextView mTV;
    @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();
            }
        });
        getServletInfo();
    }
    public void getServletInfo()
    {
        String url = "http://你自己机器的ip地址: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)
        {
            mTV.setText("onError:" + e.getMessage());
        }

        @Override
        public void onResponse(String response)
        {
            mTV.setText("onResponse:" + response);
        }

        @Override
        public void inProgress(float progress)
        {
            Log.e(TAG, "inProgress:" + progress);
        }
    }

    @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);
    }
}

源码地址

猜你喜欢

转载自blog.csdn.net/zh_qianwei/article/details/50717736
今日推荐