




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaServerFaces技术简介主要内容JSF简介JSF入门ManagedBeans数据转换与验证JSF生命周期事件处理JSF标签JSF简介什么是JSFJSF体系结构什么是JSFJavaServerFaces(JSF):JavaServerFaces(JSF)是一种用于构建Web应用程序的新标准Java框架。它提供了一种以组件为中心来开发JavaWeb用户界面的方法,从而简化了开发。JavaServerFaces还引起了广大Java/Web开发人员的兴趣。“企业开发人员”和Web设计人员将发现JSF开发可以简单到只需将用户界面(UI)组件拖放到页面上,而“系统开发人员”将发现丰富而强健的JSFAPI为他们提供了无与伦比的功能和编程灵活性。JSF还通过将良好构建的模型-视图-控制器(MVC)设计模式集成到它的体系结构中,确保了应用程序具有更高的可维护性。最后,由于JSF是通过JavaCommunityProcess(JCP)开发的一种Java标准,因此开发工具供应商完全能够为JavaServerFaces提供易于使用的、高效的可视化开发环境。什么是JSF使用JavaServerFacesTechnology创建一个JSP页面时,在服务器的内存中会建立一个组件树,每一个组件标签对应树中的一个UIComponent实例。该框架使用组件树来处理应用程序的请求并且创建一个呈现出的响应。当用户生成一个事件时,例如,点击了一个按钮,JavaServerFaces生命周期即处理该事件并且产生适当的响应。什么是JSFFacesServlet是进入JavaServerFaces框架的入口点。它管理请求,处理生命周期并且用作一个前端控制器。JavaServerFacesTechnology也有保存重要请求信息的上下文的概念。上下文对象被称为FacesContext。在JavaServerFacesTechnology生命周期的每个阶段上下文对象都被修改并且每次请求时都是有效的。
什么是JSFJSF提供:标准的编程接口丰富可扩展的组件库一个核心的JSP标记库用来处理事件、执行验证以及其他非UI相关的操作(core)一个标准的HTML标记库来表示UI组件(html)事件驱动模型JSF通过IDE工具支持拖放式开发。什么是JSF目标简化开发超越现有Web框架试图在不同的角度上提供网页设计人员、应用程序设计人员、组件开发人员解决方案,让不同技术的人员可以彼此合作又不互相干扰JSF体系结构JSF的主要优势之一就是它既是JavaWeb用户界面标准又是严格遵循模型-视图-控制器(MVC)设计模式的框架。用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离使JSF应用程序更易于管理。为了准备提供页面对应用程序数据访问的JSF上下文和防止对页面未授权或不正确的访问,所有与应用程序的用户交互均由一个前端“Faces”servlet(控制器)来处理。JSF入门第一个JSF程序JSFExpressionLanguage国际化(I18N)第一个JSF程序JSF开发所需要的包jsf-api.jar包含有Facesservlet与其它相关javax.faces包下面的类
jsf-impl.jarJSF的参考实现
jstl.jar包含JavaServerFacesStandardTagLibraryclasses(JSTL)。standard.jar使用JSTL时需要用到它第一个JSF程序Web.xml配置JSF应用的引擎
<servlet> <servlet-name>FacesServlet</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.faces</url-pattern></servlet-mapping>使用JSF时,所有的请求都透过FacesServlet来处理
第一个JSF程序JSP引入标签库<%@tagliburi="/jsf/html"prefix="h"%><%@tagliburi="/jsf/core"prefix="f"%> JSF的core与html标签库,core是有关于UI组件的处理,而html则是有关于HTML的进阶标签
第一个JSF程序简单的导航Navigation在JSF中是根据faces-config.xml中<navigation-rule>设定,以决定在符合的条件成立时,该连结至哪一个页面,一个基本的设定如下
<navigation-rule> <from-view-id>/pages/index.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/pages/welcome.jsp</to-view-id>
</navigation-case>
<navigation-case><from-outcome>failure</from-outcome><to-view-id>/pages/index.jsp</to-view-id></navigation-case></navigation-rule>
第一个JSF程序在<navigation-rule>中的<from-view-id>是个选择性的定义,它规定了来源页面的条件,<navigation-case>中定义各种导览条件,<from-outcome>定义当Model方法返回的逻辑符合的条件时,各自改导向哪一个目的页面,目的页面是在<to-view-id>中定义。
根据上面的定义,当传回的字符串是“success”时,将前往welcome.jsp,如果“failure”的话,将送回index.jsp。
在JSF中的ViewID是从Web应用程序的环境相对路径开始计算,设定时都是以/作为开头
JSFExpressionLanguage搭配JSF标签来使用,是用来存取数据对象的一个简易语言。以#开始,将变量或运算式放置在{与}之间。#{userB}对于Map类型对象,可以使用‘.’运算符指定key值来取出对应的value,也可以使用[与]来指定。#{param['name']}#{someBean.someMap[]}如果变量是List类型或阵列的话,则可以在[]中指定索引。#{someBean.someList[0]}JSFExpressionLanguage也可以指定字面常数,对于true、false、字符串、数字,JSFEL会尝试进行转换。<h:outputTextvalue="#{true}"/><h:outputTextvalue=“#{‘Thisisatest’}”/>在声明变量名称时,要留意不可与JSF的保留字或关键字同名。truefalsenulldivmodandornoteqneltgtlegeinstanceofempty在EL中可以直接进行一些算术运算、逻辑运算与关系运算。算术运算符:加法(+),减法(-),乘法(*),除法(/ordiv)与余除(%ormod)三元运算:(expression?result1:result2)逻辑运算:and(或&&)、or(或!!)、not(或!)关系运算:小于Less-than(<orlt)、大于Greater-than(>orgt)、小于或等于Less-than-or-equal(<=orle)、大于或等于Greater-than-or-equal(>=orge)、等于Equal(==oreq)、不等于NotEqual(!=orne)EL运算符的执行优先顺序与Java运算符对应国际化信息JSF的国际化(Internationalization,简写I18N)信息处理是基于Java对国际化的支持,可以在一个信息资源文件中统一管理信息资源,资源文件的名称是.properties,而内容是名称与值的配对。资源文件名称由basename加上语言与地区来组成:
perties basename_perties basename_zh_CN.properties信息资源文件必须是ISO-8859-1编码,所以对于非西方语系的处理,必须先将之转换为JavaUnicodeEscape格式:
nameText=名称nameText=\u540d\u79f0
使用<f:loadBundle>标签来指定载入信息资源:
<f:loadBundlebasename="messages"var="msgs"/> <h:outputTextvalue="#{Text}"/>国际化信息<f:view>可以设定locale属性,直接指定所要使用的语系:
<f:viewlocale="zh_CN"> <f:loadBundlebasename="messages"var="msgs"/>也可以在faces-config.xml中设定语系:
<faces-config> <application> <local-config> <default-locale>zh_CN</default-locale> <supported-locale>en</supported-locale> </local-config></application></faces-config>
甚至可以让使用者选择自己的语系:
<f:viewlocale="#{user.locale}"> <f:loadBundlebasename="messages"var="msgs"/>
<h:selectOneRadiovalue="#{user.locale}"> <f:selectItemitemValue="zh_CN"itemLabel="#{msgs.zh_CNText}"/><f:selectItemitemValue="en"itemLabel="#{msgs.enText}"/></h:selectOneRadio>
ManagedBeansJSF使用Bean来达到逻辑层与表现层分离的目的,在JSF中的Bean其角色是属于BackingBean,又称之为GlueBean,其作用在真正的业务逻辑Bean及UI组件之间搭起桥梁,上下传递数据。在BackingBean中会调用业务逻辑Bean处理浏览器的请求,请求的数据第一步先提交给BackingBean的相应属性,再将这些属性的值提交给其所调用的下层业务逻辑进行处理,处理完毕,改变BackingBean相应属性值,接着UI组件取出这些属性的值并将属性的值显示在浏览器用户界面上。Bean的管理集中在faces-config配置文件中,只要修改配置文件,就可以修改Bean之间的相依关系。ManagedBeans在faces-config.xml中集中管理作用域:application:一直存活 直到应用程序结束位置
session:会话过程 在使用者应用程序交互开始,直到关闭浏览器或显示的结束会话(例如退出程序)。
request:请求阶段none:需要时,临时Beans的配置与设定JSF预定义会读取faces-config.xml中关于Bean的定义可在web.xml中利用javax.faces.CONFIG_FILES参数指定自定义文件:
<web-app> <context-param><param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml,/WEB-INF/beans.xml</param-value> </context-param>... </web-app>
定义文件可以有多个,中间以“,”区隔:
/WEB-INF/faces-config.xml,/WEB-INF/beans.xml
Beans的配置与设定Bean的基本定义:名称 <managed-bean-name>类 <managed-bean-class> 存活范围 <managed-bean-scope>可选设置属性的初始值 <managed-property><managed-property> <property-name>user</property-name> <value>#{user}</value></managed-property>Beans上的List
<managed-property><property-name>someProperty</property-name><list-entries><value-class>java.lang.Integer</value-class><value>1</value><value>2</value><value>3</value></list-entries></managed-property>
数据转换与验证转换器(Converter)协助模型与视图之间的数据转换验证器(Validator)协助进行语意检验(SemanticValidation)标准转换器HTTP字符串Java对象
Web应用程序与浏览器之间是使用HTTP进行沟通,所有传送的数据基本上都是字符串文字,而Java应用程序本身基本上则是对象,所以对象数据必须经由转换传送给浏览器,而浏览器送来的数据也必须转换为对象才能使用。
对于基本数据类型(primitivetype)或是其Wrapper类,JSF会使用javax.faces.Boolean、javax.faces.Byte……等自动进行转换对于BigDecimal、BigInteger,则会使用javax.faces.BigDecimal、javax.faces.BigInteger自动进行转换Beans上的Map<managed-property><property-name>someProperty</property-name><map-entries><value-class>java.lang.Integer</value-class><map-entry><key>someKey1</key><value>100</value></map-entry><map-entry><key>someKey2</key><value>200</value></map-entry></map-entries></managed-property>标准转换器标准的JSF转换器转换器javax.faces.BigDecimaljavax.faces.BigIntegerjavax.faces.Boolean
javax.faces.Bytejavax.faces.Characterjavax.faces.DateTimejavax.faces.Doublejavax.faces.Float标准转换器实现类javax.faces.convert.BigDecimalConverterjavax.faces.convert.BigIntegerConverterjavax.faces.convert.BooleanConverterjavax.faces.convert.ByteConverterjavax.faces.convert.CharacterConverterjavax.faces.convert.DateTimeConverterjavax.faces.convert.DoubleConverterjavax.faces.convert.FloatConverter标准转换器对于DateTime、Number,可以使用<f:convertDateTime>、<f:convertNumber>标签进行转换,它们各自提供有一些简单的属性,可以让我们在转换时指定一些转换的格式细节:
<h:outputTextvalue="#{user.date}"><f:convertDateTimepattern="yyyy/MM/dd"/></h:outputText>自定义转换器实现javax.faces.convert.Converter接口,这个接口有两个要实现的方法:publicObjectgetAsObject(FacesContextcontext,UIComponentcomponent,Stringstr);publicStringgetAsString(FacesContextcontext,UIComponentcomponent,Objectobj);在faces-config.xml中注册:<converter> <converter-id>cn.wiztek.converter.User</converter-id> <converter-class>cn.wiztek.converter.UserConverter </converter-class></converter>在JSF页面中通过converter-id使用转换器:
<h:outputTextvalue="#{guest.user}"converter="cn.wiztek.converter.User"/>标准验证器语法检验(SynaticValidation)检查使用者输入的数据是否合乎我们所要求的格式,最基本的就是检查使用者是否填入了栏目值,或是栏目值的长度、大小值等等是否符合要求。三种标准验证器:<f:validateDoubleRange><f:validateLongRange><f:validateLength>
标准验证器JSF提供三个标准检验组件:
DoubleRangeValidator:组件的本地值必须是数字类型的;必须处于最小值、最大值或这两者指定的范围内。
LongRangeValidator:组件的本地值必须是数字类型的,并可以转换为long;必须处于最小值、最大值或这两者指定的范围内。
LengthValidator:类型必须是string;长度必须处于最小值、最大值或这两者指定的范围内。
自定义验证器实现javax.faces.validator.Validator接口中的validate()方法,如果验证错误,则丢出一个ValidatorException,它接受一个FacesMessage对象,这个对象接受三个参数,分别表示信息的严重程度(INFO、WARN、ERROR、FATAL)、信息概述与详细信息内容,这些信息将可以使用<h:messages>或<h:message>标签显示在页面上。在faces-config.xml中注册验证器的标识(ValidaterID)。通过<f:validator>标签并设定validatorId属性来使用自定义验证器。错误信息处理预定义的错误信息可以使用<h:messages>或<h:message>标签显示出来通过提供一个信息资源文件可以修改预定义的错误信息提供了支持中文的错误信息文件Messages_zh_CN.properties也可以在程序中使用FacesMessage来提供信息自定义转换/验证标签使用<f:attribute>标签来设定属性:<f:attributename="pattern"value=".+[0-9]+"/>
在自定义验证器中用下面语句获取属性:Stringpattern=(String)component.getAttributes().get("pattern");也可以开发自己的一组验证标签,并提供相关属性设定:<co:passwordValidatorpattern=".+[0-9]+"/>
事件处理动作事件(ActionEvent)即时事件(ImmediateEvent)值变事件(ValueChangeEvent)阶段事件(PhaseEvent)动作事件(ActionEvent)通过action属性绑定一个事件方法:<h:commandButtonvalue="提交"action="#{user.verify}"/>
通过actionListener属性绑定一个事件方法,action绑定返回结果的方法:<h:commandButtonvalue="提交"actionListener="#{user.verify}"action="#{user.outcome}"/>用<f:actionListener>标签向组件注册事件监听器(实现javax.faces.event.ActionListener接口),action绑定返回结果的方法:<h:commandButtonvalue="提交"action="#{user.outcome}"><f:actionListenertype="onlyfun.caterpillar.LogHandler"/><f:actionListenertype="onlyfun.caterpillar.VerifyHandler"/></h:commandButton>
即时事件(ImmediateEvent)即时事件是指JSF视图组件在取得请求中该取得的值之后,即立即处理指定的事件,而不再进行后续的转换器处理、验证器处理、更新模型值等流程。
<h:commandButtonvalue="#{msgs.Text}" immediate="true" actionListener="#{user.changeLocale}"/>
值变事件(ValueChangeEvent)使用者改变了JSF输入组件的值后提交表单,就会发生值变事件,丢出一个javax.faces.event.ValueChangeEvent对象直接设定JSF输入组件的valueChangeListener属性:
<h:selectOneMenuvalue="#{user.locale}" onchange="this.form.submit();" valueChangeListener="#{user.changeLocale}"> <f:selectItemitemValue="zh_CN"itemLabel="Chinese"/> <f:selectItemitemValue="en"itemLabel="English"/></h:selectOneMenu>
实现javax.faces.event.ValueChangeListener接口,并定义其processValueChange()方法;然后在JSF页面上使用<f:valueChangeListener>标签,并设定其type属性:
<h:selectOneMenuvalue="#{user.locale}" onchange="this.form.submit();"> <f:valueChangeListenettype=“cn.wiztek.SomeListener"/><f:selectItemitemValue="zh_CN"itemLabel="Chinese"/><f:selectItemitemValue="en"itemLabel="English"/></h:selectOneMenu>阶段事件(PhaseEvent)在每个阶段的前后会引发javax.faces.event.PhaseEvent,如果您想尝试在每个阶段的前后捕捉这个事件,以进行一些处理,则可以实现javax.faces.event.PhaseListener接口,并向javax.faces.lifecycle.Lifecycle注册这个Listener,以有适当的时候通知事件的发生。
阶段事件(PhaseEvent)PhaseListener有三个必须实现的方法getPhaseId()、beforePhase()与afterPhase(),其中getPhaseId()传回一个PhaseId对象,代表Listener想要被通知的时机,可以设定的时机有:PhaseId:PhaseId.RESTORE_VIEWPhaseId.APPLY_REQUEST_VALUESPhaseId.PROCESS_VALIDATIONSPhaseId.UPDATE_MODEL_VALUESPhaseId.INVOKE_APPLICATIONPhaseId.RENDER_RESPONSEPhaseId.ANY_PHASEJSF生命周期(LifeCircle)
JSF生命周期总共经过六个阶段:JSF生命周期图JSF生命週期
一、恢复视图(RestoreView)
Toretrievethecomponenttreefortherequestedpageifitwasdisplayedpreviouslyorconstructsanewcomponenttreeifitisdisplayedforthefirsttime.Ifthepagewasdisplayedpreviously,allcomponentsaresettotheirpriorstate.ThismeansthatJSFautomaticallyretainsforminformation.Forexample,whenauserpostsillegaldatathatarerejectedduringdecoding,theoldinputsareredisplayedsothattheusercancorrectthem.Iftherequesthasnoquerydata,theJSFimplementationskipsaheadtotheRenderResponsephase.Thishappenswhenapageisdisplayedforthefirsttime.二、应用请求值;处理事件(ApplyRequestValues)
theJSFimplementationiteratesoverthecomponentobjectsinthecomponenttree.Eachcomponentobjectcheckswhichrequestvaluesbelongtoitandstoresthem.
三、处理检验;处理事件(ProcessValidations)
thesubmittedstringvaluesarefirstconvertedto"localvalues,"whichcanbeobjectsofanytype.WhenyoudesignaJSFpage,youcanattachvalidatorsthatperformcorrectnesschecksonthelocalvalues.Ifvalidationpasses,theJSFlifecycleproceedsnormally.However,whenconversionorvalidationerrorsoccur,theJSFimplementationinvokestheRenderResponsephasedirectly,redisplayingthecurrentpagesothattheuserhasanotherchancetoprovidecorrectinputs.JSF生命週期续四、更新模型值;处理事件(UpdateModelValues)
Aftertheconvertersandvalidatorshavedonetheirwork,itisassumedthatitissafetoupdatethemodeldata.DuringtheUpdateModelphase,thelocalvaluesareusedtoupdatethebeansthatarewiredtothecomponents.五、调用应用程序;处理事件(InvokeApplication)
theactionmethodofthebuttonorlinkcomponentthatcausedtheformsubmissionisexecuted.Thatmethodcancarryoutarbitraryapplicationprocessing.Itreturnsanoutcomestringthatispassedtothenavigationhandler.六、显示响应(RenderResponse) Finally,theRenderResponsephaseencodestheresponseandsendsittothebrowser.Whenausersubmitsaform,clicksonalink,orotherwisegeneratesanewrequest,thecyclestartsanew.JSF生命周期总结TheRestoreViewphase
recreatestheserver-sidecomponenttreewhenyourevisitaJSFpage.TheApplyRequestValuesphase
copiesrequestparametersintocomponentsubmittedvalues.TheProcessValidationsphase
firstconverts
thosesubmittedvaluesandvalidates
theconvertedvalue.TheUpdateModelValuesphasecopies(convertedandvalidated)valuestothemodel,whichistypicallydenotedinJSFpageswithvaluereferenceexpressions,suchas:<h:inputTextvalue="#{}"/>TheInvokeApplicationphaseinvokes
actionlistenersandactions,inthatorder,forcommandcomponents.Youcanregisteranactionlistenerandanactionwithacomponentlikethis:<h:commandButtonaction="#{bean.action}"actionListener="#{bean.listener}".../>Inthatcase,theJSFimplementationwillinvoke
thebean'slistenermethodfollowedbytheactionmethod.Finally,theRenderResponsephasesaves
stateandloadsthenextview.ForJSP-basedapplicationstheJSFnavigationhandlerforwardsorredirectstoanotherJSPpage.StartingwiththeApplyRequestValuesphases,eventscanbecreatedandplacedonaneventqueueduringeachlife-cyclephase.Afterthosephases,theJSFimplementationbroadcastsqueuedeventstoregisteredlisteners.生命周期6个阶段解释回复画面(RestoreView)对于选择的页面如果是初次浏览则建立新的组件树。如果是会话阶段,会从使用者端或服务器端的数据找寻数据以回复每个组件的状态并重建组件树,如果不包括请求参数,则直接跳过接下来的阶段直接绘制响应。套用申请值(ApplyRequestValues)每个组件尝试从到来的请求中找寻自己的参数并更新组件值,在这边会触发ActionEvent,这个事件会被排入队列中,然后在唤起应用程序阶段之后才会真正由事件处理者进行处理。然而对于设定immeduate为true的命令(Commamnd)组件来说,会立即处理事件并跳过之后的阶段直接绘制响应,而对于设定immediate为true的输入(Input)组件,会马上进行转换验证并处理值变事件,之后跳过接下来的阶段,直接绘制响应。执行验证(ProcessValidations)进行转换与验证处理,如果验证错误,则会跳过之后的阶段,直接绘制响应,结果是重新呼叫同一页绘制结果。更新模型值(UpdateModelValues)更新每一个与组件绑定的backingbean或模型对象。唤起应用程序(InvokeApplication)处理动作事件,并进行后端应用程序逻辑。绘制回应(RenderResponse)使用绘制器绘制页面。JSF标签标准标签输出类标签输入类标签命令类标签选择类标签其他标签表格处理生命周期进一步解释这六个阶段是JSF处理表单GUI的一般次序。这个列表按照每个阶段可能的执行次序和事件处理进行排列,但是JSF生命周期并不是固定的。可以改变执行的次序,跳过某些阶段或完全脱离生命周期。例如,如果一个无效的请求值被复制到组件,那么会重新显示当前视图,并可能不执行某些阶段。还可以选择完全脱离JSF,比如将处理委托给一个servlet或另一个应用程序框架。在这种情况下,可以执行一个FacesContext.responseComplete方法调用,将用户重定向到另一个页面或Web资源,然后使用请求调度器(从FacesContext中的请求对象获得)转发到适当的Web资源。也可以调用FacesContext.renderResponse来重新显示原来的视图。JSF标准标签输出(Outputs)其名称以output作为开头,作用为输出指定的信息或绑定值。输入(Inputs)其名称以input作为开头,其作用为提供使用者输入框。命令(Commands)其名称以command作为开头,其作用为提供命令或链接按钮。选择(Selections)其名称以select作为开头,其作用为提供使用者选项的选取。其它包括了form、message、messages、graphicImage等等未分类的标签。标准HTML标签的属性属性名称适用说明id所有组件可指定id名称,以让其它标签或组件参考binding所有组件绑定至UIComponentrendered所有组件是否显示组件styleClass所有组件设定Cascadingstylesheet(CSS)value输入、输出、命令组件设定值或绑定至指定的值valueChangeListener输入组件设定值变事件处理者converter输入、输出组件设定转换器validator输入组件设定验证器required输入组件是否验证必填输入框immediate输入、命令组件是否为即时事件输出类标签outputLabel产生<label>HTML标签,使用for属性指定组件的clientID,例如:
<h:inputTextid="user"value="#{}"/> <h:outputLabelfor="user"value="#{}"/>outputLink产生<a>HTML标签,搭配<f:param>可帮链结加上参数,所有的参数都会变成name=value的类型附加在链接后,value所指定的内容也可以是JSFEL绑定。例如:
<h:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐饮店设备设施及经营模式转让合同范本
- 常州租赁合同包含租赁物使用期间的绿化维护责任
- 茶楼与茶文化主题公园合作经营协议书模板
- 酒店单层承包协议书范本
- 延期交房弃贷协议书范本
- 购买棚圈协议书范本
- 旅游景区现场调研与规划合同
- 店铺移交协议书范本
- 个性化汽车贷款需求居间服务合同
- 产业转移厂房租赁居间服务合同
- 23秋国家开放大学《小学语文教学研究》形考任务1-5参考答案
- 露天矿山开采安全-ppt
- XXX垃圾填埋场初步设计
- 水平三-《多种形式尝试投篮》教案
- ICU重症监护技术
- 新概念英语第4册课文(中英文对照)
- 环保 水保监理月报
- GB/T 3785.1-2023电声学声级计第1部分:规范
- 三国姜维传攻略
- 叙事护理学知到章节答案智慧树2023年中国人民解放军海军军医大学
- 中考英语补全对话
评论
0/150
提交评论