1. android项目servlet放哪儿
进入正题之前还是先回答你的问题,servlet当然是放在javaWeb项目里面了,web项目又放哪里呢,部署在web服务器上,在服务器支持的系统平台上,只要是电脑都可以安装web服务器,在测试阶段常用的是TomCat服务器。从狭义上讲你的android项目和web项目是分开的,各是各的平台,从业务需求上是一体的,android项目负责与用户交互,web项目负责后台服务业务处理,二者完成项目需求。
貌似在你学习Android时候对javaWeb学习不够,如果这方面知识不掌握,android联网部分会很吃力。
2. android中如何加载servlet-api.jar到项目 新手 没什么经验 请大神们 讲详细点
导入JAR包和j2ee中一样啊!如图所示,然后选择你要加入的jar文件就ok了
3. android客户端如何接受服务器端servlet响应的中文字符
首先我们要知道的是
Android客服端与服务器数据交换的方式是一般用json,只是一般在设置字符集的时候用utf8,因为Android是基于Linux内核的,用utf8方便接收中午的时候不会乱码
原因是JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式。json解析也容易
json是一种key /value键值对的数据存储方式的类似于Map
下面的是服务器端输出的json代码
这里不写详细的 代码,因为服务器用的框架不同是不一样的
下面的是Servlet的代码片段
//设置响应的编码
this.response.setContentType("text/html;charset=utf-8");
this.response.setCharacterEncoding("UTF-8");//设置utf8方便接受中文的时候不会乱码
//获取客户端的请求信息
Stringusername=this.request.getParameter("username");
JSONObjectjson=newJSONObject();//定义一个JSONObject
json.put("message","success");//添加数据
response.getWriter().println(json.toString());//输出响应的数据
然后就要在android客服端接受数据了
要接受服务器的返回的数据就要先与服务器起得连接
{
/**.*/
//模拟器自己把自己当成localhost了,服务器应该为10.0.2.2
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getPDAServerData(url);
}
/**
*请求服务
*@paramurl
*/
privatevoidgetPDAServerData(Stringurl){
url+="?username=123456";
HttpClientclient=newDefaultHttpClient();
HttpPostrequest;
try{
request=newHttpPost(newURI(url));//使用post方式
HttpResponseresponse=client.execute(request);//执行连接到服务器
//判断请求是否成功
if(response.getStatusLine().getStatusCode()==200){
HttpEntityentity=response.getEntity();
if(entity!=null){
Stringout=EntityUtils.toString(entity);//获取服务器端返回的结果是json字符串,android有自带的json解析框架包,不用另外导入的
newAlertDialog.Builder(this).setMessage(out).create().show();
}
}
}catch(URISyntaxExceptione){
e.printStackTrace();
}
catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
4. 如何搭建本地服务器Tomcat用于安卓编程
android客户端访问tomcat搭建的servlet服务器并互传数据的步骤:
服务器软件环境的搭建安装apache tomcat服务器。
环境搭建好了部署java web项目。
启动tomcat服务器,并测试在浏览器能否访问。
手机通过电脑的ip地址去访问tomcat的web项目即可。
5. android fragment连接servlet
1.建立/res/values-large/refs.xml引用资源文件 为了开发兼顾屏幕分辨率的应用,我们需要建立一个引用资源文件,专门用于定义各种引用项。refs.xml引用资源文件中定义了一项引用,其作用就是标明activity_book_list实际引用(@)/res/layout/activity_book_twopane.xml界面布局文件。 之所以这样使用,目的是为了在Activity加载R.layout.activity_book_list时将会根据运行平台的屏幕大小自动选择界面布局文件:在大屏幕的平板电脑上,R.layout.activity_book_list将会变成/res/layout/目录小的activity_book_twopane界面布局文件;在小屏幕的手机上,R.layout.activity_book_list依然引用/res/layout/目录下的activity_book_list.xml界面布局文件。源码如下:<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--定义activity_book_list实际引用@layout/activity_book_twopane资源 -->
<item type="layout" name="activity_book_list">
@layout/activity_book_twopane</item>
</resources>
2.建立/res/layout/activity_book_list.xml小屏幕界面布局文件 该布局文件仅仅是显示BookListFragment组件(android:name="包名.BookListFragment"),即该界面布局文件中只是显示图书列表。源码如下:<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.example.android_fragment_1.BookListFragment"
android:id="@+id/book_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"/>
3.建立/res/layout/activity_book_twopane.xml大屏幕界面布局文件
这个布局文件就定义了Activity的显示界面:左边将会显示一个ListFragment,右边只是一个FrameLayout容器。其中FrameLayout容器将会动态更新其中显示的Fragment。<?xml version="1.0" encoding="utf-8"?>
<!-- 定义一个水平排列的LinearLayout,并指定使用中等分隔条 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:divider="?android:attr/dividerHorizontal"
android:showDividers="middle">
<!-- 使用资源文件方式:添加一个fragment到Activity中 -->
<fragment
android:name="com.example.android_fragment_1.BookListFragment"
android:id="@+id/book_list"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1"/>
<!-- 添加一个FrameLayout容器,用于显示图书详细信息 -->
<FrameLayout
android:id="@+id/book_detail_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"/>
</LinearLayout>
4.建立/src/../BookListActivity.java主Activity 实现BookListActivity将会针对不同屏幕分辨率来加载不同的界面布局文件,即通过获取界面资源文件"activity_book_list",判定该界面布局文件中是否包含有ID为book_detail_containner的组件。如果有,则说明为大屏幕使用的是activity_book_twopane.xml界面布局文件;否则,为activity_book_list.xml界面布局文件。源码如下:package com.example.android_fragment_1;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class BookListActivity extends Activity implements
BookListFragment.Callbacks
{
//1.定义一个旗标,用于标识是否该应用是否支持大屏幕
private boolean mTwoPane;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//2.指定加载activity_book_list对应的界面布局文件,实际上会根据分辨率选择相应的布局界面
setContentView(R.layout.activity_book_list);
//3.如果加载的界面布局文件中包含ID为book_detail_container的组件,则说明支持大屏幕
if(findViewById(R.id.book_detail_container)!=null)
{
mTwoPane=true; //支持大屏幕
((BookListFragment)getFragmentManager()
.findFragmentById(R.id.book_list))
.setActivateOnItemClick(true);
}
}
//4.实现Fragment与Activity交互方法
@Override
public void onItemSelected(Integer id) {
/*如果加载的是大屏幕布局界面文件*/
if(mTwoPane)
{
//a.创建Bundle,准备向Fragment传入参数(将键值对绑定到arguments对象中)
Bundle arguments=new Bundle();
arguments.putInt(BookDetailFragment.ITEM_ID,id);
//b.创建BookDetailFragment对象,并向Fragment传入参数
BookDetailFragment fragment=new BookDetailFragment();
fragment.setArguments(arguments);
//c.使用fragment替换book_detail_container容器当前显示的Fragment
getFragmentManager().beginTransaction()
.replace(R.id.book_detail_container, fragment).commit();
}
/*如果加载的是小屏幕布局界面文件*/
else
{
//a.创建启动BookDetailActivity的Intent
Intent detailIntent=new Intent(this,BookDetailActivity.class);
//b.设置传递给BookDetailActivity参数,并启动Activity
detailIntent.putExtra(BookDetailFragment.ITEM_ID, id);
startActivity(detailIntent);
}
}
}
5.建立/src/../BookDetailActivity.java显示图书详情Activity BookDetailActivity主要用于显示小屏幕图书详情,他将直接复用已有的BookDetailFragment。主要完成两个功能:一是当用户当即Activity某个列表项时,会Intent跳转到该Activity并将打包的某图书详情显示在Activity上;二是,该Activity还启用了ActionBar上的应用程序图标,允许用户点击该图标返回到程序的主Activity。package com.example.android_fragment_1;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
public class BookDetailActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//1.指定加载/res/layout目录下的activity_book_detail.xml布局文件
setContentView(R.layout.activity_book_detail);
//2.将ActionBar上应用图标转换成可点击的按钮
getActionBar().setDisplayHomeAsUpEnabled(true);
if(savedInstanceState==null)
{
//a.创建BookDetailFragment对象
BookDetailFragment fragment=new BookDetailFragment();
//b.创建Bundle对象
Bundle arguments=new Bundle();
arguments.putInt(BookDetailFragment.ITEM_ID, getIntent()
.getIntExtra(BookDetailFragment.ITEM_ID,0));
//c.向Fragment传入参数
fragment.setArguments(arguments);
//d.指定fragment添加到book_detail_container容器中
getFragmentManager().beginTransaction()
.add(R.id.book_detail_container, fragment).commit();
}
}
//3.按下图标响应
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId()==android.R.id.home)
{
//a.创建启动BookListActivity的Intent
Intent intent=new Intent(this,BookListActivity.class);
//b.添加额外的Flag,将Activity栈中处于FirstActivity之上的Activity弹出
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
//c.启动intent对应的Activity
startActivity(intent);
6. Android连接servlet的问题
。。你的IP是局域网服务器的IP,首先你先确定你的手机或者你的设备连接的WIFI是和你的服务器是同一个局域网的。如果手机使用的是3G/4G网络是不能访问的。
7. android后台服务用servlet怎么搭建
开始搭建的话直接写一个servlet,在doGet()或者doPost()里response.getWriter().print(“xxx”);你就知道了,android访问直接以http://ip+端口+servlet名称作为路径
8. android注册时信息怎样传到servlet
问题概述
android手机端注册主要写在Activity中,servlet为web端实现。所以你的问题可以理解为android与server端servlet交互。
涉及的知识点
android端Activity代码实现。
server端Servlet代码实现。
具体实现
server端代码:
{
=314719472293387358L;
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ //登陆成功标志
StringLOGIN_FLAG="";
//获得客户端提交用户名密码
Stringusername=req.getParameter("username");
Stringpassword=req.getParameter("password");
//调用UserDAO中isLogin方法判断数据中用户名密码是否正确
booleanflag=UserDAO.isLogin(username,password); try{ DataOutputStreamoutput=newDataOutputStream(resp.getOutputStream()); if(flag){ LOGIN_FLAG="success";
output.writeUTF("服务器端数据:"+LOGIN_FLAG);
System.out.println(LOGIN_FLAG);
output.writeInt(1);
output.close();
}else{
//登录失败
LOGIN_FLAG="failure"; System.out.println(LOGIN_FLAG);
output.writeUTF("服务器端数据:"+LOGIN_FLAG);
output.close();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
android端代码:
{
//privatestaticfinalintREQUEST_CODE=2;
HttpPosthttpRequest=newHttpPost(UriAPI.HTTPCustomer);
EditTextet_name;
EditTextet_pwd;
TextViewshow_login;
Buttonbtn_login;
Buttonbtn_cancle;
ProgressDialogprogressDialog;
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化登陆界面
btn_login=(Button)findViewById(R.id.btn_login);
btn_cancle=(Button)findViewById(R.id.btn_cancle);
et_name=(EditText)findViewById(R.id.et_name);
et_pwd=(EditText)findViewById(R.id.et_pwd);
show_login=(TextView)findViewById(R.id.show_login);
progressDialog=newProgressDialog(this);
btn_login.setOnClickListener(newOnClickListener(){
@SuppressWarnings("unchecked")
@Override
publicvoidonClick(Viewv){ //通过AsyncTask类提交数据异步显示
newAT().execute(et_name.getText().toString(),et_pwd.getText().toString());
}
});
}
publicclassUriAPI{
/**定义一个Uri**/
="http://10.0.1.9:8026/JSONDemo/servlet/CustomerServlet";
}
@SuppressWarnings("rawtypes") classATextendsAsyncTask{
Stringresult="";
@Override
protectedvoidonPreExecute(){
//加载progressDialog
progressDialog.show();
}
@Override
protectedObjectdoInBackground(Object...params_obj){ CharSequenceusername=""; CharSequencepassword="";
username=et_name.getText();
password=et_pwd.getText(); if(!username.equals("")&&!password.equals("")){ //请求数据
HttpPosthttpRequest=newHttpPost(UriAPI.HTTPCustomer); //创建参数
List<NameValuePair>params=newArrayList<NameValuePair>();
params.add(newBasicNameValuePair("username",username.toString()));
params.add(newBasicNameValuePair("password",password.toString())); //params.add(newBasicNameValuePair("flag","0"));
try{ //对提交数据进行编码
httpRequest.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8)); HttpResponsehttpResponse=newDefaultHttpClient().execute(httpRequest); //获取响应服务器的数据
if(httpResponse.getStatusLine().getStatusCode()==200){ //利用字节数组流和包装的绑定数据
byte[]data=newbyte[2048]; //先把从服务端来的数据转化成字节数组
data=EntityUtils.toByteArray((HttpEntity)httpResponse.getEntity()); //再创建字节数组输入流对象
ByteArrayInputStreams=newByteArrayInputStream(data); //绑定字节流和数据包装流
DataInputStreamdis=newDataInputStream(s);
//将字节数组中的数据还原成原来的各种数据类型,代码如下:
result=newString(dis.readUTF());
Log.i("服务器返回信息:",result);
}
}catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
} returnresult;
}
@Override
protectedvoidonPostExecute(Objectresult){
//获得服务器返回信息成功后
show_login.setText(result.toString());
//取消进度条
progressDialog.cancel();
}
}
}
总结说明
二者之间的交互运用十分广泛,android需要后台时就涉及到数据的交互。
注意事项
android端访问网络需要用到异步加载,因为访问网络为耗时操作。
注意Activity端传出数据操作。
注意Servlet端接收数据操作。
参考实例
开源中国社区:android与server端servlet交互
9. android 接受servlet 响应的json字符串 格式不对
看下servlet返回的数据 是不是就已经加了空格之类的特殊字符,json串有严格要求,不能乱加空格的
10. android应用如何嵌入独立的ijetty的servlet容器
2、server部分编译出:i-jetty-server-3.1.jar;
3、总共对外依赖的包需要如下这些:
其中,xmlParserAPIs-2.6.2.jar和xpp3-1.1.4.jar因为某些原因会导致出错,故可以剔除出去,并不影响ijetty的运行。为了简介,这些类可以解压后重新打包到一起,至少jetty的部分可以这么做。
4、web工程需要编译成android可以解析的dex格式zip包,需要注意的是,第三方的lib需要剔除不需要的,尤其是servlet-api-2.5.jar,因为容器中已经包含一个了。
打包命令举例:
dx.bat --dex --output=E:\demo\classes.zip E:\demo\WEB-INF\classes E:\demo\WEB-INF\lib025、把classes.zip包放到lib下,删除原先的jar包,class下的类需要保留,然后打成war包:
jar cvf ppweb.war *.*
026、把ppweb放到jetty目录下的webapps下即可,重启程序即可访问了。
027、基于ijetty的web需要注意,对外部context的引用需要用android系统的,不能用原先web工程那种方式获取。
028、集成ijetty最重要的是用到IJettyservice这个类,以及Ijetty中定义的一些环境常量,用默认值即可很好运行。注意Ijetty中的如下代码:static {__JETTY_DIR = new File(Environment.getExternalStorageDirectory(),
"jetty");// Ensure parsing is not validating - does not work with android
System.setProperty("org.eclipse.jetty.xml.XmlParser.Validating",
"false");
// Bridge Jetty logging to Android logging
System.setProperty("org.eclipse.jetty.util.log.class",
"org.mortbay.ijetty.AndroidLog");