




已阅读5页,还剩133页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
J2ME网络应用软件开发,J2ME网络应用软件开发实践,背景 随着3G和GPRS无线网络的推进,高速传送大量数据、视频信号和高质量的音频信号在无线网络成为可能。 无线移动设备从语音服务、增值服务发展到数据服务。,J2ME网络应用软件开发实践,Java语言非常适合无线设备编程的特点,支持广泛的网络协议,安全性好,平台交叉兼容,纯面向对象开发过程。,J2ME网络应用软件开发实践,移动电子商务平台 移动电子商务(Mobile Commerce,M-Commerce)是电子商务在移动网络中的应用,但是M-Commerce提供了比E-Commerce更灵活、更方便、更及时的信息服务 结合J2ME和J2EE技术,用户可以建立一个完整的移动电子商务平台,J2ME网络应用软件开发实践,J2ME结合GPRS和3G网络,具有较高的数据传送能力。 在基于J2ME-J2EE技术的电子商务中,数据的传输需要经过无线网络和有线网络。在通信过程中,移动设备段发送数据到无线基站,无线基站将接收到的数据发送到GPRS/3G网络中,通过GPRS/3G网络可以很方便地接入到Internet中,在Internet上数据被发送到企业网络进行会话。网络结构示意图如下:,J2ME网络应用软件开发实践,移动电子商务平台架构,J2ME网络应用软件开发实践,在建立电子商务平台时,由于移动终端资源有限,不可能直接对后台数据库进行访问,因此要想使移动设备终端能够访问到数据库系统,必须使用J2EE技术。一个移动电子商务系统必须建立移动终端程序(使用J2ME技术)和服务器端应用程序(使用J2EE技术)。 基于J2ME-J2EE的移动电子商务系统的架构如图所示:,J2ME网络应用软件开发实践,J2ME网络应用软件开发实践,在J2ME客户端,移动设备通过HTTP协议或XML连接到Web Server上,Web Server使用Servlet容器来处理客户端的连接和请求,并将请求发给过企业级服务器,由企业级服务器访问数据库并处理请求,处理结果通过Web Server发回客户端,J2ME网络应用软件开发实践,高级用户界面 MIDP用户界面的核心是屏幕,在移动信息设备中有且仅有一个屏幕是可见的,用户只能在这个屏幕中的各个组件之间进行切换 高级用户界面组件全部定义在javax.microedition.lcdui包中。包括高级屏幕对象和表单item组件两大类,其中的高级屏幕对象分成以下两大类: 1、封装了复杂的用户界面组件的对象,例如List, Alert, 和TextBox等,这些屏幕类的结构是预先定义好的,开发者不能在这些屏幕对象上添加其他组件 2、通用的屏幕对象,例如Form。开发者可以在这个屏幕对象上添加、删除、修改和组合各种Item组件,例如StringItem、TextField、Gauge等,J2ME网络应用软件开发实践,Display类和Displayable类 移动设备的屏幕被称为显示设备,应用程序是通过获取MIDlet程序的Display类的实例的引用来与显示设备进行交互的,J2ME网络应用软件开发实践,在使用Display类提供的功能以前,必须首先创建一个Display类的实例,创建该实例的时候,只能用Display类中的静态方法getDisplay() 来进行创建,该方法的声明如下: Public static Display getDisplay(MIDlet m),J2ME网络应用软件开发实践,使用该方法可以返回一个对应MIDlet类对象m的Display实例。例如在MyMIDlet类中创建一个Display实例,则可以使用如下的代码: Private Display display; Public MyMIDlet() display = Display.getDisplay(this); 因为以上代码定义在MYMIDlet类的内部,因此this关键字就代表MyMIDlet类本身 获得Display类的实例后,就可以调用Display类中的各种方法进行显示设备的管理,J2ME网络应用软件开发实践,高级屏幕对象:Form表单 Form类不同于其他的屏幕类仅仅实现单一的交互功能,它是作为一个容器,可以容纳Item类的子类的屏幕对象 Form类有两个构造函数: public Form(String title) public Form(Stgring title, Item items) 其中参数title设置Form表单的标题,参数items是创建Form时包含的Item组件,J2ME网络应用软件开发实践,第一个构造函数用来创建空表单,可以使用以下方法进行插入、追加和删除操作来编辑表单中的Item组件对象: append(Item item), delete(int itemNum), insert(int itemNum, Item item), set(int itemNum, Item item),J2ME网络应用软件开发实践,高级事件处理 Command软键 Command对象代表了一个命令按钮,其功能类似于Windows系统中的Button按钮。它必须被添加到一个Displayable屏幕对象上,当这个屏幕对象被显示时,所有与之关联的Command软键都会显示在手机屏幕下方的左右两侧,用户就可以通过手机键盘进行选择了,J2ME网络应用软件开发实践,Command的构造函数定义如下: public Command(String label, int commandType, int priority) 其中参数label表示命令标签,也就是显示在屏幕上的命令的名字,参数commandType表示命令类型,参数priority表示命令优先级 练习:编写MIDlet程序,创建两个Command软件Exit和OK。程序运行结果如下,J2ME网络应用软件开发实践,运行效果:,J2ME网络应用软件开发实践,CommandListener软键事件 在Command软件创建并被添加到屏幕对象上之后,还需要为屏幕对象添加Command软键的监听器CommandListener。J2ME采用授权事件模型,该模型包括:事件源和监听器。其中Command软件对象就是事件源,实现CommandListener接口的事件处理类就是监听器 当把监听器添加到屏幕对象上以后,监听器就能够捕获该屏幕对象上所有的Command对象所触发的事件,当用户按下Command软键时,将调用监听器中的事件处理方法里的代码,J2ME网络应用软件开发实践,在CommandListener接口中定义了一个事件处理方法commandAction(), 其具体语法定义如下: public void commandAction(Command command, Displayable displayable) 其中参数command表示当前触发事件的Command软键对象,参数displayable表示当前显示的屏幕对象 为了把监听器添加到屏幕对象上,Displayable类的子类中提供了setCommandListener()方法用来进行监听器的注册。,J2ME网络应用软件开发实践,如果在 MIDlet本类中实现了CommandListener接口,那么可以使用 setCommandListener(This) 如果参数设置为Null,则可以删除当前的监听器 练习:为MIDlet增加Command软键事件处理,J2ME网络应用软件开发实践,高级屏幕对象:Alert消息框 Alert的作用类似于Windows系统中的消息框,用于向用户提示一些警告信息、错误信息和确认信息。 在利用Display类的setCurrent()方法将它设置为当前显示的屏幕时,程序中必须存在另外一个屏幕,这样才能让Alert消息框有返回的屏幕。因此Alert不能被设置为第一个显示的屏幕,J2ME网络应用软件开发实践,模式消息框 一直停留在屏幕上,直到用户通过单击软键将它关闭为止,然后它将返回之前显示的屏幕 定时消息框 只是在屏幕上显示一段时间,然后自动消失 Alert消息框由两个构造函数: Public Alert(String title) Public Alert(String title, String alertText, Image alertImage, AlertType alertType),J2ME网络应用软件开发实践,在构造函数中没有指定超时时间,将采用默认的超时时间,可以在创建Alert实例之后使用setTimeout()方法来修改消息对话框的超时时间。例如下列代码创建了一个超时时间为3秒的定时消息对话框: Alert alert = new Alert(“First Alert”); alert.setTimeouot(3000); setTimeout()的参数以毫秒为单位 下面的代码创建了一个警告类型的消息对话框: Alert alert = new Alert(“AlertTest”,”Alarm Alert”, null,AlertType.CONFIRMATION) 练习:在MIDlet程序中创建Alert消息框,J2ME网络应用软件开发实践,运行结果,J2ME网络应用软件开发实践,高级屏幕对象:List列表 List是显示一组选项的屏幕,用户可以在这些选项中选择一个或多个选项。List列表有三种形式:单选列表、复选列表和隐式列表。在List列表中用户可以通过在选项之间移动来与列表进行交互,这种交互只有在列表选项被选择之后才发生。,J2ME网络应用软件开发实践,List列表有两个构造函数: Public List(String title, int listType) Public List(String title, int listType, String stringElements, Image imageElements) 第一个构造函数用来创建一个空的列表,其中参数Title表示列表的标题,listType表示列表的类型。,J2ME网络应用软件开发实践,第二个构造函数除了指定标题和类型外,还能通过数组的形式指定选项的文字和图片 列表的3种类型对应Choice接口中的常量值: Choice.EXCLUSIVE:单选列表,一次只能选择一个选项 Choice.MULTIPLE:复选列表,一次可以选择多个选项 Choice.IMPLICIT:隐式列表,与单选列表类似,只是选项前面没有选择框标记,并且用户的选择和确认可以使同时进行的,J2ME网络应用软件开发实践,创建空的列表之后,就可以在列表中插入、追加和替换选项。列表中的每个选项都由一个整数索引来表示它在列表中的位置。 注意:第一个选项的索引为0 List类提供了以下方法来对选项进行插入、追加和替换:,J2ME网络应用软件开发实践,public int append(String str, Image image) public void insert(int elementNum, String str, Image image) public void set(int elementNum, String str, Image image),J2ME网络应用软件开发实践,使用如下方法可以从列表中根据索引删除选项或删除所有选项: public void delete(int index) public void deleteAll() 使用如下方法可以根据索引获得对应选项的字符串或图像: public String getString(int index) public Image getImage(int index),J2ME网络应用软件开发实践,使用如下方法可以选取、取消选取或者获得列表当前选中项的索引: public void setSelectedIndex(int elementNum, Boolean selected) public int getSelectedIndex() 使用如下方法可以可以获取或者设置列表所有复选项的选取情况: public int getSelectedFlags(Boolean selectedArray) public void setSelectedFlags(Boolean returnselectedArray),J2ME网络应用软件开发实践,练习:信息调查系统,J2ME网络应用软件开发实践,高级屏幕对象:Ticker滚动条 Ticker类用来实现一个滚动条,显示一个连续滚过屏幕的字符串。滚动的字符串可以通过程序设置,但是滚动的方向和速度不能通过程序设定,也不能在程序中控制滚动的开始和结束,这些都是由MIDP实现决定的。 Ticker滚动条可以被放置在任何Screen类的屏幕上,而且一个Ticker实例可以在多个屏幕之间共享,当屏幕切换时,信息的显示是连续的,J2ME网络应用软件开发实践,Ticker类的构造函数定义如下: public Ticker(String str) 其中参数str是在滚动条中显示的文字 使用如下方法可以设置和获取滚动条中的字符串 Public void setString(String str) Public String getString() 创建滚动条之后,可以使用Screen类的setTicker()方法把滚动条添加到屏幕上。如果把setTicker()方法 的参数设置为null,则删除当前的滚动条,J2ME网络应用软件开发实践,练习:股票基金显示系统,J2ME网络应用软件开发实践,高级屏幕对象:TextFiled TextField是一个可编辑的文本组件,其创建和使用方法与TextBox类似 TextField的构造函数定义如下: public TextField(String label, String text, int maxSize, int constraints) 其中参数label和text分别表示标题和内容,参数maxSize表示最大能接受的字符个数,参数constraints表示输入约束,约束的定义与TextBox中的约束定义是共享的,J2ME网络应用软件开发实践,使用如下方法可以设置或者获取TextBox当前设置的约束: public void setMaxSize(int maxSize) public int getMaxSize() 使用如下方法可以设置或者获取TextField的全部内容: public void setString(String text) public String getString(),J2ME网络应用软件开发实践,另外还有一些方法可以对TextField中的文字进行插入、删除和替换操作: Public void insert(String src, int position) Public void insert(char data, int offset, int length, int position) Public void delete(int offset, int length) Public void setChars(char data, int offset, int length),J2ME网络应用软件开发实践,练习:个人信息管理系统,J2ME网络应用软件开发实践,通用连接框架(GCF) 通用连接框架为J2ME程序提供所有网络通信的基础。 通用连接框架位于javax.microedition.io包中,包含1个类、1个异常和15个接口 由于网络传送需要输入和输出,所以在实际编程中还要导入java.io包,J2ME网络应用软件开发实践,通用连接框架的API 通用连接框架的核心是Connector类,Connector类用于在GCF中打开不同类型的连接。 Connector类的静态方法open()接收一个String类型参数,这个参数标志了请求的连接类型和连接端点。原型如下: Connector.open(”protocol:address:parameters”),J2ME网络应用软件开发实践,GCF支持不同的连接协议。例如连接不同的类型: Connector.open(“socket:/地址:端口”) Connector.open(“http:/”) Connector.open(“datagrame:/地址:端口”),J2ME网络应用软件开发实践,打开连接读取数据的示例代码如下: String url=“” ContentConnection connection=(ContentConnection )Connector.open(url); InputStream istm=connection.openInputStream(); Int len = (int)connection.getLength(); If (len!=-1) byte data=new byte(len); istm.read(data); ,J2ME网络应用软件开发实践,建立HTTP连接 HTTP连接的创建可以调用Connector类的open()方法。此方法创建并返回打开的连接。 在建立连接时, 可以使用HttpConnection接口的如下方法来设置请求的方式 public void setRequestMethod(String method): 设置请求方式为POST、GET、HEAD等,默认情况下为GET,J2ME网络应用软件开发实践,在建立连接之后,可以使用HttpConnection接口如下操作方法,打开一个输入流,读取服务器中的数据: InputStream openInputStream(String url) 与之对应,可以使用如下操作方法,打开一个输出流,向服务器输出数据: OutputStream openOutputStream(String url),J2ME网络应用软件开发实践,在连接到服务器后,可以通过getResponseCode()方法返回服务器的相应代码,如200,404等。,J2ME网络应用软件开发实践,基于HTTP协议的网络软件开发过程 1、设置需要的URL URL的格式应该是 scheme:targetparms 其中,scheme表示协议的格式,target表示网络的地址,parms表示相关的参数。,J2ME网络应用软件开发实践,例如,可以定义URL如下: String url=“:8080/test.html” 在这个URL中,首先指明了所使用的网络协议是Http协议,接着表示网络地址是,所要获得的html文件在服务器根目录下,这是一个缺省目录,所以在服务器的地址后直接加上文件名即可。,J2ME网络应用软件开发实践,2、根据URL获得网络连接 通过Connector类的open方法可以获得网络连接。代码如下: hc=(HttpConnection)Connector.open(url); 所有获得网络连接的方式都是通过Connector类的静态方法open()来获得的。,J2ME网络应用软件开发实践,3、成功获得网络连接后,就可以准备读取服务器上的html文件了。不过,获得网络连接并不意味着万事大吉,因为此时还不知道网络连接的状态如何。用户可以通过HttpConnection接口的getResponseCode()方法来获取代表网络连接的状态代码,这些代码都是在HttpConnection接口中定义的静态成员变量,J2ME网络应用软件开发实践,代表成功的HTTP_OK的代码是200,而代表服务器上没有与URL匹配的文件的HTTP_NOT_FOUND的代码则是404。 4、确定网络连接的要求成功之后,可以用下面的代码读取服务器上的html文件:,J2ME网络应用软件开发实践,is = hc.openInputStream(); int ch; While(ch=is.read()!=-1) buffer.append(char)ch); result=buffer.toString(); result=new String(result.getBytes(“iso-8859-1”),”gb2312”); tb.setString(result);,J2ME网络应用软件开发实践,首先,需要通过HttpConnection对象的openInputStream()方法的到一个InputStream对象,取得后,可以通过InputStream对象的read()方法获得数据。Read()方法一次可以从InputStream对象中读取一个int类型数据,当读到数据末尾的时候,就会返回-1。可以利用这一性质,循环读取数据,当读到-1时,即表示数据读取完毕。在循环过程中,需要把读取出来的数据强制转化为char类型后再添加到字符串的末尾。,J2ME网络应用软件开发实践,循环读取之后,可以利用StringBuffer对象的toString()得到包含html文件内容的String 对象,不过如果直接显示在TextBox对象上,中文会显示为乱码,这是由于编码方式不一致所造成的。所以在显示之前先要进行转码工作。 先利用String类的getBytes()方法传入“iso-8859-1”作为参数,得到依据iso-8859-1编码方式的字符串的byte类型数组。接着在String 类的构造其中,以得到的byte类型数组作为第一个参数,接着以“gb2312”作为第二个参数,这意味着String类会将byte类型数组中的数据以gb2312编码方式构造字符串,这样就解决了乱码的问题。,J2ME网络应用软件开发实践,5、在程序的最后,要关闭InputStream对象和HttpConnection对象,为了在发生异常情况下也能关闭,选择在finally语句中关闭InputStream对象和HttpConnection 对象。 注:进行联网时,应该把联网的代码放在线程中运行。,J2ME网络应用软件开发实践,创建线程 方式1 实现Runnable接口,代码实例如下:,J2ME网络应用软件开发实践,public class TestThread1 public static void main(String args) Runner1 r = new Runner(); Thread t = new Thread(r); t.start(); class Runner implements Runnable public void run() for (int i = 0; i 30; i+) System.out.println(“NO.“,+i); ,J2ME网络应用软件开发实践,程序运行结果是输出字符串“No.0”到“No.29”。程序中创建Thread对象并调用其start方法的过程就是一个新线程的创建和启动的过程。其一般步骤为: 1. 定义一个类实现Runnable接口,重写其中的run()方法,加入所需的处理逻辑; 2. 创建Runnable接口实现类的对象;,J2ME网络应用软件开发实践,3. 创建Thread类的对象( 将前面Runnable接口实现类的对象作为参数); 4. 调用Thread对象的start()方法,启动线程 在程序TestThread1.java中,实际上存在两个线程。应用程序的main()方法由java虚拟机启动,这本身就是一个线程,也称为主线程。线程 t 是在主线程中被创建的,也称为子线程,而主线程则为子线程的父线程。,J2ME网络应用软件开发实践,Java中引入线程机制的目的在于实现多线程,以提高程序的效能。这主要是通过多线程之间共享代码和数据实现的。,J2ME网络应用软件开发实践,创建线程的第二种方式 在前面的例子中,通过定义Runnable接口的实现类,重写其中的run()方法来提供线程体,这是创建线程的基本方式。除此之外,还可以采用直接继承Thread类,重写其run()方法并以之作为线程体的方式创建线程。代码实例如下:,J2ME网络应用软件开发实践,public class TestThread2 public static void main(String args) Thread t = new Runner2(); t.start(); class Runner2 extends Thread public void run() for (int i = 0; i 30; i+) System.out.println(“NO.“+i); ,J2ME网络应用软件开发实践,该程序与前面的代码实例运行结果相同。可以看出,第二种方式创建线程的一般步骤为: 1. 定义一个类继承Thread类,重写其中的run()方法,加入所需的处理逻辑; 2. 创建该Thread子类的对象; 3. 调用该对象的start()方法;启动线程。,J2ME网络应用软件开发实践,Servlet与Servlet容器 通过浏览器上网的过程,实际上是浏览器通过HTTP协议和Web服务器进行交互的过程。网络资源存在于服务器端,客户端发出请求,服务器端对请求作出响应,将用户请求的资源发送到客户端。现在用户所访问的网络资源不仅仅局限于服务器硬盘上的静态网页,更多的应用需要根据用户的请求动态生成页面信息。比如可能需要查询数据库,根据一定的规则进行统计计算,生成报表页面发往请求者的浏览器端。这样的增强功能,就需要服务器端的软件实现了。,J2ME网络应用软件开发实践,要实现上述功能,可以想象有以下方法: 方法一:遵循HTTP协议实现一个服务器端软件。这种方法较为复杂,且不能适应应用的广泛性。 方法二:已经实现HTTP协议的Web服务器端软件预先为我们留出扩展接口,我们只需按一定的规则去提供相应的扩展功能。这种方式的好处是我们不需要对HTTP有过多的了解,HTTP协议的实现由Web服务器完成,我们只需根据应用开发相应模块。在用户看来,Web服务器端就是一个整体,在为他提供服务。,J2ME网络应用软件开发实践,Java提供了编写扩展功能的技术 Servelet,J2ME网络应用软件开发实践,Java提供了编写扩展功能的技术 Servelet 服务器接受客户请求并作出响应的过程,J2ME网络应用软件开发实践,客户端(通常是浏览器)访问Web服务器,发送HTTP请求 Web服务器接收到请求后,传递给Servlet容器 Servlet容器加载Servlet, 产生Servlet 实例后,向其传递表示请求和响应的对象 Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。 Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器,J2ME网络应用软件开发实践,如何编写Servlet: Servlet的API包含在javax.servlet和javax.servlet.http中,这两个包定义了Servlet与Web服务器交互的接口。对基于HTTP协议的Servlet需要同时引入javax.servlet和javax.servlet.http包 所有的Servlet类必须实现javax.servlet.Servlet接口,或者继承实现了Servlet接口的父类(比如HttpServlet),J2ME网络应用软件开发实践,一般来说,我们使用的Servlet都是基于HTTP协议的,所以编写的Servlet对象一般都继承HttpServlet父类 Servlet接口共有5种方法 1) void init(Servlet Request request, ServletResponse response) 此方法对应了初始化阶段的行为,可以在这个方法中完成加载数据库驱动、初始化变量等工作,J2ME网络应用软件开发实践,2) Void service(ServletRequest request, ServletResponse response) 每当有客户端请求时,该方法就被调用。容器会传递给该方法一个请求对象和一个响应对象作为参数。可以通过请求对象获取IP地址、HTTP请求类型(GET、HEAD、POST等)。响应对象用于完成Servlet与客户端的交互。通过调用getOutputStream()取得向客户端进行输出的输出流,向客户端发送HTML元素。,J2ME网络应用软件开发实践,3) Void destroy() 在Servlet实例消失之前(容器关闭或需要更多的内存)调用该方法。在service方法的所有线程都退出时或超时的时候利用该方法释放所有占用的资源 4) ServletConfig getServletConfig() 该方法返回初始化参数和Servelet环境信息 5) java.lang.String getServletInfo() 定义一些Servlet的信息,如作者、版本等,J2ME网络应用软件开发实践,将以上5个方法结合起来就可以编写一个简单的Servlet 对于继承HttpServlet的Servlet来说,在HttpServlet类中已经存在service()方法。其缺省时调用与HTTP请求的方法相应的do方法。如果HTTP请求方式为GET,则缺省调用doGET()。如果请求方式为POST,则调用doPost()。 所以 此时的Servlet对象不必覆盖service()方法,只需要覆盖相应的do方法即可。,J2ME网络应用软件开发实践,doGet()和doPost()函数的两个参数为HttpServletRequest和HttpServletResponse 对象。 HttpServletRequest表示浏览器请求,可以通过这个类获取浏览器发送到服务器的任何信息。 HttpServletRequest的常用方法包括: 1)String getParameter(String name) 获取制定变量名name所对应的参数值。即得到GET或POST命令中所带的参数值。,J2ME网络应用软件开发实践,2)String getParameterValues(String name) 与上面方法类似。当要获取这类会返回多个值的表单属性时,就应当用这种方法。 3)String getMethod() 返回字符串“GET”或“POST” 4)String getRequestURI() 获取请求的URI,J2ME网络应用软件开发实践,5)String getServletPath() 获取Servlet的路径 6)Void setCharacterEncoding(String new) 设置请求的编码。需要处理汉字时务必要通过该方法设置正确的字符编码,否则将无法正确读取浏览器发过来的文字。,J2ME网络应用软件开发实践,HttpServletRespose的常用方法包括: 1)Void setContentType(String type) 设置返回值得类型。输出汉字之前,务必通过该方法指定输出的字符编码。 2)ServletOutputSream getOutputStream() 向客户端发送二进制数据时,需要通过此方法获取输出流。 3)PrintWriter getWriter() 向客户端发送文本数据时,需要通过此方法获取输出流。,J2ME网络应用软件开发实践,编写一个Servlet时,开发者只需实现特定的接口,定义如何去处理请求。而类似参数如何传递等细节都有容器来实现,不需要开发者操心。,J2ME网络应用软件开发实践,实例:SimpleHello 功能:向客户端输出一个字符串“Hello World” 步骤1:编写SimpleHello.java文件 编写Servlet,实际上就是编写一个实现了javax.servlet.Servlet 接口的类。Servlet API中给我们提供了支持HTTP协议的javax.servlet.http.HttpServlet类,我们只要从HttpServlet类中派生一个子类,在子类中完成相应的功能就可以了。,J2ME网络应用软件开发实践,首先在%CATALINA_HOME%webapps目录下新建一个子目录smp1,然后用文本编辑器编写SimpleHello.java源文件,将编好的SimpleHell.java源文件放到%CATALINA_HOME%webappssmp1src目录下。 完整的源代码如下:,J2ME网络应用软件开发实践,import javax.servlet.ServletException; import java.io.*; import javax.servlet.http.*; public class SimpleHello extends HttpServlet public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException PrintWriter out = resp.getWriter(); out.println(“Hello World“); out.close(); ,J2ME网络应用软件开发实践,步骤2:编译SimpleHello.java 打开命令提示符,转到SimpleHello.java所在的目录%CATALINA_HOME%webappssmp1src下,然后执行: javac SimpleHello.java 生成SimpleHello.class文件 注意:如果java编译器没有找到javax.servlet和java.serlet.http这两个包就会产生错误。我们需要让Java编译器知道 Servlet API库所在的位置。 环境变量设置如下(我的电脑/高级/环境变量): Path:;C:Program FilesJavajdk1.6.0_01bin CLASSPATH:C:Program FilesApache Software FoundationTomcat 5.0commonlibservlet-api.jar,J2ME网络应用软件开发实践,在Tomcat中已经包含了Servlet API库,是以 JAR文件形式提供的,其完整路径是: %CATALINA_HOME%commonlibservlet-api.jar 我们只需要在系统的CLASSPATH环境变量中添加这个JAR文件的路径名就可以了。,J2ME网络应用软件开发实践,步骤3:部署Servlet 一个Web应用程序以结构化、有层次的目录形式存在。Web应用程序的资源文件都要部署在相应的目录层次中。通常将Web应用程序的目录放到%CATALINA_HOME%webapps下。要建一个新的Web应用程序,可以在webapps下先建一个目录。本例中所建的目录是smp1,作为第一个Web应用程序的根。,J2ME网络应用软件开发实践,Servlet规范中定义的Web应用目录层次结构,J2ME网络应用软件开发实践,在%CATALINA_HOME%webappssmp1目录下新建一个目录WEB-INF,进入WEB-INF,新建一个classes目录,整个目录结构是: %CATALINA_HOME%webappssmp1 WEB-INF classes 将编译生成的SimpleHello.class文件放到WEB-INF classes目录下。,J2ME网络应用软件开发实践,接下来,需要部署这个Servlet。 Web应用程序的配置和部署是通过web.xml文件来完成的。 web.xml被称为Web应用程序的部署描述符。 在web.xml中使用和元素来部署Servlet:,J2ME网络应用软件开发实践, helloworld SimpleHello helloworld /hello ,J2ME网络应用软件开发实践,元素用来声明Servlet 子元素用来指定Servlet的名字。在同一个Web应用程序中,每一个Servlet的名字必须是唯一的,该元素的内容不能为空。 子元素用于指定Servlet 类的完整限定名(如果有包名,要同时给出包名)。,J2ME网络应用软件开发实践,元素用于在Servlet和URL样式之间定义一个映射。 它的子元素指定的Servlet名字必须和元素中的子元素给出的名字相同。 子元素用于指定对应于Servlet的URL路径,该路径是相对于Web应用程序的路径。,J2ME网络应用软件开发实践,经这样的配置后,就可以通过http:/localhost:8080/smp1/hello来访问SimpleHello这个Servlet了。 步骤4:访问SimpleHello 当部署好Servlet后,对客户端来说,访问Servlet和访问静态页面没有什么区别。打开IE,在地址栏中输入 http:/localhost:8080/smp1/hello 注意hello后面不要加斜杠(/)然后回车,即可看到结果。,J2ME网络应用软件开发实践,实例2:WelcomeYou 编写一个带表单的HTML页面,表单中提供了一个文本域,让用户输入他的姓名,然后提交给Servlet处理。在Servlet中,从提交的表单信息中提取出用户姓名。然后加上欢迎信息到客户端。 步骤1:编写welcome.html文件 将编好的welcom.html文件放到%CATALINA_HOME%webappssmp1 目录下。完整代码如下:,J2ME网络应用软件开发实践,在HTML代码中,我们先假设对此表单进行处理的Servlet是welcome,表单采用的提交方法是get.,J2ME网络应用软件开发实践,步骤2:编写WelcomeYou.java 编写好WelcomYou.java源文件,将其放到%CATALINA_HOME%webappssmp1src目录下。完整源代码如下:,J2ME网络应用软件开发实践,J2ME网络应用软件开发实践,HttpServletRequest对象封装了客户端的请求信息,要获得请求参数中某个参数的值,可以调用HttpServletRequest的getParameter()方法,传递参数的名字。注意getParameter()方法的参数”user”和表单中用于输入用户姓名的文本域的名称“user”必须是一致的。 步骤3:编译WelcomYou.java 打开命令提示符,转到在WelcomeYou.java所在的目录%CATALINA_HOME%webappssmp1src下,然后执行:javac WelcomeYou.java,J2ME网络应用软件开发实践,步骤4:部署Servlet 将WelcomeYou.class文件放到%CATALINA_HOME%webappssmp1WEB-INFclasses目录下,打开%CATALINA_HOME%webappssmp1WEB-INF目录下的web.xml,添加对本例中的Servlet的配置,部分内容如下:,J2ME网络应用软件开发实践, welcome WelcomeYou welcome /welcome ,J2ME网络应用软件开发实践,注意:在支持低版本的Servlet规范(2.4以前)的Web服务器中,所有的元素必须出现在所有的元素之前。 步骤5:访问WelcomeYou 启动Tomcat服务器,打开IE,在地址栏中输入 http:/localhost:8080/smp1/welcome.html 出现页面后,在文本域中输入用户姓名,单击提交按钮,将看到结果页面。 注意IE的地址栏部分,welcome.html页面采用的表单提交方法是get,所以提交的数据被附加到请求URL的末端,作为查询字符串发送到服务器端。,J2ME网络应用软件开发实践,步骤6:将提交方法改为post,如下: 保存后打开IE,在地址栏中输入http:/localhost:8080/smp1/welcome.html 输入用户名后,单击“提交”按钮,将看到如下页面提示:HTTP Status 405-HTTP method POST is not supported by this URL 这是因为WelcomeYou类中没有重写doPost()方法,而HttpServlet类的doPost()方法的默认实现是返回状态码为405的HTTP错误,表示对于指定资源的请求方法不被允许。,J2ME网络应用软件开发实践,如果要对post请求作出响应,需要在WelcomeYou这个类中覆盖基类的doPost()方法。 在doPost()方法中,可直接调用doGet()方法对post请求进行处理,这样,不管是get请求还是post请求,处理结果都是一样的。 采用post方法提交表单时,提交的数据作为请求正文的内容发送到服务器端,所以在URL中就看不到附加的请求数据了。通常如果数据量小,数据中又没有密码等敏感信息,可以采用get 方法提交表单。如果数据量较大,或者有安全方面的考虑,最好采用post方法提交表单。,J2ME网络应用软件开发实践,实例3:LoginServlet 编写一个登录页面,用户输入用户名和密码后,将表单提交给LoginServlet进行处理。在Servlet中,判断用户名和密码是否正确,如果正确,利用重定向向用户返回登录成功页面;如果失败,则向用户返回一个HTTP错误信息。 步骤1:将编写好的login.html文件放到%CATALINA_HOME%webappssmp1目录下。完整代码如下:,J2ME网络应用软件开发实践,J2ME网络应用软件开发实践,在HTML代码中,先假定对此表单进行处理的Servlet是login,因为提交的数据中包含了用户密码,所以表单的提交方法我们采用post。 步骤2:编写success.html文件 将编写好的success.html文件放到%CATALINA_HOME%webappssmp1目录下。完整的代码如下:,J2ME网络应用软件开发实践,步骤3:编写LoginServlet.java 将编写好的LoginServlet.java源文件放到%CATALINA_HOME%webappsmp1src目录下,完整代码如下:,J2ME网络应用软件开发实践,J2ME网络应用软件开发实践,HttpServletRespons接口中定义的常量SC_SERVICE_UNAVAILABLE表示HTTP错误代码503。 步骤4:编译LoginServlet.java 打开命令提示符,进入%CATALINA_HOME%webappssmp1src目录,然后执行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年智能可穿戴设备跌倒检测技术在老年人生活品质改善中的创新实践
- 离婚协议中知识产权归属与放弃财产权益协议
- 影响因素中期汇报
- 离婚后双方共同债务清偿与房产过户补充协议
- 夫妻离婚协议中股权、股票分割及共同债务清算范本
- 高端离婚子女抚养费及父母赡养责任及财产分割协议
- 文化创意产业园区国有土地租赁与知识产权保护合同
- 私有房屋买卖合同含房屋改造及装修规范要求
- 离婚案件调解与子女抚养权维护与财产分割合同
- 农业综合开发项目种子农药化肥配套服务协议
- 第2课《中国人首次进入自己的空间站》课件-2025-2026学年统编版语文八年级上册
- 罗茨风机检修方案课件
- 2025年青协社团笔试题目及答案
- 光伏电站智能监控系统建设方案
- 儿童户外安全培训课件
- 供水工程成本预算与动态控制方案
- 护栏供应及安装合同范本
- 2025年反假货币试题题库及答案
- 现房与期房培训课件
- 2024年仙桃市高新技术产业投资有限公司招聘笔试真题
- 汽车知识培训讲师简介课件
评论
0/150
提交评论