1、Java Wb开发技术教程,第13章 Java Web开发常用功能,主要内容,文件上传 分页处理 JavaMail 树状菜单,文件上传,在Java的Web开发中没有对文件的上传进行封装,需要自己开发一个Servlet或者JavaBean处理上传或下载的任务。 从HttpServletRequest中获得客户端请求的输入流。 通过输入流中读取指定的文件,将文件保存在指定的位置。,文件上传,jspSmartUpload 组件是一个免费使用的文件上传组件,它的使用简单,功能齐备。 通过该组件,可以获得上传文件的全部信息(包括文件名、大小、类型、扩展名、文件数据等),同时还可以对上传文件的大小、类型等
2、方面进行限制。 在使用时需要把该组件的jar文件放到站点WEB-INF目录的lib中。,文件上传,jspSmartUpload组件中包括File、Files、Request、SmartUpload等类。 File:包括上传文件的所有信息,如:上传的文件名、大小、扩展名、文件数据等。 Files:所有上传文件的集合。从中可以获得上传文件的数目、大小等。 Request:相当与JSP中的request对象,如果在上传的表单中还有其它的表单项的值,必须通过jspSmartUpload组件中的Request对象获取。 SmartUpload:完成文件上传。 。,单元项目1-采用jspSmartUplo
3、ad 组件上传文件,项目构思:采用jspSmartUpload 组件将客户端的doc和txt文件上传到Web服务器。 项目设计: 创建一个JSP文件用于客户端的文件上传界面。 将jspSmartUpload组件加入到项目中。 创建一个Servlet用于处理上传的文件。,单元项目1-采用jspSmartUpload 组件上传文件,项目实施: 创建一个JSP文件upload.jsp:(主要代码如下)文件描述: 文件名称:,注意:form表单中必须添加method=“post“与enctype=“multipart/form-data”属性。,单元项目1-采用jspSmartUpload 组件上传文
4、件,项目实施: 将jsmartcom_zh_CN.jar文件拷贝到项目目录的WEB-INF/lib下。 在Servlet中处理上传文件。,单元项目1-采用jspSmartUpload 组件上传文件,项目实施: 在Servlet中处理上传的文件主要代码:SmartUpload mySmartUpload = new SmartUpload();int count = 0;/上传文件的数量try mySmartUpload.initialize(this.getServletConfig(), request, response);/ 限制每个上传文件的最大长度。mySmartUpload.set
5、MaxFileSize(50 * 1024 * 1024);/ 设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。mySmartUpload.setAllowedFilesList(“doc,txt“);mySmartUpload.upload();/获得上传的文件File myfile = mySmartUpload.getFiles().getFile(0);/获得上传文件的名字String fileName = myfile.getFileName();/保存文件的目录count = mySmartUpload.save(“/upload“);/获得文件的描述信息Reque
6、st re=mySmartUpload.getRequest();String desc=re.getParameter(“desc“);out.println(count + “ file uploaded.“);out.println(“file description:“+desc); catch (Exception e) out.println(“Unable to upload the file.“);out.println(“Error : “ + e.toString();,文件上传,jspSmartUpload组件使用灵活,适合较小文件的传输,如果传输数据较大,则采用comm
7、ons-fileupload组件。 commons-fileupload组件的下载地址为http:/commons.apache.org/fileupload/。 使用commons-fileupload组件的时候需要将其jar文件放到站点目录WEB-INF/lib下同时还有加入commons IO的jar包。其下载的地址是http:/commons.apache.org/downloads/download_io.cgi(commons-io-1.4.jar)。,文件上传,mons.fileupload包中包括了在commons-fileupload组件所有的类。 DiskFileItemF
8、actory:代表本地的磁盘文件。 FileItem:代表每组数据的接口。 ServletFileUpload:获得上传文件。,单元项目2-采用commons-fileupload组件上传文件,项目构思:采用commons-fileupload组件将客户端的doc和txt文件上传到Web服务器。 项目设计: 创建一个JSP文件用于客户端的文件上传界面。 将commons-fileupload组件加入到项目中。 创建一个Servlet用于处理上传的文件。,单元项目2-采用commons-fileupload组件上传文件,项目实施: 创建一个JSP文件fileupload.jsp。 将common
9、s-fileupload-1.2.1.jar和commons-io-1.4.jar文件拷贝到项目目录的WEB-INF/lib下。,单元项目2-采用commons-fileupload组件上传文件,项目实施: 创建一个Servlet实现文件上传。/实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); / 设置缓冲区大小,这里是4kb ServletFileUpload upload = new Se
10、rvletFileUpload(factory); /用以上工厂实例化上传组件 upload.setSizeMax(4194304); / 设置最大文件尺寸,这里是4MB String uploadPath = this.getServletContext().getRealPath(“/upload“);/ 设置上传的地址 List items = upload.parseRequest(request); / 得到所有的上传文件 Iterator it = items.iterator(); while (it.hasNext() /逐条处理FileItem fi = (FileItem)
11、 it.next(); /得到当前文件/检查当前项目是普通表单项目还是上传文件if (fi.isFormField() /如果是普通表单项目,显示表单内容。if (“desc“.equals(fi.getFieldName() out.println(“file description:“+fi.getString();else/获得上传的文件String path = fi.getName(); / 得到文件的完整路径String filename = path.substring(path.lastIndexOf(“) + 1); / 得到去除路径的文件名fi.write(new File
12、(uploadPath, filename); /将文件保存在Web目录的upload文件夹中out.println(filename + “ file uploaded.“); ,分页处理,在Web开发中,分页处理显示数据是最基本的功能。分页显示是将数据库中的数据依次部分地显示出来。通过分页处理可以提高页面访问速度,美化页面。在实际开发中有很多分页的解决方案,大致可以分为以下两种: 利用结果集(ResultSet)来处理。 采用SQL语句处理。,分页处理,利用结果集(ResultSet)来处理。 通过ResultSet的absolute()方法获得指定行位置的记录。 当用户第一次请求数据查询
13、时,就执行SQL语句查询,获得的ResultSet对象及其要使用的连接对象都保存到其对应的会话对象中。 以后的分页查询都通过第一次执行SQL获得的ResultSet对象定位取得指定行位置的记录。 最后在用户不再进行分页查询时或会话关闭时,释放数据库连接和ResultSet对象等数据库访问资源。 这种方式对数据库的访问资源占用比较大,并且其利用率不是很高。 优点是减少了数据库连接对象的多次分配获取,减少了对数据库的SQL查询执行。,分页处理,采用SQL语句处理。 在用户的分页查询请求中,每次可取得查询请求的行范围的参数。 使用这些参数取得指定行范围的SQL查询语句,并执行SQL查询。 把查询的结
14、果返回给用户,最后释放数据库访问资源。 采用这种方式需要每次请求时都要执行数据库的SQL查询语句;对数据库的访问资源使用完毕就立即释放,不占用数据库访问资源。 其缺点是: 对不同的数据库使用的查询语句是不同的。 每次均执行数据库SQL查询操作。对数据库有一定的影响。,单元项目3-分页功能的实现,项目构思:采用MVC模式实现分页功能。将表中的数据按照分页的方式显示到页面。 项目设计:根据MVC的分层原则,将分页显示的功能分为3个层次。 模型层:用于代表数据表的数据Bean、用于在页面传输数据的PageBean、用于获得分页数据的逻辑Bean 。 控制层:用Servlet完成分页控制操作。 视图层
15、:采用JSP页面显示分页数据。,单元项目3-分页功能的实现,项目实施 : 创建用于在页面中传输数据的PageBean。 public class PageBean private int curPage; /当前页数private int totalPages; /总页数private int totalRows; /总行数private int pageSize; /每页显示行数private List data; /每页显示的数据省略get、set方法 PageBean的主要功能是在视图和控制层之间传输数据,里面封装了需要显示的分页信息和分页的数据。,单元项目3-分页功能的实现,项目实施
16、: 创建数据Bean:Emp。 创建连接工具类:DBUtil 。,单元项目3-分页功能的实现,项目实施 : 创建逻辑Bean EmpDAO,获得分页数据 。 List ary=new ArrayList(); Connection conn=DBUtil.getConnection(); PageBean bean=new PageBean(); /创建PageBean bean.setPageSize(2); /设置每页显示行数 bean.setCurPage(page); /获得当前的页数 bean.setTotalRows(getEmpRows(); /获得总行数 int offset=
17、(bean.getCurPage()-1)*bean.getPageSize();/起始数据的行数 int rows=bean.getPageSize(); /要显示的记录数 try tatement stmt=conn.createStatement();String sql=“select * from emp limit “+offset+“,“+rows; /利用MySQL的limit函数实现分页ResultSet rs=stmt.executeQuery(sql);while(rs.next()Emp emp=new Emp();emp.setId(rs.getInt(“id“);e
18、mp.setAge(rs.getInt(“age“);emp.setName(rs.getString(“name“);emp.setSalary(rs.getFloat(“salary“);ary.add(emp);bean.setData(ary); /获得页面的数据rs.close();stmt.close(); catch (SQLException e) e.printStackTrace(); ,单元项目3-分页功能的实现,项目实施 : 创建Servlet控制层,用EmpServlet完成分页的控制操作。String page = request.getParameter(“pag
19、e“); / 获得要显示的页数 int curPage = 0; / 当前的页数 if (page = null | page.length() 1) /没有获得page值的处理curPage = 1; else curPage = Integer.parseInt(page); EmpDAO dao=new EmpDAO(); /创建DAO对象 PageBean pageBean =dao.getEmps(curPage); /返回PageBean /将PageBean放入到request中转发 request.setAttribute(“pageBean“, pageBean); Requ
20、estDispatcher rs = request.getRequestDispatcher(“emp.jsp“); rs.forward(request, response);,单元项目3-分页功能的实现,项目实施 : 创建视图层emp.jsp 。编号姓名工资年龄每页$pageBean.pageSize行 共$pageBean.totalRows行 页数 $pageBean.curPage/$pageBean.totalPages首页 上一页首页上一页下一页 尾页下一页尾页,JavaMail,Email是一种常用的互联网服务,它是通过计算机网络交换的电子媒体信件。 Internet上的个人
21、用户不能直接接收电子邮件,而是通过申请ISP邮件服务器的一个电子信箱,由ISP邮件服务器负责电子邮件的接收。一旦有用户的电子邮件到来,ISP邮件服务器就将邮件移到用户的电子信箱内,并通知用户有新邮件。 当发送一封电子邮件给另一个客户时,电子邮件首先从用户计算机发送到ISP邮件服务器,再到Internet,再到收件人的ISP邮件服务器,最后到收件人的个人计算机。 电子邮件在发送与接收过程中都要遵循SMTP、POP3等协议,这些协议确保了电子邮件在各种不同系统之间的传输。其中,SMTP负责电子邮件的发送,而POP3则用于接收Internet上的电子邮件。,JavaMail,Email的相关协议 简
22、单传输协议(SMTP):简单传输协议SMTP (Simple Mail Transfer Protocol)是电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议,通信基于TCP协议端口25。 邮箱协议(POP3):邮箱协议POP3是将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。它允许用户从服务器上把邮件存储到本地主机(即自己的计算机),同时删除保存在邮件服务器上的邮件,这个协议工作的TCP协议端口是110。 网络消息访问协议(IMAP):IMAP(Internet消息访问协议)与POP3协议类似,也是提供面向用户的邮件收取服务。它使用TCP端口是
23、143。这两个协议的不同是IMAP将很多客户端的功能转移到服务器端。 MIME:MIME(因特网邮件扩展标准),本身不是邮件传输协议,但是对于传输内容的消息,附件以及其它内容定义了格式。例如:扩充了非文本邮件主体、邮件主体不再局限于ASCII字符,而是所有的字符等。,JavaMail,JavaMail是JavaEE中的标准API,在它的接口中封装了与邮件服务器访问的详细过程。 采用JavaMail API可以在程序中以一种独立于平台和协议的方式发送和接受邮件。 JavaMail还允许创建不同类型的邮件,比如普通的文本,或者带有附件的邮件,或者带有混合的二进制内容的邮件。 JavaMail AP
24、I主要包括四部分:Session、Message、Transport、和InternetAddress。,JavaMail,Session Session类代表一个基本的邮件会话,其它的对象均依赖于Session。它是与一组用户邮件配置设置有关的方法提供者。通过配置这些属性完成客户机和服务器之间的交流。 Session对象使用java.util.Properties获得配置的信息,通过getDefaultInstance()方法创建邮件会话。 例: Properties props=new Properties(); props.put(“mail.host“,“邮件服务器的名字“); Ses
25、sion session=Session. getDefaultInstance(props,null);,JavaMail,Message Message类代表一个邮件消息,但这是一个抽象类,所以必须通过它的子类实现,通常采用java.mail.internet.MimeMessage,它代表了一个标准的MIME风格的邮件消息,通过一个接受Session对象的构造函数创建实例。 例: MimeMessage message=new MimeMessage(session); Messag类的主要方法可以分为两部分。第一部分主要用于发送邮件,设置邮件的相关信息包括邮件的发送者、接受者、主题和发
26、送时间等。第二部分用于接受邮件,用来获取邮件的相关信息。,JavaMail,Transport Transport是消息发送传输类,提供了两个静态的send()方法发送消息,第一种使用一个Message对象和Address数组做参数,它发送消息给所有Address类定义的收件人。第二种形式只有一个Message对象参数,但是必须预先定义收件人的地址。 例:Transport.send(message); 还可以通过一个邮件会话获得Transport类的实例,通过调用connect()的方法,发送邮件。 例: Transport tran=session.getTransport(“smtp“)
27、; tran.connect(“邮件服务器地址“,“用户名“,“密码“); tran.send(msg);,JavaMail,InternetAddress InternetAddress代表用户的邮箱地址,它的父类是Address。可以通过传入一个正确的邮箱地址的构造函数创建实例。 例: InternetAddress address=newInternetAddress(““);,单元项目4-创建第一封电子邮件,项目构思:利用JavaMail API,通过程序将邮件发送到邮箱中。 项目设计:通过一个JSP页面将邮件发送到邮箱中。,单元项目4-创建第一封电子邮件,项目实施: 将JavaMai
28、l API的jar包(mail.jar和activation.jar)拷贝到站点的WEB-INFlib文件夹中。 在项目的JSP文件中,实现发送邮件的功能。,单元项目4-创建第一封电子邮件,项目实施: JSP中的部分代码:Properties props = new Properties(); props.put(“mail.host“, “219.216.128.8“); /设置邮件服务器地址 Session ses = Session.getDefaultInstance(props, null); /创建邮件会话对象 /从Session创建MimeMessage MimeMessage
29、msg = new MimeMessage(ses); /发送邮件的邮箱地址 InternetAddress from=new InternetAddress(““); /接受邮件的邮箱地址 InternetAddress to=new InternetAddress(““); msg.setFrom(from); /设置发送邮件邮箱地址 msg.addRecipient(Message.RecipientType.TO,to); /添加邮箱接受者 msg.setSubject(“first mail“); /设置邮件主题 msg.setText(“this is my first Mail“
30、); /邮件内容 Transport tran=ses.getTransport(“smtp“); /获得传输类的实例 tran.connect(“219.216.128.8“,““,“password“); /建立连接 tran.send(msg); /发送邮件 out.println(“邮件发送成功“);,单元项目5-创建HTML格式的邮件,项目构思: HTML格式的邮件可以给收件人更精彩的内容,HTML格式的邮件中可以插入视频、音频、图片、动画等多媒体的内容,HTML格式的邮件和文本类型的邮件发送的过程基本相同,只是在Message对象中传输的是HTML格式的文件,并且要设置邮件内容的格
31、式。 可以通过文件流读取要发送的HTML邮件,然后将内容添加到Message对象中,同时设置内容的格式。 项目设计: 通过一个JSP文件将HTML格式的邮件发送到邮箱中。,单元项目5-创建HTML格式的邮件,项目实施: 在发送Email的代码基础上添加代码:/获得HTML文件路径 String source=application.getRealPath(“)+“+“source.html“; String content=“; String line=null; /创建文件输出流 BufferedReader br=new BufferedReader(new FileReader(sour
32、ce); while(line=br.readLine()!=null)content+=line; /读取HTML文件内容 br.close(); /把邮件内容添加到Message对象中,并且设置内容格式 msg.setContent(content,“text/html“);,单元项目6-创建带附件的邮件,项目构思: 采用JavaMail API也可以像使用OutLook一样在邮件中添加附件。通过创建包含多个部分的邮件,可以在邮件中带有附件。 JavaMail API中的BodyPart对象代表着邮件主体的一部分,可以在程序中创建多个BodyPart对象,使用本身的setContent()
33、方法存放附件、视频、音频、图片等。然后使用addBodyPart() 方法将该对象加入到MimeMultipart对象中,把创建的每一个BodyPart对象都加入到MimeMultipart对象后,再调用setContent()方法将MimeMultipart对象加入到MimeMessage对象中去。,单元项目6-创建带附件的邮件,项目构思: BodyPart对象是抽象类,具体使用的是MimeBodyPart对象,如果要向MimeBodeyPart对象添加附件需要获得这个附件的数据句柄。此数据句柄通过DataSource对象和具体的附件文件关联。如果附件文件的名字有中文的时候可以用MimeUt
34、ility.encodeWord()方法解码,避免附件名字中文乱码。 例: BodyPart attachment=new MimeBodyPart(); /创建MimeBodyPart String filename=“Java技术培训.doc”; /附件文件的名字 /附件的路径 String source=application.getRealPath(“)+“+filename; /创建数据源指向附件的文件 DataSource ds=new FileDataSource(source); /获得附件文件的句柄 attachment.setDataHandler(new DataHand
35、ler(ds); /设置附件文件名 attachment.setFileName(MimeUtility.encodeWord(filename); multpart.addBodyPart(attachment);,单元项目6-创建带附件的邮件,项目设计 通过一个JSP文件将带有doc文件附件的邮件发送到邮箱中。 项目实施 在Web目录下添加“Java技术培训.doc”的文件作为发送邮件的附件。 在项目中通过一个JSP文件实现具体程序。,单元项目6-创建带附件的邮件,项目实施 JSP文件具体程序。Properties props = new Properties(); props.put(“
36、mail.host“, “219.216.128.8“); /设置邮件服务器地址 Session ses = Session.getDefaultInstance(props, null); /创建邮件会话对象 MimeMessage msg = new MimeMessage(ses); /从Session创建MimeMessage InternetAddress from=new InternetAddress(“jinyan_“);/发送的邮箱地址 InternetAddress to=new InternetAddress(““); /接受的邮箱地址 msg.setFrom(from)
37、; /设置发送邮箱地址 msg.addRecipient(Message.RecipientType.TO,to); /添加邮箱接受者 msg.setSubject(“带有附件的邮件“); /设置邮件主题 BodyPart body=new MimeBodyPart(); /创建一个邮件主体内容 body.setText(“带有附件的邮件“); Multipart multpart=new MimeMultipart(); multpart.addBodyPart(body); /加入到MimeMultipart中 BodyPart attachment=new MimeBodyPart();
38、 /创建附件内容 String filename=“Java技术培训.doc“; /附件文件的名字 String source=application.getRealPath(“)+“+filename;/附件的路径 DataSource ds=new FileDataSource(source); /创建数据源指向附件的文件 attachment.setDataHandler(new DataHandler(ds); /获得附件文件的指针 attachment.setFileName(MimeUtility.encodeWord(filename); /设置附件的文件名 multpart.a
39、ddBodyPart(attachment); /加入到MimeMultipart中 msg.setContent(multpart); /将MimeMultipart加入到Message中 Transport tran=ses.getTransport(“smtp“); /获得传输类的实例 tran.connect(“219.216.128.8“,““,“password“);/建立连接 tran.send(msg); /发送邮件 out.println(“邮件发送成功“);,单元项目7-在JSP页面中显示接受的邮件,项目构思:JavaMail API除了可以发送邮件之外,还提供了很多对其它
40、常见邮件操作的支持,比如接收邮件等。下面是一个具体检索邮件的过程。 创建邮件会话:检索邮件需要创建相关的邮件会话。 例:Properties props = new Properties();props.put(“mail.host“, “219.216.128.8“); Session session = Session.getDefaultInstance(props, null); 创建Store对象:要检索邮件服务器的邮件,需要连接到邮件服务器。这是通过Store对象完成的,通过邮件会话对象可以创建Store对象。Store对象的connect()方法用来连接邮件服务器,该方法需要三个
41、参数,第一个参数是邮件服务器的地址,第二个参数是能够登陆邮件服务器的用户名,第三个参数是密码。 例:Store store= session.getStore(“pop3“);store.connect(“邮件服务器地址“,“用户名“,“密码“); 文件夹对象Folder:当连接到邮箱后,需要打开存放邮件的文件夹,Folder代表文件夹对象。因此,需要先创建Folder对象。创建Folder对象可以通过调用Store对象的getFolder()方法。这个方法有一个参数,代表着要打开文件夹的名字。 例:Folder folder=store.getFolder(“INBOX“);,单元项目7-在
42、JSP页面中显示接受的邮件,项目构思:具体检索邮件的过程(续)。 打开文件夹:获得文件夹对象后,要使用open()方法打开文件夹,这个方法有一个参数,可以指定打开文件夹的模式。共有两个可选值:READ_ONLY和READ_WRITE。 例:folder.open(Folder.READ_ONLY); 取出文件夹中的邮件:Floder对象的getMessage()或getMessages()提供了在文件夹中收取邮件的方法。 例:Message messages=folder.getMessages(); 读取邮件:通过Message对象提供的方法可以获得整个邮件的信息。例如:getSubject
43、()获得邮件的主题、getSentData()获得发送的时间、getContent()获得具体内容等。 关闭资源:完成接收过程后,需要关闭Folder和Store对象。 例:folder.close(false);store.close();,单元项目7-在JSP页面中显示接受的邮件,项目设计:将接受到的邮件通过JSP文件显示出来。 项目实施:在项目中创建一个JSP页显示接收邮件的内容。,单元项目7-在JSP页面中显示接受的邮件,项目实施:接收邮件的内容的代码。Properties props = new Properties(); props.put(“mail.host”, “219.21
44、6.128.8”); /设置邮件服务器地址 /创建邮件会话对象 Session ses = Session.getDefaultInstance(props, null); Store store=ses.getStore(“pop3“); store.connect(“219.216.128.8“,““,“密码“); Folder folder=store.getFolder(“INBOX“); /创建文件夹对象 folder.open(Folder.READ_ONLY); /打开文件夹 Message messages=folder.getMessages(); for(int i=0;i
45、“);out.println(“发送时间:“+msg.getSentDate()+“);out.println(“内容:“+msg.getContent();out.println(“); folder.close(false); store.close();,JavaMail,邮件的删除:删除邮件服务器上的邮件步骤: 以READ_WRITE模式打开文件夹:要在收取之后删除邮件,必须使用READ_WRITE模式打开文件夹。可以用下面的代码代替上个程序中打开文件夹的代码。例:folder.open(Folder.READ_WRITE); 设置邮件状态:删除邮件必须用系统标记标识邮件的状态。标记描
46、述了邮件在其所在文件夹中的状态。Message.getFlags()方法返回一个Flag对象,该对象拥有该邮件所有当前设置的标记。 完成删除操作:要完成删除操作,还必须给关闭文件夹的方法一个true值的参数,这样在文件夹关闭时所有标记是DELETED的邮件将被删除。修改上个程序的代码。 例:folder.close(true);,树状菜单,树状菜单常用来提供内容导航功能。 它的实现分为静态和动态两个部分。 静态菜单是内容固定不变或基本不变,可以采用JavaScript实现,这种方法的特点是速度快,编程难度小,有许多开发好的程序。 动态树状菜单是树状菜单的内容经常变化,需要动态生成。,单元项目8
47、-采用菜单组件创建静态树状菜单,项目构思: 静态树状菜单可以采用JavaScript开发,网上有许多优秀的代码程序,这里介绍一个比较简单实用的免费树状菜单dtree组件。 dtree组件的主要优点是:可以设置无限级的菜单、可以设置多种状态(如:图标的显示和隐藏等)、支持目前主流的浏览器、节点图片可以设置切换图片的效果等。下载地址是:http:/ dtree组件下载的文件包括dtree.js、dtree.css和图片文件夹img。,单元项目8-采用菜单组件创建静态树状菜单,项目设计:在一个JSP页面中通过dtree组件创建一个树状菜单。 项目实施: 将下载的dtree组件dtree.js、dtr
48、ee.css、img中的图片文件分别放到相应的WEB目录下的js、css、img文件夹中。 在JSP页面中实现代码。,单元项目8-采用菜单组件创建静态树状菜单,项目实施: 在JSP页面中实现的主要代码如下:d = new dTree(d);d.add(0,-1,我的树状菜单);d.add(1,0,节点1,tree.jsp);d.add(2,0,节点2,tree.jsp);d.add(3,1,节点1.1,tree.jsp);d.add(4,0,节点3,tree.jsp);d.add(5,3,节点1.1.1,tree.jsp);d.add(6,5,节点1.1.1.1,tree.jsp);d.add(7,0,节点4,tree.jsp);d.add(8,1,节点1.2,tree.jsp);d.add(9,0,我的相册,tree.jsp,这是我的相册,img/imgfolder.gif);d.add(10,9,我的生日,tree.jsp,我的生日照片);d.add(11,9,北京旅游,tree.jsp);d.add(12,0,回收站,tree.jsp,img/trash.gif);document.write(d);,