精通Struts技术.docx
- 文档编号:17109512
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:59
- 大小:56.09KB
精通Struts技术.docx
《精通Struts技术.docx》由会员分享,可在线阅读,更多相关《精通Struts技术.docx(59页珍藏版)》请在冰点文库上搜索。
精通Struts技术
第一章:
JakartaStruts项目的介绍和它的支持组件
作者:
JamesGoodwill翻译:
周海方整理:
Xlong(Email:
xlongbuilder@)
我们所有的章节的Web服务器都是基于JakartaTomcat容器。
在本章结束的时候,通过运行你建立的Struts应用程序,你可以对Struts的框架机制有个大致的了解
TheJakartaStruts项目
TheJakartaStruts项目是由ApacheSoftwareFoundation发起的开源项目,它在java服务器端实现了MVC(Model-View-Controller)设计模式。
TheJakartaStruts项目最初是由CraigMcClanahan在2000年五月创建的,但后来被开源组织所接收。
TheJakartaStruts作为一个开源框架的主要意图是为了在创建WEB应用时能比较容易的分离表示层和业务数据层。
自从它诞生以来收到大量开发人员的支持,并很快的成为开源社区中一个重要的成员。
理解MVC设计模式
为了更深刻的理解Struts框架,你必须先理解MVC设计模式,Struts技术的就是基于MVC设计模式的。
MVC设计模式起源于Smalltalk语言,它由以下三个部分组成:
模型(model),视图(view),控制器(Controller).表1.1定义了这些组件。
组件
描述
模型(model)
封装数据对象。
模型用来封装和显示数据对象。
视图(view)
作为模型的显示,它表示数据对象的当前状态
控制器(Controller)
定义对用户的输入执行相应操作的接口,它用来操作模型(model)和数据对象
使用MVC的好处包括如下:
可靠性:
表示层和业务层别分离,这样就允许你更改你的表示层代码而不用重新编译你的模型(model)和控制器(Controller)代码
高重用和可适应性:
MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。
它包括任何WEB(HTTP)浏览器或则无线浏览器(WAP)。
较低的生命周期成本:
MVC使降低开发和维护用户接口的技术含量成为可能。
快速的部署:
开发时间会得到相当大的缩减,它使程序员(java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
可维护性:
分离表示层和业务逻辑层也使得基于Struts的Web应用更易于维护和修改。
TheStruts架构图
在这章节,我们简要的画出一幅和MVC模式对应的STRUTS框架图1.1:
图1.1是Struts框架下应用程序请求流通过的路径。
这个处理过程由5个基本的步骤组成。
(源码网教程下载,)
下面是处理步骤的描述。
1.由浏览器端发出一个请求。
2. 请求被ActionServlet(控制器)接收,它在struts-config.xml文件中寻找请求的URI,找到对应的Action类后,Action类执行相应的业务逻辑。
3. Action类执行建立在模型组件基础上的业务逻辑,模型组件是和应用程序关联的。
4. 一旦Action类处理完业务逻辑,它把控制权返回给ActionServlet。
,Action类提供一个键值作为返回的一部分,它指明了处理的结果。
ActionServlet使用这个键值来决定在什么视图中显示Action的类处理结果。
5. 当ActionServlet把Action类的处理结果传送到指定的视图中,请求的过程也就完成了。
模型(TheModel)
Struts框架没有提供特定的模型组件,因此我们不会整章介绍模型组件,但我们会把它使用到我们的例子中去。
视图(TheView)
Struts框架中视图组件对应于一个简单的JSP文件,这个JSP文件包含了Struts定义的标签,下面的代码片段是一个简单的Struts视图:
<%@pagelanguage="java">
<%@tagliburi="/WEB-INF/struts-html.tld"prefix="html">
formaction="loginAction.do" name="loginForm" type="com.wiley.loginForm"> UserId: textproperty="username"> Password: passwordproperty="password"> submit/> form> 如你看到的那样,几个JSP的标签是JSP文件中的重点。 这些标签在Struts框架中定义,它使struts应用项目和控制器之间实现松耦合。 在第三章我们会建立一个真正可运行的struts视图,第五章中会对视图进行更详细的介绍。 控制器(TheController) 控制器是Struts框架中的中枢,它由org.apache.struts.action.ActionServlet这个servlet来贯彻和执行的。 这个org.apache.struts.action.ActionServlet接收所有客户端的请求,并把请求委派到指定的Action类(用户扩展自org.apache.struts.action)。 ActionServlet委派请求是基于客户端传入的URI。 一旦Action类完成处理,ActionServlet根据Action返回的键值来决定在什么视图中显示Action的类处理结果。 ActionServlet类似于一个创建Action对象的工厂,由Action对象去执行应用中实际的业务逻辑。 控制器是Struts框架中最重要的部分。 我们会在第三章和第四章对控制器进行更详细的探讨。 Web应用(WebApplications) 所有的Web应用被包含在一个目录结构中,首先你要在Web服务器下建立如下目录: 目录 内容 wileyapp 这是Web应用的根目录,所有的JSP和HTML文件都在这个目录下。 /wileyapp/WEB-INF 这个目录包含了所有除根目录外需要的资源, 包括WEB应用部署信息。 注意: WEB-INF目录下的不是公共文件,无法直接服务于客户端。 /wileyapp/WEB-INF/classes 存放了所有的servlet类或实用类。 /wileyapp/WEB-INF/lib 包含所有WEB应用中要用到的后缀为JAR的包文件 图1.2 如果你实用的是Tomcat服务器,你的缺省根目录为 注意: WEB服务器允许你编译你的类并存放到/WEB-INF/classes或/WEB-INF/lib下,但/WEB-INF/classes的类将被优先载入,即若你编译的类在两个目录下都存在,起作用的只有/WEB-INF/classes目录下的类。 Web应用的部署描述 Web应用的核心是部署描述。 部署描述存放在/ 如果你使用图1.2的目录结构,那么你的部署描述位于/ 部署描述中包括如下元素: ∙ServletContextinitparameters ∙Localizedcontent ∙Sessionconfiguration ∙Servlet/JSPdefinitions ∙Servlet/JSPmappings ∙Taglibraryreferences ∙MIMEtypemappings ∙Welcomefilelist ∙Errorpages ∙Securityinformation 下面的代码片段是部署描述的一个例子,它定义了一个简单的servlet。 xmlversion="1.0"encoding="ISO-8859-1"? > DOCTYPEweb-app PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN" " 打包Web应用 标准的Web应用都被打包成后缀为war的文件,你可以使用Java打包命令来创建WAR文件: jarcvfwileyapp.war 现在你就可以用wileyapp.war文件发布你WEB应用了。 Tomcat容器 Tomcat是基于JAVA的开源WEB应用服务器,我们的例子都以Tomcat为WEB应用服务器。 在开始我们的学习前你需要下载 Tomcat4地址: http: //jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.6/src/jakarta-tomcat-4.0.6-src.zip JDK1.4地址: 操作系统为Win2000 2.在系统变量中设置JAVA_HOME=root 3.在系统变量中设置CATALINA_HOME>=root 4.在系统变量中设置CLASSPATH=root/lib/dt.jar;jar;root/lib/tools.jar;root/jre/rt.jar; 6. 在系统变量中PATH下添加root\bin; 注意: root为你的安装目录 启动 //localhost: 8080, 你若是能看到缺省的Tomcat主页面,表明你的配置成功了。 如果未成功请查看你的JDK是否已经安装,或者JDK路径是否设置正确。 下一章将大致讲述JSP和servlets,若你对于这方面的技术已经了解,你可以跳过下一章节。 作者: JamesGoodwill翻译: 凤鸣高岗 本文的版权属于笔者本人,但欢迎转载,前提是注明出处和原作者 第二章: Servlet和JSP结构 在这章我们讨论两个问题JSP和servlets技术,它们是Struts框架的基础。 我们描述的servlet结构包括它的生命周期,上下文环境(ServletContext)及WEB应用之间的关系。 一旦你对Servlet有了比较透彻的了解,我们将集中讨论Struts框架中的视图即JSP页面。 本章的目的是让你对JSP和Servlet技术有个大致的了解。 在本章结束的时候你会清楚的知道为何Servlet和JSP技术适合于WEB开发。 JavaServlet结构 Javaservlet是平台独立的WEB应用组件,Servlets和客户端协作是通过request/response来进行处理的。 图2.1为处理图 servlet结构有两个包组成: javax.servlet和javax.servlet.http。 javax.servlet包含了被用来实现和扩展的通用接口和类。 javax.servlet.http是被用于特定的HTTP协议的。 Servlet接口被定义了五个方法。 其中比较重要的有三个: 1.init()方法,用于初始化一个Servlet; 2.service方法,用于接受和响应客户端的请求。 3.destroy()方法,执行清除占用资源的工作。 这些是servlet生命周期方法。 我们会在后面的章节解说这些方法。 所有的servlet都必须实现javax.servlet.Servlet接口,不管是直接或者是间接的。 图2.2是对象图,给出了servlet的层次框架图 GenericServlet和HttpServlet类 HttpServlet从GenericServlet扩展而来,GenericServlet实现了Servlet接口。 当开发你的servlets时,你通常需要扩展GenericServlet的子类。 你必须实现service()方法。 GenericServlet.service()方法已经被定义为抽象方法,定义的原型如下: publicabstractvoidservice(ServletRequestrequest, ServletResponseresponse)throwsServletException,IOException; ServletRequest,ServletResponse这两个参数通过service()方法来传递。 ServletRequest对象用来把得到的信息传送到servlet,ServletResponse对象用来把servlet产生的数据传送回到客户端。 对比GenericServlet和HttpServlet,HttpServlet不需要实现service()方法,HttpServlet类已经为你实现了service()方法。 方法原型如下: protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException; 当HttpServlet.service()方法被执行,它读取存储在request中的方法类型的值来决定哪个方法被执行。 这里是你想重载的方法: 如果方法类型为GET,就调用doGet()方法。 如果为POST就调用doPost()方法。 主要使用的就是这两个方法。 另外的五个方法不是经常使用。 因此我们比较关注的也就是这两个方法。 Servlet生命周期 Servlet生命周期有一个合理的逻辑顺序。 javax.servlet.Servlet接口声明了周期方法。 这些方法就是init(),service(),destroy()。 执行顺序分为三个处理步骤: 1.init()方法用来把servlet导入和初始化。 这个方法在servlet被预加载或在第一次请求时执行。 2.Servlet处理0个或多个请求。 Servlet对每个请求都用service()方法来处理。 3.当WEB应用声明Servlet被关闭,Servlet被销毁,垃圾收集器对资源进行收集。 用destory方法来关闭Servlet。 init()方法 init()方法是servlet生命周期的开始。 这个方法在servlet被实例化后立即执行,它只被调用一次,用来创建和初始化请求中用到的资源。 init()方法的显示如下: publicvoidinit(ServletConfigconfig)throwsServletException; ServletConfig参数对象是成员变量,它在后面会被用到。 一个比较通用的做法是调用超类的init()方法super.init()。 如果因为一些原因servlet不能初始化请求所要求的资源就会抛出ServletException service()方法 service()方法处理来自客户端的所有请求。 service()方法表示如下: publicvoidservice(ServletRequestreq,ServletResponseres) throwsServletException,IOException; service()方法有两个参数: ServletRequest: 封装来自客户端的请求信息 ServletResponse: 返回客户端的信息 通常情况下你不会实现这个方法,除非你扩展GenericServlet抽象类。 经常实现service()这个方法的是HttpServlet类。 HttpServlet通过扩展GenericServlet来实现Servlet接口。 HttpServlet支持HTTP/1.1。 destroy()方法 这个方法用于结束servlet生命周期。 当一个WEB应用被关闭,destroy()方法被执行, 这时在init()方法中被创建的资源被释放。 下面是destroy()方法的代码片段: publicvoiddestroy(); 创建一个Servlet 现在我们已经基本了解servlet是如何工作了,我们将创建一个非常简单的servlet应用。 它的主要功能是为了处理客户端请求,并在客户端输出客户地址。 在完成代码后我们将编译代码并部署它。 下面为SimpleServlet.java类的源代码: packagechapter2; importjavax.servlet.*; importjavax.servlet.http.*; importjava.io.*; importjava.util.*; publicclassSimpleServletextendsHttpServlet{ publicvoidinit(ServletConfigconfig) throwsServletException{ //AlwayspasstheServletConfigobjecttothesuperclass super.init(config); } //ProcesstheHTTPGetrequest publicvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException,IOException{ doPost(request,response); } //ProcesstheHTTPPostrequest publicvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html"); PrintWriterout=response.getWriter(); out.println(""); out.println(" out.println(" //Outputstheaddressofthecallingclient out.println("Youraddressis"+request.getRemoteAddr() +"\n"); out.println(""); out.close(); } } 现在我们可以查看SimpleServlet代码的细节部分了。 我们来看它的三个覆盖方法: init()· doGet()· doPost()· 每个方法的细节: init()方法 SimpleServlet类首先定义了init()方法,它以ServletConfig对象为参数调用父类的init()方法: super.init(config) 注意: 由SimpleServlet的父类GenericServlet来实际处理ServletConfig对象,你可能也注意到了init()方法并没有创建任何资源,这也是为什么SimpleServlet中不执行destroy()方法的原因了。 doGet()和doPost()方法 所有的业务逻辑都在这两个方法中执行。 在这个例子中doGet()方法只是简单的调用doPost()方法。 doGet()方法只在GET请求时被执行,doPost()方法也一样,只在Post请求时被执行。 两个方法的传入参数是HttpServletRequest和HttpServletResponse对象。 HttpServletRequest对象包含的是来自客户端的信息,HttpServletResponse包含的是返回客户端的信息。 在doPost()方法中第一步是设置返回的内容类型: 代码片段如下: response.setContentType("text/html"); 在输出流中它必须被最先设置,在例子中我们设置为text/html. 下一步获取PrintWriter对象,这是通过ServletResponse对象的getWriter()方法得到的。 PrintWriter对象可以让我们写入输出流后发送到客户端显示,这个步骤代码片段如下: PrintWriterout=response.getWriter(); 一旦你获取了PrintWriter对象后,我们将往客户端输出信息,信息包含HTML标记,这是输出到客户端的格式,下面的几行代码显示了如何处理输出: out.println(""); out.println("
out.println("
");//Outputstheaddressofthecallingclient
out.println("Youraddressis"+request.getRemoteAddr()
+"\n");
前面部分代码说明你的输出格式为HTML,下面这段代码你可能会有些疑问:
//Outputstheaddressofthecallingclient
out.println("Youraddressis"+request.getRemoteAddr()+"\n");
这段代码调用了HttpServletRequest对象的getRemoteAddr()方法来获取客户端的IP地址,并将它发送到客户端。
HttpServletRequest对象可以获取许多HTTP协议下的客户端的信息。
如果你想更深入的了解HttpServletRequest和HttpServletResponse对象,可以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精通 Struts 技术
![提示](https://static.bingdoc.com/images/bang_tan.gif)