1.首先下载ijetty,并安装到android设备上。http://code.google.com/p/i-jetty/downloads/list
下图,左边的是webapp 安装部署界面,其实就是将其自带的示例webapp安装到sdcard上。
右边是ijetty服务器控制台,点击start jetty就开启了服务。
这个app的源码先不研究。
2.如果你想要看看其自带的webapp示例,可以从google code下载:
google code的下载方式(需要svn):windows命令行 svn checkout
http
://i-jetty.googlecode.com/svn/trunk/ i-jetty-read-only
下载后目录为...\administrator\i-jetty-read-only\ 里面的console文件夹下有个webapp目录,里面就是webapp的android源码了,这个app复杂一些,带有javascript。另外还带了一个极简单的example-webapps,可以瞧瞧。
3.下面开始以本日志的主题---图片验证码,为例,也演示一下android webapp的开发流程
1)在eclipse中新建一个Dynamic Web Project
2)新建源码
ServletDraw
.java
- package com.qylk.webview;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.util.Random;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import android.graphics.Bitmap;
- import android.graphics.Bitmap.Config;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- public class ServletDraw extends HttpServlet {
- private static final long serialVersionUID = 1L;
- protected static Random random = new Random();
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doPost(req, resp);
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {// TODO Auto-generated metho
- req.setCharacterEncoding("utf-8");
- resp.setContentType("image/jpeg"); // 设置输出类型为jpeg图片
- ServletOutputStream out = resp.getOutputStream(); // 得到二进制输出流
- String codestr = creatCodeImg(out);
- req.getSession().setAttribute("rand", codestr); // 保存到session里面
- }
- private String creatCodeImg(ServletOutputStream out) {
- int width = 170;
- int height = 125; // 验证图片的宽度,高度
- String code = getString();
- Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- canvas.drawColor(Color.WHITE);
- Paint paint = new Paint();
- paint.setTextSize(30);
- paint.setColor(Color.BLUE);
- canvas.drawText(code, 55, 70, paint);
- for (int i = 0; i < 1; i++) {
- canvas.drawLine(0, 60, 175, 60, paint);
- }
- for (int i = 0; i < 255; i++) {
- canvas.drawPoint(random.nextInt(width), random.nextInt(height),
- paint);
- }
- canvas.save(Canvas.ALL_SAVE_FLAG);
- canvas.restore();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
- try {
- out.write(baos.toByteArray());
- out.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return code;
- }
- /**
- * @desc 产生随机字符
- * @author aj
- * @date 2011-3-30
- * */
- protected static String getString() {
- String old = "123456789abcdefghijkmnpqrstuvwxyz"; // 验证图片上面的随机字符
- StringBuffer sb = new StringBuffer();
- int j = 0;
- for (int i = 0; i < 4; i++) {
- j = random.nextInt(old.length());
- sb.append(old.substring(j, j + 1));
- }
- return sb.toString();
- }
- @Override
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
- }
- }
3)根据实际开发需要,可能需要引入支持包(这些支持包在你的sdcard卡上,ijetty自带的webapps/console/web-inf/lib下可以找到,把它们导出来放到本地硬盘某个固定目录下统一管理)。
另外必须需要servelt-api.jar和android.jar,如果安装了tomcat,这个包
servelt-api.jar
会自动加上,android.jar在android-sdk目录下\platforms\android-xx里面,手动将其引入本工程。本例因为就一个java文件,没涉及到太多api,因此除了servelt-api.jar需要注意一下,其他如果没有错误,就可以了。
4)在WebContent\Web-inf配置web.xml:
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <web-app 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_3_0.xsd"
- version="3.0">
- <servlet>
- <servlet-name>draw</servlet-name>
- <servlet-class>com.qylk.webview.ServletDraw</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>draw</servlet-name>
- <url-pattern>/codeimg/*</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- <welcome-file>index.htm</welcome-file>
- <welcome-file>default.html</welcome-file>
- <welcome-file>default.htm</welcome-file>
- </welcome-file-list>
- </web-app>
5)在WebContent目录下新建index.html,用来显示验证码图片(
需要注意:ijetty默认还不支持jsp页面)
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>code image</title>
- <script type="text/javascript">
- function change() {
- document.getElementById("codeimg").src = "codeimg";
- };
- </script>
- </head>
- <body>
- <span> <img src="codeimg" id="codeimg"
- style="margin-left: 12px;" onclick="change();" title="看不清" />
- </span>
- </body>
- </html>
6)一个简单的webapp完成了,接下来将编译的class文件打包,利用android-sdk自带的dx.jar,为了方便,提供一个bat脚本一键完成打包工作和webapp上传至sdcard的工作:
在工程目录下,新建GenerateClassZipAndPush.bat
- ECHO 确保你已经设置了ANDROID_HOME环境变量
- pause
- @set ANDROID_DIR=%ANDROID_HOME%
- call %ANDROID_DIR%\platform-tools\dx --dex --output=%cd%\WebContent\WEB-INF\lib\classes.zip %cd%\build\classes
- echo dx success
- adb push %cd%\WebContent /mnt/sdcard/jetty/webapps/myweb
- echo push success
- pause
在windows资源管理器下执行此脚本(不要直接在eclipse里面点击执行,因为发现路径有点问题),不出问题的话,然后就可以在
WebContent\WEB-INF\lib下看到
classes.zip(几个kb大小),上面的脚本最后将整个WebContent目录上传到/sdcard/jetty/webapps/目录下,取名为myweb,为了这一步不出错,adb push 应该确保可以执行,另外工程的绝对路径不能带空格和汉字,工程里面也不允许出现中文名的文件。
7)一切完成后,将PC与android设备wifi连接,打开ijetty,点击start jetty就开启服务器了,接着在浏览器中输入android设备的ip地址和默认端口,例如:192.168.0.110:8080,看看效果吧(以下是在Chrome浏览器里的效果)。