Java网络编程精解讲义7.ppt
Java网络编程精解作者:孙卫琴作者:孙卫琴作者:孙卫琴作者:孙卫琴参考书籍:参考书籍:参考书籍:参考书籍:技术支持网址:技术支持网址:技术支持网址:技术支持网址:www.javathinker.orgwww.javathinker.org第7章 用Swing组件展示HTML文档参考Java网络编程精解的第7章n7.1 在按钮等组件上展示HTML文档n7.2 用JEditorPane组件创建简单的浏览器第7章 用Swing组件展示HTML文档nHTTP响应的正文部分可以是各种类型的数据,比如语音、图片、压缩文件和可执行程序等,而最常见的数据类型是HTML文档。n假定一个HTTP客户程序请求访问一个HTTP服务器上的一个hello.htm文件,以下是HTTP服务器发送的HTTP响应,其中粗体字部分是响应正文,它就是HTML文档,包含了hello.htm文件中的所有文本。HTTP/1.1 200 OKServer:nio/1.1Content-type:text/html;charset=GBKContent-length:102 helloapp hello第7课 用Swing组件展示HTML文档nJava对客户程序的通信过程进行了抽象,提供了通用的协议处理框架。这个框架封装了Socket,主要包括以下类:nURL类:统一资源定位器(Uniform Resource Locator),表示客户程序要访问的远程资源。nURLConnection类:表示客户程序与远程服务器的连接。客户程序可以从URLConnection中获得数据输入流和输出流。nURLStreamHandler类:协议处理器,主要负责创建与协议相关的URLConnection对象。nContentHandler类:内容处理器,负责解析服务器发送的数据,把它转换为相应的Java对象。n以上类都位于包中,除了URL类为具体类以外,其余的三个类都是抽象类,对于一种具体的协议,需要创建相应的URLConnection、URLStreamHandler和ContentHandler具体子类。第7课 用Swing组件展示HTML文档nHTTP客户程序必须解析以上HTTP响应,其中最主要的工作是解析HTML文档,然后在它的图形界面上显示该文档。由于HTTP客户程序的主要任务就是直观的展示HTTP服务器发回的信息,所以HTTP客户程序通常也叫做浏览器。以下图7-1是IE浏览器展示的hello.htm页面。JDK类库提供了一些现成的Swing组件,它们具有展示HTML文档的功能。7.1 在按钮等组件上展示HTML文档n大多数基于文本的Swing组件,如标签、按钮和菜单项等,都可以指定其文本为HTML文档,这些组件能正确的展示HTML文档。在以下例程7-1的HTMLDemo类创建的图形界面上,包括一个JLable和JButton对象,它们的文本都是HTML文档。例程7-1 HTMLDemo.java1.import java.awt.*;2.import java.awt.event.*;3.import javax.swing.*;4.public class HTMLDemo extends JFrame 5.private JLabel jLabel;6.private JButton jButton;7.1 在按钮等组件上展示HTML文档7.public HTMLDemo(String title)8.super(title);9.10.jLabel=new JLabel(Hello World!);11./假定go.jpg文件与HTMLDemo.class文件位于同一个目录下12.jButton=new JButton(13.);14./设置鼠标移动到该Button时的提示信息15.jButton.setToolTipText(开始);16.17.Container contentPane=getContentPane();18.contentPane.setLayout(new GridLayout(2,1);19.contentPane.add(jLabel);contentPane.add(jButton);20.pack();setVisible(true);21.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);22.23.public static void main(String args)new HTMLDemo(Hello);24.7.1 在按钮等组件上展示HTML文档nJButton和JLabel等Swing组件主要支持HTML中的用于指定静态文档或图片的格式的标记,如、和等。但它们不支持HTML3.2中的、和标记,并且不支持HTML4.0中的各种新标记,如、和等。7.2 用JEditorPane组件创建简单的浏览器njavax.swing.JEditorPane类对HTML文档提供了更有力的支持,它支持HTML3.2中的多数标记,能够处理框架、表单和超级链接。JEditorPane类有以下四个构造方法:n(1)public JEditorPane()n(2)public JEditorPane(URL initialPage)throws IOExceptionn(3)public JEditorPane(String url)throws IOExceptionn(4)public JEditorPane(String mimeType,String text)7.2 用JEditorPane组件创建简单的浏览器nJEditorPane类还提供了设置要展示的页面的方法:npublic void setPage(URL page)throws IOExceptionnpublic void setPage(String url)throws IOExceptionnpublic void setContentType(String type)npublic void setText(String text)n以上两个setPage()方法指定要展示的页面的URL,setContentType()方法指定文档的类型,可选值包括“text/html”和“text/plain”等,setText()方法指定文档的具体内容。7.2 用JEditorPane组件创建简单的浏览器n以下两段代码是等价的,它们创建的JEditorPane对象都展示变量text指定的HTML文档:/第一段程序代码String text=Hello World!;JEditorPane jep=new JEditorPane(text/html,text);/第二段程序代码String text=Hello World!;JEditorPane jep=new JEditorPane();jep.setContentType(text/html);jep.setText(text);7.2 用JEditorPane组件创建简单的浏览器n以下四段代码的作用是等价的,它们都创建了能展示www.javathinker.org网站的主页的JEditorPane对象:/第一段代码JEditorPane jep=new JEditorPane(http:/www.javathinker.org);/传入字符串类型参数/第二段代码URL url=new URL(http:/www.javathinker.org);JEditorPane jep=new JEditorPane(url);/传入URL类型参数/第三段代码JEditorPane jep=new JEditorPane();jep.setPage(http:/www.javathinker.org);/传入字符串类型参数/第四段代码JEditorPane jep=new JEditorPane();URL url=new URL(http:/www.javathinker.org);/传入URL类型参数jep.setPage(url);7.2 用JEditorPane组件创建简单的浏览器nJEditorPane类的实现依赖客户端协议处理框架与HTTP服务器通信,该客户协议处理框架的高层接口就是URL类。如图7-3所示,JEditorPane与URL类协作,就能实现一个简单的浏览器,其中JEditorPane负责展示HTML文档,而URL类负责与HTTP服务器通信。7.2 用JEditorPane组件创建简单的浏览器n 对于JEditorPane类展示的HTML页面,当用户选择页面上的超级链接,就会触发HyperlinkEvent事件,该事件由HyperlinkListener监听器负责处理。n JEditorPane的addHyperlinkListener()方法用于注册这种监听器。n 在 HyperlinkListener接 口 中 声 明 了 处 理HyperlinkEvent事件的方法:public void hyperlinkUpdate(HyperlinkEvent evt)7.2 用JEditorPane组件创建简单的浏览器nhyperlinkUpdate()方法有一个HyperlinkEvent类型的参数。在该方法的实现中,可通过HyperlinkEvent参数的以下方法获得用户选择的超级链接以及事件类型:ngetURL():返回一个URL对象,表示用户在页面上选择的超级链接。ngetEventType():返回一个HyperlinkEvent.EventType类的对象,表示具体的事件类型,可能的取值包括:n(1)HyperlinkEvent.EventType.ACTIVATED:选择了超级链接。n(2)HyperlinkEvent.EventType.ENTERED:鼠标进入超级链接区域。n(3)HyperlinkEvent.EventType.EXITED:鼠标退出超级链接区域。7.2 用JEditorPane组件创建简单的浏览器n以下hyperlinkUpdate()方法使得JEditorPane展示用户选择的超级链接:/*处理用户选择超级链接事件*/public void hyperlinkUpdate(HyperlinkEvent evt)try if(evt.getEventType()=HyperlinkEvent.EventType.ACTIVATED)jep.setPage(evt.getURL();/使JEditorPane展示用户选择的超级链接 catch(Exception e)jep.setText(无法打开网页:+evt.getURL().toString()+);7.2 用JEditorPane组件创建简单的浏览器n对于JEditorPane对象展示的HTML页面,当用户提交页面上的HTML表单时,如何处理表单呢?这首先由与JEditorPane对象关联的HTMLEditorKit对象控制,它的setAutoFormSubmission(boolean isAuto)方法决定处理表单的方式:n如果参数isAuto为true,就按自动方式提交表单,这是HTMLEditorKit的默认值。n如果参数isAuto为false,那么按手工方式提交表单,这种方式会触发一个javax.swing.text.html.FormSubmitEvent事件,FormSubmitEvent类是HyperlinkEvent类的子类,因此FormSubmitEvent事件也由HyperlinkListener监听器负责监听。7.2 用JEditorPane组件创建简单的浏览器nJEditorPane类有一个javax.swing.text.EditorKit类型的editorKit属性,它负责解析JEditorPane要展示的文档。当JEditorPane展示一个HTML文档时,editorKit属性会引用一个javax.swing.text.html.HTMLEditorKit对象。HTMLEditorKit类是EditorKit类的子类,HTMLEditorKit类专门负责解析“text/html”类型的文档。程序可以通过JEditorPane类的setEditorKit()方法来手工设置editorKit属性:JEditorPane jep=new JEditorPane();jep.setEditable(false);EditorKit htmlKit=jep.getEditorKitForContentType(text/html);jep.setEditorKit(htmlKit);7.2 用JEditorPane组件创建简单的浏览器n为了使得与JEditorPane关联的HTMLEditorKit对象按照手工方式提交表单,可以使JEditorPane注册一个java.beans.PropertyChangeListener监听器。当JEditorPane的editorKit属性被重新设置时,就会触发一个java.beans.PropertyChangeEvent事件,该事件由PropertyChangeListener监听器负责监听:/监听editorKit属性被重新设置的事件jep.addPropertyChangeListener(editorKit,new PropertyChangeListener()public void propertyChange(PropertyChangeEvent evt)System.out.println(set editorKit);EditorKit kit=jep.getEditorKit();if(kit.getClass()=HTMLEditorKit.class)(HTMLEditorKit)kit).setAutoFormSubmission(false);/按手工方式提交表单 );7.2 用JEditorPane组件创建简单的浏览器nJEditorPane还需要注册一个负责处理FormSubmitEvent事件的HyperlinkListener监听器,它的hyperlinkUpdate()方法的实现如下:1./*处理用户提交表单事件*/2.public void hyperlinkUpdate(HyperlinkEvent evt)3.try 4.if(evt.getClass()=FormSubmitEvent.class)/处理提交表单事件5.FormSubmitEvent fevt=(FormSubmitEvent)evt;6.URL url=fevt.getURL();/获得URL7.String method=fevt.getMethod().toString();/获得请求方式8.String data=fevt.getData();/获得表单数据 7.2 用JEditorPane组件创建简单的浏览器9.if(method.equals(GET)/如果为GET请求方式10.jep.setPage(url.toString()+?+data);11.else if(method.equals(POST)/如果为POST请求方式12.URLConnection uc=url.openConnection();13./发送HTTP响应正文14.uc.setDoOutput(true);15.OutputStreamWriter out=new OutputStreamWriter(uc.getOutputStream();16.out.write(data);17.out.close();7.2 用JEditorPane组件创建简单的浏览器18./接收HTTP响应正文 19.InputStream in=uc.getInputStream();20.ByteArrayOutputStream buffer=new ByteArrayOutputStream();21.byte buff=new byte1024;int len=-1;22.while(len=in.read(buff)!=-1)23.buffer.write(buff,0,len);24.25.in.close();26.jep.setText(new String(buffer.toByteArray();/展示响应正文27.28.System.out.println(fevt.getData()+|+fevt.getMethod()+|+fevt.getURL();29.30.catch(Exception e)jep.setText(无法打开网页:+evt.getURL().toString()+);31.32.7.2 用JEditorPane组件创建简单的浏览器n例程7-2的SimpleWebBrowser类实现了一个简单的浏览器,它能展示HTML文档,并且能处理用户选择超级链接事件和提交表单事件。练习题1n问题:对于以下程序代码:问题:对于以下程序代码:String text=Hello World!;JEditorPane jep=new JEditorPane();jep.setText(text);下面哪些说法正确?下面哪些说法正确?n选项选项:na)在在JEditorPane的界面上显示斜体的的界面上显示斜体的“Hello World!”nb)在在JEditorPane的界面上显示普通文本的界面上显示普通文本“Hello World!”nc)默认情况下,默认情况下,JEditorPane的内容类型为的内容类型为text/htmlnd)默认情况下,默认情况下,JEditorPane的内容类型为的内容类型为text/plainn答案答案:b,d练习题2n问题:当用户浏览由问题:当用户浏览由JEditorPane展示的网页,以下哪些行为会触发展示的网页,以下哪些行为会触发HyperlinkEvent事件?事件?n选项选项:na)用户选择超级链接用户选择超级链接nb)用户把鼠标移动到网页区域的任何位置用户把鼠标移动到网页区域的任何位置nc)用户提交表单用户提交表单nd)用户在网页区域内点击鼠标的右键用户在网页区域内点击鼠标的右键n答案答案:a,c练习题3n问题:问题:hyperlinkUpdate()hyperlinkUpdate()方法在哪个类中定方法在哪个类中定义?义?n选项选项:na)JEditorPanenb)HyperlinkEventnc)FormSubmitEventnd)HyperlinkListenern答案答案:d