




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一、基于J2EE的B/S分布式代数方程求解系统班级:软件11级任课老师:祁明龙指导老师:祁明龙指导书编写:祁明龙地点:鉴主十楼学院机房时间:十三周周三12:00-13:50开发工具:J2EE和NetBean6.5编程语言:Java问题:(一)、简述基于J2EE的B/S分布式代数方程求解系统的开发原理(二)、画出该系统的原理图(三)、服务器小程序S1是如何导向S2的?(四)、在S2中是如何跨容器导入无状态会话类的实例的?(五)、无状态会话类和有状态会话类之间有着什么样的差别?(六)、什么是注入机制?适用于有状态会话类的引用吗?(七)、如果使用C/S模型,还能在客户端使用注入机制吗?(八)、如果不使用注入机制,那么使用什么方法在客户端导入会话类的实例?(九)、什么是WEB容器?试举一、二个支持JSP和Servlet的WEB容器。(十)、什么是EJB容器?它与应用服务器的关系是什么?试举一、二个常见的应用服务器。(十一)、试说明基于J2EE的B/S分布式代数方程求解系统的开发步骤。(十二)、试手工写出该系统的远程接口及会话类的Java源代码。两个Servlet 源代码。(十三)、在开发S1和S2时,应该导入什么包?(十四)、如何在单机和局域网上测试该系统?(十五)、什么是描述布署符?作用是什么?(十六)、当用浏览器打开一个Servlet时,WEB容器是怎么操作的?(十七)、谈谈Servlet编程和一般的JSP编码的差别。(十八)、试写出测试该系统的一般Java应用客户端。(十九)、把EJB组件部署到应用服务器上是什么意思?设计原理:利用无状态会话组件表示代数方程求解的业务逻辑。编写二个服务器端小程序S1和S2。Servlet S1用于显示输入代数方程三个系数的HTML表单(Form),表单的Method属性设置为Post,而其Action指向Servlet S2。服务器端小程序S2,利用J2EE的注入机制,跨容器地创建无状态会话组件的一个实例作为其成员,从而调用其远程接口所呈现的求解代数方程的远程方法。支持J2EE的应用服务器GlashFish包括EJB容器和WEB容器,后者为支持Servlet和JSP的WEB服务器,例如Apache Tomecat。跨容器数据交流由应用服务器支撑。这个应用程序的客户端,正如其名子所示,是浏览器。服务器端小程序S2承担三个主要任务:一是提取S1所提交的三个系数,由其Request对象完成,二是利用J2EE注入机制创建无状态会话组件的一个实例并调用其远程方法,三是利用Response对角获取一个输出流对象,把代数方程求解的结果以HTML格式显示给客户端。WEB服务器当首次收到一个请求Servlet时,如果该服务器小程序已经被编译就创建一个实例,执行之,并把计算的结果以标准的HTML协议能接受的格式组织数据并返回给客户端,否则要编译对应的Servlet。WEB容器,正如其它容器一样,利用Pool管理驻存在内存中的Servlet实例,以便提高系统运行的效率。基原理图:Servlet 1Servlet 2表示业务逻辑无状态会话组件注入Request/ResponseWEB容器EJB容器浏览器IEHTTPS开发步骤:(一)、安装JDK1.6,带J2EE的NetBean6.5(二)、开发SLSB,即Staeless Session Bean并实现其远程接口(三)、创建一个WEB应用,开发服务器小程序S1和S2(四)、DeployEJB组件(五)、在另一台机器上打开一个浏览器,测试系统。操作步骤及注意事项:(一) 打开NetBean6.5,创建一个EJB组件模块。点击下一步。点击下一步。点击完成。创建Java包:org.software_sy1001.middleware.j2ee.exp31。点击完成。(二)、编写代码1、编写封装代数方程有解无解信息的Java Bean。这个Java Bean,因为是远程方法的调用的返回结果,所以必须实现java.io.Serializable接口,以便“序列化”其对象的状态。我们把它命名为RootResult.java。右击包org.software_sy1001.middleware.j2ee.exp31,选择新建,Java类,输入类名。点击完成。打开RootResul.java源代码文件,创建三个成员变量:private float X1; /*第一个根*/private float X2; /*第二个根*/private boolean possedingRealRoots; /*表示有无实根的玻尔变量*/把光标定位在类代码某空白处,点击右键,选择插入代码-getters和setters。选择所有的成员变量,点击生成。至此,我们已经生成了能够封装代数方程根信息的Java Bean。完整的代码见下面的Listing:/* * To change this template, choose Tools | Templates * and open the template in the editor. */package org.software_sy1001.middleware.j2ee.exp31;import java.io.Serializable;/* * * author Administrator */public class RootResult implements Serializableprivate float X1; /*第一个根*/private float X2; /*第二个根*/private boolean possedingRealRoots; /*表示有无实根的玻尔变量*/ public float getX1() return X1; public void setX1(float X1) this.X1 = X1; public float getX2() return X2; public void setX2(float X2) this.X2 = X2; public boolean isPossedingRealRoots() return possedingRealRoots; public void setPossedingRealRoots(boolean possedingRealRoots) this.possedingRealRoots = possedingRealRoots; 2、编写SLSB。选择包org.software_sy1001.middleware.j2ee.exp31,点击右键,选择“新建会话Bean”在EJB名称中输入:MyRootSolver在会话类型中选择:无状态在创建接口中选择:远程点击完成。产生MyRootSolver.java和MyRootSolverRemote.java。MyRootSolver.java即无状态会话类,而MyRootSolverRemote.java是其对应的远程接口。选择MyRootSolverRemote.java,加入该接口应该Expose的方法。我们这里加入二个方法:public RootResult computeRoots(float a, float b, float c); /求解方程的远程方法public String cocoWantToSaySomethin(String words);/永恒的HelloWorld其它你愿意加入的方法。该远程接口的完整代码Listing:/* * To change this template, choose Tools | Templates * and open the template in the editor. */package org.software_sy1001.middleware.j2ee.exp31;import javax.ejb.Remote;/* * * author Administrator */Remotepublic interface MyRootSloverRemote public RootResult computeRoots(float a, float b, float c); /求解方程的远程方法public String cocoWantToSaySomethin(String words);/永恒的HelloWorld 问:这个远程接口与通常的Java接口比有什么特别的地方?当我们再次打开无状态会话类时,发现出现一个红色的小问号。这是NetBean不满意代码出错的正常表现。这个SLSB实现对应的远程接口,刚刚加入的两个方法还没有来得及实现,所以它急了。把光标定位在SLSB代码某空白止处,点击右键,选择插入代码,实现方法。NetBean就自动把应该实现的远程方法插入到那个位置,免去了你输入代码的工作。这就是IDE的好处!接下来,我们要编写远程方法的代码。解一元二次方程,这是我们在十三、四岁初中的阶段就会做的,到今天还解方程,这个老师是不是头脑有问题!老师说,我们是使用J2EE解方程。只要会J2EE解方程,就会用J2EE解任何其它的问题,到时那只是数量的变化。我们使用粗糙的概念指引着我们的编程,比没有任何概念要好。我们还有一个创新点,那就是用一个Java Bean封装代数方程根的信息,处处散发着整齐划一的气息。这就是秩序和一致性所带来的美的效应。解方程的远程方法详细Listing:public RootResult computeRoots(float a, float b, float c) RootResult res = new RootResult(); float delta, x1, x2; delta=b*b-4*a*c; if(delta0)res.setPossedingRealRoots(false); else x1=(-b+(float)Math.sqrt(delta)/(2*a); x2=(-b-(float)Math.sqrt(delta)/(2*a); res.setX1(x1); res.setX2(x2); res.setPossedingRealRoots(true); return res;永恒的HelloWorld:public String cocoWantToSaySomethin(String words) return new String(Dear coco says to you long time no see you and +words); 至此。我们已经编写完了所有的业务逻辑。下面要把EJB组件部署到应用服务器上。所谓布置,粗糙地讲,支撑软件即EJB容器在内存中创建EJB组件一个或多个实例,“等待”来自客户端的请求其远程方法。组件的生存周期,安全性,组件间的数据交流,等等,都由应用服务器来承担,免去了你无数底层的编程。所有的体系结构,无一例外,都使用XML文档来描述结构和数据。从DotNet Framwork到J2EE,除了使用XML进行规范,还使用XML作为轻量级信息的载体和协议。可以毫不夸张地讲,不懂点XML,那怕那么一点点概念,做IT软件开发,恐怕有点难度。布署的一个XML文档,在WEB应用开发中叫Deployment Descriptor,即所谓的布署描述符,过去要手工配置,现在“一键回复”,多快好省。选择ROOTEJBModule,点击右键,选择布置。如果布置成功,应该出现下图。否则,你的代码肯定在某个地方出错了。4、编写服务器小程序,即Web Servlet。这次,我们要重新创建一个WEB应用项目。选择:文件新建项目Java WebWeb应用程序。点击下一步。在项目名称一栏中填入:RootSolverWeb其它项选择默认。点击下一步。上图中的上下文路径,代表浏览器的逻辑网址。点击完成。现在,我们项目栏中有两个项目,一个是EJB模块,一个是Web模块,处于同一应用服务器容器里。一个是EJB容器,一个是WEB容器。它们之间的沟通,由应用服务器GlashFish来承担。正如开始的原理图所示。下面,我们将创建两个Servlet。展开RootSolverWeb库文件夹,我们看到,只有JDK和GlashFish两个库。这个不够,我们必须加入我们刚刚开发的EJB组件的jar包,因为我们要在第二个Servlet中使用注入机制导入我们刚刚创建的无状态会话类的一个实例。选择库,点击右键,选择添加jar/文件夹,定位到E:/ROOTEJBModule/dist,选择ROOTEJBModule.jar压缩包。点击打开。现在,你的WEB应用的包的情况应该象下图这样的。在源包之下,创建新包:org.software_sy1001.middleware.j2ee.exp31.webcontainer.右击该包,新建Servlet。在名称一栏中:S1其它项目选择默认。点击完成。展开服务器小程序S1。加入以下代码:服务器小程序的好处是纯Java编程,既打印一般数据,也打印HTML标记。双引号是Java的一个特殊符号,如若打印,必须用antislash把它的特殊含意屏蔽掉。这段代码打印一个标准的HTML表单Form。当点击其提交按钮时,导向服务器小程序S2,这由Form的action属性完成。三个负责输入代数方程三个系数的文本框,必须指定name属性,因为在S2要通过参数名获取它们的值。而提交和清空按钮则不必指定name属性。右击S1,选择运行或运行文件,将启动本机默认的浏览器。执行结果见下图:请同志们注意S1的网址:http:/localhost:8080/RootSolverWeb/S1在学院局域网上运行系统时,必须把localhost换成应用服务器的IP地址。服务器小程序S1的完整代码Listing:/* * To change this template, choose Tools | Templates * and open the template in the editor. */package com.software_sy1001.middleware.j2ee.exp31.webcontainer;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /two classes or interfaces are not neede yet but though including themimport org.software_sy1001.middleware.j2ee.exp31.MyRootSloverRemote;import org.software_sy1001.middleware.j2ee.exp31.RootResult;/* * * author Administrator */public class S1 extends HttpServlet /* * Processes requests for both HTTP GET and POST methods. * param request servlet request * param response servlet response * throws ServletException if a servlet-specific error occurs * throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); try /TODO output your page here out.println(); out.println(); out.println(Servlet S1); out.println(); out.println(); out.println(); out.println(Second-Degree Algebraic Equation Solving); out.println(); out.println(a:); out.println(b:); out.println(c:); out.println(); out.println(); out.println(); out.println(); out.println(); out.println(); finally out.close(); /* * Handles the HTTP GET method. * param request servlet request * param response servlet response * throws ServletException if a servlet-specific error occurs * throws IOException if an I/O error occurs */ Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException processRequest(request, response); /* * Handles the HTTP POST method. * param request servlet request * param response servlet response * throws ServletException if a servlet-specific error occurs * throws IOException if an I/O error occurs */ Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException processRequest(request, response); /* * Returns a short description of the servlet. * return a String containing servlet description */ Override public String getServletInfo() return Short description; / 如法炮制,创建服务器小程序S2。在S2中,使用J2EE的注入机制,导入MyRootSolverBean的一个实例。通过实例,调用其求解方程的远程方法。见下段代码。S2责任有三:其一、提取S1所提交的代数方程的三个系数。这个相当容易。其二、调用实例solver的远程方法。这个相当容易。其三、以HTML格式组织数据。有N种方法,just syntax sugar。看着办吧。我这里推荐一种。下面测试一下我们的系统。在远程或本机,打开一个IE,输入S1的网址:http:/localhost:8080/RootSolverWeb/S1注意,如果是远程机器,要把localhost改成应用服务器所在机器的IP地址。点击提交。我们就得到我们所期待的结果:我们可爱的coco说的话是用滚动条显示的。这不算什么,仅仅是长辈所说的“玩物丧志”而已。至此,你已经基本上掌握了J2EE的开发流程和一些基本概念。虽然这些概念非常的粗糙,但对我们的软件开发还是有用的。要知道,定性的东西永远跟不上数学概念。不必钻“牛角尖子”,因为不可能要求本来就不精确的东西精确起来。这反而弄巧成拙。S2的完整代码Listing:/* * To change this template, choose Tools | Templates * and open the template in the editor. */package com.software_sy1001.middleware.j2ee.exp31.webcontainer;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/Our EJB component Jarimport org.software_sy1001.middleware.j2ee.exp31.MyRootSloverRemote;import org.software_sy1001.middleware.j2ee.exp31.RootResult;/Standard J2EE Jarimport javax.ejb.EJB;public class S2 extends HttpServlet /So-called the the injecting mechanism to introduce a SLSB as a member field EJB MyRootSloverRemote solver=null; /* * Processes requests for both HTTP GET and POST methods. * param request servlet request * param response servlet response * throws ServletException if a servlet-specific error occurs * throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); try /TODO output your page here /Extracting three coefficients of the equation by using request argument float a, b, c; String cocos_words = My children, I love you very much!; String cocos_entire_phase=null; RootResult roots = null; a=Float.parseFloat(request.getParameter(a); b=Float.parseFloat(request.getParameter(b); c=Float.parseFloat(request.getParameter(c); roots=puteRoots(a, b, c); cocos_entire_phase=solver.cocoWantToSaySomethin(cocos_words); out.println(); out.println(); out.println(Servlet S2); out.println(); out.println(); StringBuffer equation= new StringBuffer(); equation.append(request.getParameter(a)+X2 + ); equation.append(request.getParameter(b)+X + ); equation.append(request.getParameter(c)+ = 0); out.println(+cocos_entire_phase+); out.println(For the equation +equation.toString()+ :); ou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届山东省菏泽市王浩屯中学英语九年级第一学期期末检测试题含解析
- 2026届贵州省黔东南州剑河县化学九上期中学业质量监测试题含解析
- 河南省郑州市桐柏一中学2026届九上化学期中调研模拟试题含解析
- 大兴安岭市重点中学2026届九年级英语第一学期期末学业水平测试模拟试题含解析
- 2026届陕西省宝鸡市渭滨区九年级英语第一学期期末经典模拟试题含解析
- 2026届山西省临汾市襄汾县九上化学期中达标测试试题含解析
- 信托资金借贷合同范文6篇
- 离婚协议中关于共同财产分割及人寿保险权益保障协议
- 离婚协议书(涉及跨境财产分割与法律适用)
- 猪场租赁合同(含饲料供应与养殖技术支持)
- 挖机工时合同协议
- 开音节闭音节试题及答案
- 部编人教版小学一年级上册道德与法治全册教学设计
- 预防脊柱弯曲异常教案
- 辅导机构创业路演
- 2025年穿脱隔离衣的试题及答案
- 2025年移动初级解决方案经理认证理论考试指导题库-下(多选、判断题)
- 健身房卫生安全措施及服务质量提升方案
- DB14-T 1737-2024 医疗护理员培训机构服务规范
- 《混凝土砖块机:混凝土砖块机技术》课件
- 理想二语自我对交际意愿的影响:二语坚毅和自信的链式中介作用
评论
0/150
提交评论