您的位置:首页 > 理论基础 > 计算机网络

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

2016-02-23 18:29 591 查看
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
/
a64e
/ 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);
}
}


源码地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息