关闭

关闭

关闭

封号提示

内容

首页 chap01 领略清晰的MVC流程----Struts讲解技术资料.pdf

chap01 领略清晰的MVC流程----Struts讲解技术资料.pdf

chap01 领略清晰的MVC流程----Struts讲解技术…

上传者: zhuchengdie 2012-07-25 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《chap01 领略清晰的MVC流程----Struts讲解技术资料pdf》,可适用于IT/计算机领域,主题内容包含第章领略清晰的MVC流程(Struts讲解)Struts是学习轻量级的JEE框架必须了解的一个框架它的各种优点使得它成为了目前最流行的三个框架之一它符等。

第章领略清晰的MVC流程(Struts讲解)Struts是学习轻量级的JEE框架必须了解的一个框架它的各种优点使得它成为了目前最流行的三个框架之一它实现了MVC模式本章主要对Struts所实现的MVC流程Struts的配置Struts标签进行介绍。Struts的流程本节将着重介绍Struts的基本流程并对个流程进行简单的分析。Struts的业务流程比较复杂但仔细体会也不难理解为了便于读者理解这里使用一个流程图对Struts的运行机制进行描述如图所示:图Struts业务流程图下面针对上面的流程做一些必要的讲评。()第一步一般情况下用户所有的以do结尾的请求都会被一个叫ActionServlet截获。ActionServlet是Struts中一个特殊的Servlet它本质上还是一个HttpServlet只是它在Struts中充当“门卫”的作用。当有以do结尾的Http请求时它会认为这••是在向它要服务。接下来它要做的事情就是查找这个“服务”是否存在。也就是Action。ActionServlet的存在体现了一种在门槛集中控制的思想。以使得后面的工作有序的进行。()第二步这一步牵涉到一个配置文件它叫strutsconfigxml。这个文件中包含了ActionForm,ActionForward等信息它的存在主要有两个意义第一它告诉人们这个系统“有什么”。第二它告诉系统其它组件请求的服务“在哪里”。来自第一步的Http请求就会在这个文件中查找判断其是否存在对应的Action如果有则继续下去否则进行错误处理这就体现了“有什么”的意义。下面步骤中会提到“在哪里”的意义。总之strutsconfigxml起到一种站点地图的作用。()第三步在Struts观点中一个JSP的后面应该跟着一个ActionForm。尤其是当这个JSP包含表单的时候。于是当表单提交的时候这个ActionForm就会调用它的Setter方法将字段进行填充。然后,一般是在Action部分调用getter方法将字段内容进行提取起到这种作用的Java组件非JavaBean莫属。所以ActionForm本质上就是一个JavaBean在视图和控制器中充当数据通信兵。()第四步这时候又需要查看strutsconfigxml。看来它还负责告诉系统组件可以“做什么”。ActionForm把数据填充完毕后正打算将这些数据打包传送给Action但它不能这样自作主张先要查看下strutsconfigxml确定下是否还有其它的事要做最典型的就是是否需要调用validate对数据进检验。()第五步ActionForm当前面的工作都顺利通过后就可以顺理成章的将数据打包给Action了。Action会调用它的execute方法打算将封装在ActionForm中的数据移交到别的地方从struts的设计思想来看Action最好不要一厢情愿的去对ActionForm中的数据进行复杂的处理因为那不是一个控制器应该做的。最好还是留点事情给模型层做。()第六步Action把ActionForm中的数据提交给模型层如此这般(业务逻辑)后还需要负责将处理的结果在视图层呈现出来一个可行的做法是使用最原始的办法在Action中进行页面跳转这时候就像编写古老的servlet一样。但struts认为所有的页面跳转都可以统一起来管理于是就有了ActionForward这个对象。通过这个对象Action可以查找strutsconfigxml文件来确定它所请求的页面的位置(strutsconfigxml“在哪里”的意义得以体现)。在实际开发中我们也的确会体验到这种集中管理的好处。••Struts的配置strutsconfigxml的配置在讲述配置strutsconfigxml之前需要讲解一下如何使得一个web应用具有struts能力。在MyEclicpseJEEDevelopment透视图中选择MyEclipse|addstrutscapablitity命令打开“StrutssupportforMyEclipseWebProject”对话框如图所示:图添加Struts能力Strutsconfigpath表示strutsconfigxml文件存放的路径当然strutsconfgxml本身文件名也是可以修改的。Strutsspecification表示使用struts的版本ActionServletname表示的是在webxml中servlet的名字URLpattern表示Struts截获的地址类型默认情况下截获所有以do结尾的地址。Basepackagefornewclasses表示资源文件存放的包路径和以后新建文件的一个包路径可以修改。Defaultappliationresources表示默认资源文件的路径。单击Finish按钮后一个空的webproject就会多出很多的导入包和一些标签文件如图所示。••图具有Struts能力的webproject这时候一个webProject就具备了Struts的能力,同时我们也看到了它自动生成的strutsconfigxml文件下面的工作就是针对这个文件而言的。文件配置前的内容如下<strutsconfig><!配置数据源><datasources><!配置ActionForm><formbeans><!配置异常><globalexceptions><!配置全局Forward相对应的可以在ActionMapping中配置局部Forward><globalforwards><!配置Action信息><actionmappings><!消息资源文件路径><messageresourcesparameter="comyourcompanystrutsApplicationResources"><strutsconfig>下面的配置都逐一讲解各个元素的具体含义。下面的配置将围绕一个实例展开这个例子的背景是大名鼎鼎的登录。用户通过JSP页面尝试登录系统经过ActionForm的数据提交Action的逻辑判断最终用户成功登陆到一个成功页面或者是转到一个友好的错误页面。••ActionForm的配置先通过myeclipse来创建一个ActionForm。双击strutsconfigxml文件打开图形化编辑器在空白处右击在弹出的快捷菜单中选择new|Form命令将出现如图的界面。图新建ActionForm向导填写usecase并添加两个属性usename和password其它的保持默认或者会默认生成如图所示。••图新建ActionForm完成单击Finish按钮后web应用程序就会发生两个变化一个是添加了一个JavaClass代码如下:该Form类的对象存储了从页面提交的用户名和密码信息并可进行验证。**GeneratedbyMyEclipseStruts*Templatepath:templatesjavaJavaClassvtl*packagecomyourcompanystrutsformimportjavaxservlethttpHttpServletRequestimportorgapachestrutsactionActionErrorsimportorgapachestrutsactionActionFormimportorgapachestrutsactionActionMapping***MyEclipseStruts*Creationdate:**XDocletdefinition:*strutsformname="loginForm"*默认继承ActionFormpublicclassLoginFormextendsActionForm{••**Generatedfields*密码**passwordproperty*privateStringpassword用户名**usernameproperty*privateStringusername**GeneratedMethods****Methodvalidate*parammapping*paramrequest*returnActionErrors*验证方法它是否执行取决于对应action中的validate属性如果为true则执行否则不执行。publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest){TODOAutogeneratedmethodstub可以在这里添加验证代码return}***Methodreset*parammapping*paramrequest*重置方法它在validate之前运行一般用于数据类型转化publicvoidreset(ActionMappingmapping,HttpServletRequestrequest){TODOAutogeneratedmethodstub}***Returnsthepassword*returnString*publicStringgetPassword(){returnpassword••}***Setthepassword*parampasswordThepasswordtoset*publicvoidsetPassword(Stringpassword){thispassword=password}***Returnstheusername*returnString*publicStringgetUsername(){returnusername}***Settheusername*paramusernameTheusernametoset*publicvoidsetUsername(Stringusername){thisusername=username}}另一个变化就是修改了strutsconfigxml文件修改后的文件内容如下:<strutsconfig><datasources><formbeans><!所有的ActionForm都需要在这里配置><formbeanname="loginForm"type="comyourcompanystrutsformLoginForm"><formbeans><globalexceptions><globalforwards><actionmappings><messageresourcesparameter="comyourcompanystrutsApplicationResources"><strutsconfig>通过对比发现新的strutsconfigxml文件中<formbeans>元素的内容不再是空了而是多了一项<formbeanname="loginForm"type="comyourcompanystrutsformLoginForm">事实上每个ActionForm都对应一个frombean元素这个元素描述了这个Form••的名称和类路径信息。以便在其它地方引用的时候可以找到这个ActionForm的具体位置同时体现了一种简单隐藏复杂的思想:给一个复杂的事务命上一个简单的名称。Action的配置当用户登录后ActionForm将用户名和密码信息包装后提交一个Action。在myeclipse中这样配置Action先用新建ActionForm的办法新建一个Action如图所示。图新建Action将刚才新建的ActionForm在Form标签页中引用进来这样这个将要建立的LoginAction与loginForm就扯上了关系。单击Finish按钮后整个应用也会发生两个变化一个是新添加了一个JavaClass内容如下:**GeneratedbyMyEclipseStruts*Templatepath:templatesjavaJavaClassvtl*packagecomyourcompanystrutsactionimportjavaxservlethttpHttpServletRequestimportjavaxservlethttpHttpServletResponseimportorgapachestrutsactionAction••importorgapachestrutsactionActionFormimportorgapachestrutsactionActionForwardimportorgapachestrutsactionActionMappingimportcomyourcompanystrutsformLoginForm***MyEclipseStruts*Creationdate:**XDocletdefinition:*strutsactionpath="login"name="loginForm"scope="request"validate="true"*默认继承ActionpublicclassLoginActionextendsAction{**GeneratedMethods****Methodexecute*parammapping*paramform*paramrequest*paramresponse*returnActionForward*执行控制的方法。publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){LoginFormloginForm=(LoginForm)formreturn}}可以通过代码看到execute方法中添加了LoginForm的相关代码也就是说这个Action获得了LoginForm的一个实例通过这个JavaBean的getter方法就可以将用户名和密码取出来后面的事情就是进行验证等逻辑操作了。另一个变化就是在strutsconfigxml中填加了如下内容:<actionmappings><action<!属性值>attribute="loginForm"<!ActionForm的名称>name="loginForm"<!通过logindo可以访问到此Action>path="login"••<!ActionForm的生命周期而不是Action>scope="request"<!Action的类路径>type="comyourcompanystrutsactionLoginAction"><actionmappings>类似于ActionForm每个Action都会对应一个action元素各属性的含义是:attribute:与此Action关联的ActionForm在requestsession内key值通过它们的getAttribute()方法可以得到它。这个名称不一定要是前面出现过的ActionForm的名称虽然默认如此。name:它不是Action的名称而是它所关联的ActionForm的名称且这个名称必须实在<formbean>中声明过了的。path:ActionServlet如何找到这个Action的呢?就是通过这个path。它代表这个Action访问路径scope:此Action所关联的ActionForm的存在范围。它是request或者sessiontype:代表当前Action的类路径。Forward的配置Forward有两种局部的和全局的它都是相对于Action而言。配置局部的Forward只要修改下某个具体的Action的配置。仍以上面的LoginAction为例这里我们为它添加一个Forward。做法是进入strutsconfigxml的图形编辑界面右击刚才建立的LoginAction在快捷菜单里选择property命令进入到开始创建时候的界面在下面选择forward标签页单击“Add”按钮为它添加一个Forwad如图所示。••图新建Forward确认添加后发现strutsconfigxml文件loginAction的相关部分发生了如下的变化:<actionattribute="loginForm"name="loginForm"path="login"scope="request"type="comyourcompanystrutsactionLoginAction"><forwardname="success"path="successjsp"><action>可以看出内容多了一行<forwardname="success"path="successjsp">其含义是自明的。这个forward只能被loginAction使用那么如何配置一个全局的Forwad呢。通过新建Action或者ActionForm的办法新建一个Forward如图所示。••图新建一个全局Forward单击Finish按钮后查看strutsconfigxml文件发现新添加了:<globalforwards><!配置一个全局forwardÆ<forwardname="globalSuccess"path="successjsp"><globalforwards>这样配置的Forward不属于任何一个Action可以被所有的Action使用。所以是全局的。综上可见Forward的配置是很简单的。strutsconfigxml的其它配置上面几小节介绍的都是struts配置中的常用元素除此之外还有一些非常用但在某些场合下又非常有用的元素:添加过渡引言<datasourse>:配置数据源<globalexecptions>:全局异常<controller>:定义控制配置类<messageresources>:消息资源配置<plugin>:插件配置Struts的标签库在了解完struts的开发流程后本节将开始学习struts的标签技术有人说“struts就是一些标签”这种说法虽然欠严谨但也可以看出标签在struts中的地位。本节不再详述自定义标签技术细节那是JSP所关注的内容。而是学习Struts中标签的具体••用法。Struts的主要三个标签库:HTML标签库logic标签库bean标签库。html标签库这个标签库主要用于显示它基本上只是对HTML标签进行简单封装使得用户使用更加方便同时可以和Struts其它组件很好的结合在一起比如<html:form>和ActionForm的关系。<html:html>标签这是最简单的标签它的作用仅仅是在使用标签处产生一个<html>元素可能还包含一个locale或者lang属性。这个属性取决于struts的版本struts为locale属性struts为lang。用法分别为:<html:htmllocale=”true”><html:htmllang=”true”>使用myeclipse创建一个struts模板的JSP后默认代码如下:<pagelanguage="java"pageEncoding="GB"><tagliburi="http:jakartaapacheorgstrutstagsbean"prefix="bean"><tagliburi="http:jakartaapacheorgstrutstagshtml"prefix="html"><tagliburi="http:jakartaapacheorgstrutstagslogic"prefix="logic"><tagliburi="http:jakartaapacheorgstrutstagstiles"prefix="tiles"><tagliburi="http:jakartaapacheorgstrutstagstemplate"prefix="template"><tagliburi="http:jakartaapacheorgstrutstagsnested"prefix="nested"><!DOCTYPEHTMLPUBLIC"WCDTDHTMLTransitionalEN"><html:htmllocale="true"><head><html:base><title>tagjsp<title><metahttpequiv="pragma"content="nocache"><metahttpequiv="cachecontrol"content="nocache"><metahttpequiv="expires"content=""><metahttpequiv="keywords"content="keyword,keyword,keyword"><metahttpequiv="description"content="Thisismypage"><!<linkrel="stylesheet"type="textcss"href="stylescss">><head><body>••这是一个Struts页面Thisastrutspage<br><body><html:html>黑色加粗部分就是自动生成的<html:html>标签。同时我们也可以了解到struts支持的标签库列表。<html:base>标签在上面的例子中还看到了一个<html:base>标签。它的用法比较简单。就像使用html的base标签一样。访问上面的jsp。查看客户端代码:<!DOCTYPEHTMLPUBLIC"WCDTDHTMLTransitionalEN"><htmllang="zh"><head><basehref="http:localhost:sshtagjsp"><title>tagjsp<title><metahttpequiv="pragma"content="nocache"><metahttpequiv="cachecontrol"content="nocache"><metahttpequiv="expires"content=""><metahttpequiv="keywords"content="keyword,keyword,keyword"><metahttpequiv="description"content="Thisismypage"><!<linkrel="stylesheet"type="textcss"href="stylescss">><head><body>这是一个Struts页面<br><body><html>可见<html:base>标签的用法是在其出现的位置上添加一句base语句并给其href属性赋值。<html:link>标签它本质上是在生成一个<a>标签下面通过不同的属性介绍它的作用。连接一个外部的URL地址用法非常简单。如下:<html:linkhref=”http:wwwoyxfcn”>本书作者博客<html:link>从这个意义上而言它完全等价于<ahref=”http:wwwoyxfcn”>本书作者博客<a>••如果是连接一个内部的文件可以使用page属性用法如下:<html:linkpage=”welcomejsp”>首页<html:link>如果需要添加参数可以直接在后面以开始进行添加和<a>的用法一致。如<html:linkpage=”welcomejspindex=”>首页<html:link>如果说<html:link>仅仅是具有上面一些鸡毛蒜皮的能力那么我们就应该对他的存在表示质疑了。还好他没有让我们失望的是它的功能不仅仅如此。如果在strutsconfigxml文件中定义了一个全局的Forward。比如:<globalforwards><forwardname="index"path="indexjsp"><globalforwards>那么可以通过<html:link>使用到这个forward地址:<html:linkforward=”index”>首页<html:link>效果等价于超级链接到这个页面。它的方便在于不用关心这个页面的可能长长的绝对路径。再来看<html:link>的另一个功能。假如在第一个jsp文件中有如下内容:<Stringtest="thisisateststring"requestsetAttribute("teststr",test)>那么在第二个jsp文件如果要将第一个jsp文件中的test值做为参数放在<a>标签的后面一般的做法是(前提是第一个jsp对第二个jsp文件有http请求操作比如forward)<Stringteststr=(String)requestgetAttribute(“teststr”)><ahref=”somepagejspparam=<=teststr>”><a>为了减少代码量。<html:link>可以直引用用法如下:<html:linkforward="index"paramId="param"paramName="teststr">首页<html:link>查看客户端代码:<ahref="sshindexjspparam=thisisateststring">首页<a><html:img>标签这个标签用来显示图片用法简单如下:<html:imgpage=”buttonjpg”><html:form>标签这个在前面已经接触过现在进行详细讲解并采用前面的代码formjsp:<pagelanguage="java"pageEncoding="GB"><tagliburi="http:jakartaapacheorgstrutstagsbean"prefix="bean"><tagliburi="http:jakartaapacheorgstrutstagshtml"prefix="html"><html><head>••<title>JSPforFutureFormform<title><head><body><html:formaction="future"><!姓名>Name:<html:textproperty="name"><html:errorsproperty="name"><br><!年龄>age:<html:textproperty="age"><html:errorsproperty="age"><br><html:submit><html:cancel><html:form><body><html>这段页面代码中使用到了<html>标签库中的<html:form>标签做为表单元素元素包含姓名和年龄两个字段它对应相应的ActionForm中的两个属性。<html:form>标记可以生成表单元素但和普通的<form>标签有所不同。<form>的含义比较单纯它的action属性只是一个servlet或者jsp。但<html:form>的含义会比较复杂一些。在它的属性约束上可以得到体现:zaction属性的书写形式往往以do结尾zaction必须为strutsconfigxml中已经配置好了的action名称z这个表单都对应一个ActionForm。所以表单的填充域标签属性都不能随意。用法:<html:formaction="future">Action属性往往对应一个Action类的path路径它在Strutsconfigxml中配置。<html:text>标签它用来生成一个文本框往往出现在<html:form>中如果不在<html:form>中会报错。错误类似于如下代码:javaxservletServletException:CannotfindbeanorgapachestrutstaglibhtmlBEANinanyscopeorgapachejasperruntimePageContextImpldoHandlePageException(PageContextImpljava:)orgapachejasperruntimePageContextImplhandlePageException(PageContextImpljava:)orgapachejspMyJspjspjspService(MyJspjspjava:)orgapachejasperruntimeHttpJspBaseservice(HttpJspBasejava:)javaxservlethttpHttpServletservice(HttpServletjava:)orgapachejasperservletJspServletWrapperservice(JspServletWrapperjava:)orgapachejasperservletJspServletserviceJspFile(JspServletjava:)orgapachejasperservletJspServletservice(JspServletjava:)javaxservlethttpHttpServletservice(HttpServletjava:)其属性值与<html:form>对应的ActionForm属性值一致。其用法如下:<html:formaction="futuredo"><html:textproperty="name"><!姓名>••<html:password><!密码><html:form><html:text>它必须出现在<html:form>标签体里面。<html:password>标签它用来在页面生成一个密码输入框在这个框中输入的字符都以*显示。这个标签必须与<html:form>配合使用也就是说它必须出现在<html:form>标签体里面。否则会出错。它的属性值必须是对应的ActionForm中存在的属性名称。用法如下:<html:formaction="futuredo"><!这里的age必须是对应的ActionForm中存在的属性><html:passwordproperty="age"><html:password><html:password>标签和<html:text>的区别是在<html:password>输入的字符不会被显示一般以黑点呈现。<html:textarea>标签它的用法和<textarea>没多大的区别在页面上显示一个多行的文本输入框。约束和<html:text>等一样。用法如下:<html:formaction="futuredo"><html:textareaproperty="name"rows=""><html:textarea><html:password><html:textarea>标签的rows属性表示这个文本框的高度它以行为单位如果要设置宽度可以用cols属性。<html:hidden>标签它是隐藏填字段的struts写法但有所扩展。这个标签可以在<html:form>标签体外存在。用法如下:<html:hiddenproperty="test"value="Iamhidden">等价于:<inputtype=hiddenname=”test”value=”Iamhidden”>不过<html:hidden>具有一个write属性当这个属性的值为true的时候这个隐藏的值就会被显示出来如:<html:hiddenproperty="test"value="Iamhidden"write=”true”>在客户端页面上将输出Iamhidden效果如图所示:••图输出Iamhidden<html:submit>标签这个标签没有什么扩展的内容。用法如下:<html:submit>等价于:<inputtype=submit><html:reset>标签它用于复位表单中的各输入内容。用法如下:<html:reset>它必须出现<html:form>表单标签体内部才有意义在页面以按钮形式呈现当点击这个这个按钮时表单中所有已经输入的内容都会被置空其效果等价于<inputtype=reset><html:cancel>标签这是一个取消按钮标签它的功能非常类似于浏览器工具栏中的取消按钮它用在<html:form>中当表单提交后用户突然想取消提交那么就可以使用这个标签。这个标签的本质一个submit类型的标签提交地址为表单action属性地址。提交后运行了一段JavaScript脚本将一个称为bCancel的变量赋值为true使得isCanceled()方法为true要使得这个cancel有效必须在Action中捕获。代码类似于:***Methodexecute*parammapping*paramform*paramrequest*paramresponse*returnActionForward*publicActionForwardexecute(ActionMappingmapping,ActionFormform,••HttpServletRequestrequest,HttpServletResponseresponse){如果被取消isCancelled方法是继承父类的。if(isCancelled(request)){returnmappingfindForward("index")返回主页}否则可以在这里实现一些控制逻辑代码dosomethinghere}isCancelled方法继承于Action它用来判断用户时候取消了Http请求。html标签库中的其它标签Struts的html标签库本质上是对标准HTML标签库的一个再度封装所以Struts的html标签库基本囊括了HTML标签库中的常用标签如下面的:添加过渡引言<html:checkbox>:生成选择框<html:multibox>:生成复选框<html:radio>:生成单选框<html:select><html:option><html:options><html:options>:生成选择列表<html:file>:用于文件上传<html:errors>:这个标签用来显示错误信息。其实现机制较复杂它和ActionErrors消息资源文件结合一起生成错误信息。<html:messages>标签:用于显示消息类似于<html:errors>logic标签库这个标签库中的标签主要是用来实现一些控制逻辑避免在JSP页面上书写过多的java代码让非开发人员也能容易的做开发人员做的事情。<logic:equal>标签这个标签用来判断一个变量和指定的常量是否相等。用法如下:<pageContextsetAttribute("str","")><logic:equalname="str"value="">相等<logic:equal>它判断str是否和字符串“”相等它的效果等价于:<pageContextsetAttribute("str","")Stringstr=(String)pageContextgetAttribute("str")if(strequals("")){更好的写法是:“”equals(str)outprint("相等")••}>这样避免了在JSP中书写具有逻辑意义的Java代码。<logic:equal>的name属性不仅接受pageContext同时也接受request对象的Attribute等。<logic:equal>还有几个基本属性header属性的含义和用法非常简单下面通过一个例子进行描述:<logic:equalheader=”host”value=”localhost:”>服务器地址为localhost:<logic:equal>可见它就是判断主机ip:port地址是否和指定的地址相等。<logic:equal>的parameter属性是一个有用的属性它可以获取http请求参数。用法如下所示:<ahref=”tagjspparam=haha”>clickme<a><logic:equalparameter=”param”value=”haha”>haha<logic:equal>这端代码用来判断param是否与”haha”相等而这个过程如果采用传统方式的话需要显示的使用request对象调用它的getter方法。这段代码效果等价于:<Stringparam=requestgetParameter("param")outprint(param)>除此cookie属性可以判断cookie值是否与一个指定的值相等。既然有相等那一定还有不相等大于大于等于小于小于等于逻辑标签。它们分别是<logic:notEqual><logic:greaterThan><logic:greaterEqual><logic:lessThan><logic:lessEqual>它们具有同样的属性类似的用法。<logic:iterate>标签这是一个旨在取代for或者while循环语句的标签。它能进行ArrayCollectionMap的迭代。用法如下:<Stringarray={"a","b","c","d","e"}pageContextsetAttribute("testArray",array)><logic:iterateid="testArray"name="testArray"><bean:writename="testArray"><logic:iterate>代码逻辑是依次输出array数组的内容输出结果为abcde如图所示。图输出abcde效果等价于:<Stringarray={"a","b","c","d","e"}••<!pageContext是一个内置的jsp对象在自定义标签技术中使用的比较多>pageContextsetAttribute("testArray",array)StringtestArray=(String)pageContextgetAttribute("testArray")for(inti=i<testArraylengthi){out

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/36
1下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部