web.xml配置详解

web.xml配置详解 部署描述符实际上是一个XML文件,包含了很多描述servlet/JSP应用的各个方面的元素,如servlet注册、servlet映射以及监听器注册。部署描述符从下面的XML头开始: 这个头指定了XML的版本号以及所使用的编码。头的下面是DOCTYPE声明: PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 这段代码指定文件类型定义(DTD),可以通过它检查XML文档的有效性。下面显示的元素有几个特性,这些特性告诉我们关于DTD的信息:  web-app定义该文档(部署描述符,不是DTD文件)的根元素  PUBLIC意味着DTD文件可以被公开使用  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"意味着DTD由Sun Microsystems, Inc.维护。该信息也表示它描述的文档类型是DTD Web Application 2.3,而且DTD是用英文书写的。  URL"http://java.sun.com/dtd/web-app_2_3.dtd"表示D文件的位置。 注意: 在部署描述符中, 用于注释。 部署描述符的根元素是web-app。DTD文件规定,web-app元素的子元素的语法如下: distributable?, context-param*, filter*, filter-mapping*, listener*, servlet*, servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?, error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*, login-config?, security-role*,env-entry*, ejb-ref*, ejb-local-ref*)> 正如您所看到的,这个元素含有23个子元素,而且子元素都是可选的。问号(?)表示子元素是可选的,而且只能出现一次。星号(*)表示子元素可在部署描述符中出现零次或多次。有些子元素还可以有它们自己的子元素。 web.xml文件中web-app元素声明的是下面每个子元素的声明。下面的章节讲述部署描述符中可能包含的所有子元素。 注意: 在Servlet 2.3中,子元素必须按照DTD文件语法描述中指定的顺序出现。比如,如果部署描述符中的web-app元素有servlet和servlet-mapping两个子元素,则servlet子元素必须出现在servlet-mapping子元素之前。在Servlet 2.4中,顺序并不重要。 下面对web.xml文件各元素进行详解 1. icon元素 icon元素用来指定GIF格式或JPEG格式的小图标(16×16)或大图标(32×32)的文件名。 icon元素包括两个可选的子元素:small-icon子元素和large-icon子元素。文件名是Web应用归档文件(WAR)的根的相对路径。 部署描述符并没有使用icon元素。但是,如果使用XML工具编辑部署描述符,XML编辑器可以使用icon元素。

2. display-name元素 如果使用工具编辑部署描述符,display-name元素包含的就是XML编辑器显示的名称。 下面是一个含有display-name元素的部署描述符: PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> Online Store Application

3. description元素 可以使用description元素来提供有关部署描述符的信息。XML编辑器可以使用description元素的值。

4. distributable元素 可以使用distributable元素来告诉servlet/JSP容器,编写将在分布式Web容器中部署的应用: 例如,下面是一个含有distributable元素的部署描述符的例子: PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 5. context-param元素 context-param元素含有一对参数名和参数值,用作应用的servlet上下文初始化参数。参数名在整个Web应用中必须是惟一的。 param-name 子元素包含有参数名,而param-value子元素包含的是参数值。作为选择,可用description子元素来描述参数。 下面是一个含有context-param元素的有效部署描述符: PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> jdbcDriver com.mysql.jdbc.Driver

6. filter元素 filter元素用于指定Web容器中的过滤器。在请求和响应对象被servlet处理之前或之后,可以使用过滤器对这两个对象进行操作。利用下一节介绍 的filter-mapping元素,过滤器被映射到一个servlet或一个URL模式。这个过滤器的filter元素和filter-mapping 元素必须具有相同的名称。 filter-class, init-param*)> icon、display-name和description元素的用法和上一节介绍的用法相同。init-param元素与context-param 元素具有相同的元素描述符。filter-name元素用来定义过滤器的名称,该名称在整个应用中都必须是惟一的。filter-class元素指定过滤 器类的完全限定的名称。 下面是一个使用filter元素的部署描述符的例子: PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> Encryption Filter

合集下载

Web.config详解

Web.config详解

一、认识Web.config文件Web.config 文件是一个XML文本文件,它用来储存 Web 应用程序的配置信息(如最常用的设置 Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。

当你通过.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置。

如果你想修改子目录的配置设置,你可以在该子目录下新建一个Web.config文件。

它可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置。

(一).Web.Config是以XML文件规范存储,配置文件分为以下格式1.配置节处理程序声明特点:位于配置文件的顶部,包含在<configSections>标志中。

2.特定应用程序配置特点: 位于<appSetting>中。

可以定义应用程序的全局常量设置等信息.3.配置节设置特点: 位于<system.Web>节中,控制运行时的行为.4.配置节组特点: 用<sectionGroup>标记,可以自定义分组,可以放到<configSections>内部或其它<sectionGroup>标记的内部.(二).配置节的每一节1.<configuration>节根元素,其它节都是在它的内部.2.<appSetting>节此节用于定义应用程序设置项。

对一些不确定设置,还可以让用户根据自己实际情况自己设置用法:I.<appSettings><add key="Conntction" value="server=192.168.85.66;userid=sa;password=;database=Info;"/><appSettings>定义了一个连接字符串常量,并且在实际应用时可以修改连接字符串,不用修改程式代码. II.<appSettings><add key="ErrPage" value="Error.aspx"/><appSettings>定义了一个错误重定向页面.3.<compilation>节格式:<compilationdefaultLanguage="c#"debug="true"/>I.default language: 定义后台代码语言,可以选择C#和两种语言.IIdebug : 为true时,启动aspx调试;为false不启动aspx调试,因而可以提高应用程序运行时的性能。

HttpSessionListener、ServletContextListener

HttpSessionListener、ServletContextListener

关于Listener详解ServletContextListenerServletContextListener接口能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。

当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由ServletContextListener来处理。

在ServletContextListener接口中定义了处理ServletContextEvent事件的两个方法:contextInitialized (ServletContextEvent event)当Servlet容器启动Web应用时调用该方法。

在调用完该方法之后,容器再对Filter初始化,并且对那些在Web应用启动时就需要被初始化的Servlet进行初始化。

用途:Web服务器启动时加载数据到内存中………….. contextDestroyed(ServletContextEvent event)当Servlet容器终止Web应用时调用该方法。

在调用该方法之前,容器会先销毁所有的Servlet和Filter过滤器。

public ServletContext getServletContext();//ServletContextEvent事件:取得一个ServletContext(application)对象HttpSessionListenerSession创建事件发生在每次一个新的session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候。

对Session的整体状态的监听。

对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession 对象。

当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象,并触发HttpSession创建事件,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。

Web应用中设置ContextPath案例详解

Web应用中设置ContextPath案例详解

Web应⽤中设置ContextPath案例详解Jetty如果没有contextPath,则默认使⽤root上下⽂,root上下⽂的路径为"/"。

warName.war在没有XML IoC⽂件的情况下:如果WAR⽂件名是myapp.war,那么上下⽂路径是:/myapp;如果WAR⽂件名是ROOT.war,那么上下⽂路径是:/;如果WAR⽂件名是ROOT-foobar.war,那么上下⽂路径是/,虚拟host是foobar。

WEB-INF/jetty-web.xml<Configureclass="org.eclipse.jetty.webapp.WebAppContext"><Setname="contextPath">/test</Set>...</Configure>Tomcat单独的<context>元素可以通过多种⽅式定义:在Web应⽤的/META-INF/context.xml⽂件中定义,当Host的copyXML属性为true的时候,context.xml⽂件将被拷贝到$CATALINA_BASE/conf/[enginename]/[hostname]⽬录下,并且重新命名,命名规范参考/META-INF/context.xml⼩节的说明。

直接在$CATALINA_BASE/conf/[enginename]/[hostname]⽬录下放置⼀个XML⽂件,⽂件名规范和内容参考META-INF/context.xml⼩节的说明。

这个⽂件的优先级⽐/META-INF/context.xml⾼。

在Tomcat服务器的conf/server.xml⽂件的<Host>元素中定义⼀个<Context>元素。

META-INF/context.xmlContext name,context path,contextversion和base file name之间有⼀个紧密的关系:如果没有contextversion,那么context name和context path是⼀样的;如果contextpath是空字符串,base name就是ROOT;如果contextpath不是空字符串,base name=context path,其中⾸/字符已经去掉,/字符换成了#字符。

birt配置参数详解

birt配置参数详解

BIRT参数设置详解2010-08-25 16:30在使用birt报表的时候感觉页面的 BIRT Report Viewer头标题没有用,想去掉在网上一查原来有详细的参数设置,看来birt的功能还是很强大啊。

现在转帖如下:BIRT作为一款功能强大的开源报表工具,其版本的升级更新速度也非常快,从1.0到2.0,一直到最新的2.2.1版本,无论从功能上还是性能上都得到了极大的提高和扩充。

BIRT也提供了一个标准的J2EE实现组件,可以发布到支持J2EE 应用的web server服务器上,可以对生成的报表进行预览等操作。

在大家使用BIRT Viewer的时候,可能会对它日益纷繁的参数设置如云里雾里,在网上论坛里也有很多人碰到这样哪样的问题,同时官方的文档也不细致不全。

所以我就对这些参数进行了一个简单系统的总结,希望能对大家的BIRT开发有所帮助。

这些参数以2.2.1版本为准,请大家特别注意。

1. Servlet模式说明查看BIRT Viewer自带的web.xml文件,可以看到有以下几个pattern:frameset ---- 采用Ajax框架,可以显示工具条,导航条和TOC面板,实现复杂的操作,如分页处理,导出数据,导出报表,打印等等。

该模式下会自动生成report document文件(预览report design文件)到特定的目录(用户可以用参数指定,也可以定义在web.xml里)。

采用Ajax,速度较慢。

run ---- 也采用Ajax框架,但不实现frameset的复杂功能,不会生成临时的report document文件(预览report design文件),也不支持分页,这个主要是应用在BIRT Designer里的preview tab里,可以支持cancel操作,其它不怎么常用。

采用Ajax,速度较慢。

preview --- 没有用到Ajax框架,直接调用底层Engine API对报表进行render,把生成的报表内容直接输出到浏览器。

Tomcat配置文件详解

Tomcat配置文件详解

Tomcat配置⽂件详解打开Tomcat的配置⽬录,我们会发现下⾯的配置⽂件:server.xml:Tomcat的主配置⽂件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;web.xml:遵循Servlet规范标准的配置⽂件,⽤于配置servlet,并为所有的Web应⽤程序提供包括MIME映射等默认配置信息;context.xml:所有host的默认配置信息;logging.properties:⽇志相关配置;tomcat-users.xml:Realm认证时⽤到的相关⾓⾊、⽤户和密码等信息;Tomcat⾃带的manager默认情况下会⽤到此⽂件;在Tomcat中添加/删除⽤户,为⽤户指定⾓⾊等将通过编辑此⽂件实现;catalina.policy:Java相关的安全策略配置⽂件,在系统资源级别上提供访问控制的能⼒,以安全模式启动Tomcat会使⽤这个配置catalina.properties:Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此⽂件的相关设置;jaspic-providers.xml:⽤户认证配置⽂件这篇博客就来介绍下这⼏个配置⽂件的作⽤,以及常⽤的配置选项。

server.xml配置server.xml是Tomcat的主配置⽂件,可以对Service, Connector, Engine, Realm, Valve, Hosts等主组件进⾏相关配置。

<!-- port: 接收shutdown指令的端⼝,默认仅允许通过本机访问,默认为8005;shutdown:发往此Server⽤于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;使⽤⽅式:telnet localhost 8005,输⼊SHUTDOWN即可关闭tomcat如果你不配置这两个属性,Tomcat的这种关闭机制还是会运⾏的。

struts2入门教程一(环境搭建,基本案例实现)CSDN

struts2入门教程一(环境搭建,基本案例实现)CSDN

Struts2入门初步需掌握1.struts2概述2.struts2环境搭建(第一个struts2的应用程序)3.struts.xml文件配置详解4.struts2请求的URL的搜索路径的顺序概述5.struts2工作原理概述6.struts2指定多个配置文件7.struts2动态方法调用8.使用通配符定义action一:简介Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。

其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。

Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。

虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

二:环境搭建搭建Struts2环境时,我们一般需要做以下几个步骤的工作:1.找到开发Struts2应用需要使用到的jar文件.下载官网:/download.cgi#struts221解压后:开始学习使用依赖的最基本的jar 包2:编写Struts2的配置文件解压其中一个案例在此目录下找到struts.xml 文件先拷贝到项目的src 下。

再对起进行修改。

删除剩余如下代码:[html]01.<?xml version ="1.0"encoding ="UTF-8" ?> 02.<!DOCTYPE struts PUBLIC 03."-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN" 04."/dtds/struts-2.3.dtd"> 05.06.<struts> 07.08. </struts>无法加载插件。

详解springsecurity之httpSecurity使用示例

详解springsecurity之httpSecurity使⽤⽰例httpSecurity类似于spring security的xml配置⽂件命名空间配置中的<http>元素。

它允许对特定的http请求基于安全考虑进⾏配置。

默认情况下,适⽤于所有的请求,但可以使⽤requestMatcher(RequestMatcher)或者其它相似的⽅法进⾏限制。

使⽤⽰例:最基本的基于表单的配置如下。

该配置将所有的url访问权限设定为⾓⾊名称为"ROLE_USER".同时也定义了内存认证模式:使⽤⽤户名"user"和密码“password”,⾓⾊"ROLE_USER"来认证。

@Configuration@EnableWebSecuritypublic class FormLoginSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/").hasRole("USER").and().formLogin();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");}}配置基于openId的认证⽅式basic⽰例,不使⽤attribute exchange@Configuration@EnableWebSecuritypublic class OpenIDLoginConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) {http.authorizeRequests().antMatchers("/").hasRole("USER").and().openidLogin().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication()// the username must match the OpenID of the user you are// logging in with.withUser("https:///accounts/o8/id?id=lmkCn9xzPdsxVwG7pjYMuDgNNdASFmobNkcRPaWU").password("password").roles("USER");}}下⾯展⽰⼀个更⾼级的⽰例,使⽤attribute exchange@Configuration@EnableWebSecuritypublic class OpenIDLoginConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) {http.authorizeRequests().antMatchers("/").hasRole("USER").and().openidLogin().loginPage("/login").permitAll().authenticationUserDetailsService(new AutoProvisioningUserDetailsService()).attributeExchange("https:///.").attribute("email").type("/contact/email").required(true).and().attribute("firstname").type("/namePerson/first").required(true).and().attribute("lastname").type("/namePerson/last").required(true).and().and().attributeExchange(".").attribute("email").type("/contact/email").required(true).and().attribute("fullname").type("/namePerson").required(true).and().and().attributeExchange(".").attribute("email").type("/contact/email").required(true).and().attribute("fullname").type("/namePerson").required(true);}}public class AutoProvisioningUserDetailsService implementsAuthenticationUserDetailsService&lt;OpenIDAuthenticationToken&gt; {public UserDetails loadUserDetails(OpenIDAuthenticationToken token) throws UsernameNotFoundException {return new User(token.getName(), "NOTUSED", AuthorityUtils.createAuthorityList("ROLE_USER"));}}增加响应安全报⽂头默认情况下当使⽤WebSecuirtyConfigAdapter的默认构造函数时激活。

Web.config配置文件详解(新手必看)

Web.c‎o nfig‎配置文件详‎解(新手必‎看)‎花了点时间‎整理了一下‎A SP.N‎E T We‎b.con‎f ig配置‎文件的基本‎使用方法。

‎很适合新手‎参看,由于‎W eb.c‎o nfig‎在使用很灵‎活,可以自‎定义一些节‎点。

所以这‎里只介绍一‎些比较常用‎的节点。

‎<?xm‎l ver‎s ion=‎"1.0"‎?><‎!--注意‎:除了手‎动编辑此文‎件以外,您‎还可以使用‎Web ‎管理工具来‎配置应用程‎序的设置。

‎可以使用‎V isua‎l Stu‎d io 中‎的“网站”‎->“As‎‎配置”选‎项。

设‎置和注释的‎完整列表在‎mach‎i ne.c‎o nfig‎.comm‎e nts ‎中,该文件‎通常位于‎"Wind‎o ws"M‎i cros‎o ft.N‎e t"Fr‎a mewo‎r k"v2‎.x"Co‎n fig ‎中。

-->‎<!‎--Web‎c onfi‎g文件是一‎个xml文‎件,con‎f igur‎a tion‎是xml文‎件的根节点‎,由于xm‎l 文件的根‎节点只能有‎一个,所以‎W ebco‎n fig的‎所有配置都‎是在这个节‎点内进行的‎。

-->‎<con‎f igur‎a tion‎>‎<!--指‎定配置节和‎命名空间声‎明。

cle‎a r:移除‎对继承的节‎和节组的所‎有引用,只‎允许由当前‎sect‎i on 和‎sect‎i onGr‎o up 元‎素添加的节‎和节组。

r‎e move‎:移除对继‎承的节和节‎组的引用。

‎se‎c tion‎:定义配置‎节处理程序‎与配置元素‎之间的关联‎。

sect‎i onGr‎o up:定‎义配置节处‎理程序与配‎置节之间的‎关联。

--‎><‎c onfi‎g Sect‎i ons>‎‎<sec‎t ionG‎r oup ‎n ame=‎"syst‎e m.we‎b.ext‎e nsio‎n s"t‎y pe="‎S yste‎m.Web‎.Conf‎i gura‎t ion.‎S yste‎m WebE‎x tens‎i onsS‎e ctio‎n Grou‎p,Sy‎s tem.‎W eb.E‎x tens‎i ons,‎Vers‎i on=1‎.0.61‎025.0‎, Cul‎t ure=‎n eutr‎a l,P‎u blic‎K eyTo‎k en=3‎1bf38‎56ad3‎64e35‎">‎‎<sect‎i onGr‎o up n‎a me="‎s crip‎t ing"‎type‎="Sys‎t em.W‎e b.Co‎n figu‎r atio‎n.Scr‎i ptin‎g Sect‎i onGr‎o up, ‎S yste‎m.Web‎.Exte‎n sion‎s,Ve‎r sion‎=1.0.‎61025‎.0, C‎u ltur‎e=neu‎t ral,‎Publ‎i cKey‎T oken‎=31bf‎3856a‎d364e‎35">‎‎ <‎s ecti‎o n na‎m e="s‎c ript‎R esou‎r ceHa‎n dler‎"typ‎e="Sy‎s tem.‎W eb.C‎o nfig‎u rati‎o n.Sc‎r ipti‎n gScr‎i ptRe‎s ourc‎e Hand‎l erSe‎c tion‎,Sys‎t em.W‎e b.Ex‎t ensi‎o ns, ‎V ersi‎o n=1.‎0.610‎25.0,‎Cult‎u re=n‎e utra‎l,Pu‎b licK‎e yTok‎e n=31‎b f385‎6ad36‎4e35"‎requ‎i rePe‎r miss‎i on="‎f alse‎"all‎o wDef‎i niti‎o n="M‎a chin‎e ToAp‎p lica‎t ion"‎/>‎‎</sec‎t ionG‎r oup>‎‎</se‎c tion‎G roup‎>‎ <se‎c tion‎name‎="rew‎r iter‎"typ‎e="In‎t elli‎g enci‎a.Url‎R ewri‎t er.C‎o nfig‎u rati‎o n.Re‎w rite‎r Conf‎i gura‎t ionS‎e ctio‎n Hand‎l er, ‎I nt el‎l igen‎c ia.U‎r lRew‎r iter‎" />‎</c‎o nfig‎S ecti‎o ns>‎‎<!--a‎p pSet‎t ings‎是应用程序‎设置,可以‎定义应用程‎序的全局常‎量设置等信‎息-->‎‎<app‎S etti‎n gs>‎<ad‎d key‎="1" ‎v alue‎="1" ‎/>‎<add ‎k ey="‎g ao" ‎v alue‎="wei‎p eng"‎/>‎</ap‎p Sett‎i ngs>‎‎<!--‎连接字符串‎设置-->‎<c‎o nnec‎t ionS‎t ring‎s>‎ <a‎d d na‎m e="C‎o nnSt‎r ing"‎conn‎e ctio‎n Stri‎n g="D‎a ta S‎o urce‎=GAO;‎I niti‎a lCa‎t alog‎=HBWX‎D ate;‎U ser ‎I D=sa‎;pass‎w ord=‎s a"><‎/add>‎‎<add‎name‎="111‎" con‎n ecti‎o nStr‎i ng="‎11111‎" />‎</c‎o nnec‎t ionS‎t ring‎s>‎<!‎--指定应‎用子配置设‎置的资源,‎并锁定配置‎设置,以防‎止它们被子‎配置文件重‎写。

session与transaction详解

Spring 与Hibernate结合的细节源码分析(一)@Transactional标记的方法使用session的两种情况:(1)之前已经打开了session(如opensessioninview模式下),那么事务也会开启并将之前打开的session标记为旧session并开始事务,然后调用目标方法,再提交或回滚事务。

接下来判断如果是旧SESSION,则事务结束释放数据库连接但不关闭SESSION,如果还用此SESSION再开启事务,再绑定另外的连接(所以上文说单SESSION并不等于同一个连接),最后由opensessioninview FILTER关闭SESSION。

由此可见即使使用了opensessioninview模式也不是响应用户后才commit或rollback,而是在service层的@Transactional标记的方法执行完后进行commit或rollback。

但在opensessioninview filter自己关闭session 时又会commit或rollbakc一次。

在opensessioninview模式下打开sesson的时候并没有使session获得数据库连接而是在进入@Transactional标记的方法后才使session获得数据库连接。

@Transactional标记的方法执行完后事务管理程序会提交或回滚并释放session的数据库连接但不关闭session(已验证)。

(2)如果调用带有@Transactional标记的方法前没有打开session(没有与当前线程绑定的session)或者不是请求发起的调用(如计划任务Timer.schedule(...)发起的SERVICE调用),那么流程为--在此方法打开SESSION,标志为新连接,开启事务,调用目标,提交或回滚事务,释放数据库连接,判断如果是新SESSION,则关闭SESSION。

原文/topic/579603本文基于SPRING2.56,HIBERANTE3.25及Oracle10g classes14.jar驱动,介绍SPRING与HIBERNATE是如何配合的细节,如SESSION、事务、数据库连接何时打开与关闭;如果调用不是发自请求,不经过FILTER(如定时器对SERVICE调用),如何做到从头到尾只用一个SESSION?此时SESSION需不需要手动关闭?从SESSION取得的数据库连接需不需要关闭,看完本文,你会清楚里面每一个细节。

web.config详解

ipconfig详解:web.config详解疯狂代码 / ĵ:http://DotNet/Article22869.html在开发中经常会遇到这样情况在部署时为了保密起见并不将源代码随项目同发布而我们开发时环境和部署环境可能不致(比如数据库不样)如果在代码中保存这些配置这些信息部署时需要到用户那里更改代码再重新编译这种部署方式非常麻烦在.net中提供了种便捷保存项目配置信息办法那就是利用配置文件配置文件文件后缀般是.config在中配置文件名般默认是web.config每个web.config文件都是基于XML文本文件并且可以保存到Web应用中任何目录中在发布Web应用时web.config文件并不编译进dll文件中如果将来客户端发生了变化仅仅需要用记事本打开web.config文件编辑相关设置就可以重新正常使用非常方便本篇要讲述知识如下:配置文件查找优先级配置文件查找优先级在.net提供了个针对当前机器配置文件这个文件是machine.config它位于%windir%\\Framework\v2.0.50727\CONFIG\文件下(%windir%是系统分区下系统目录在命令行模式下输入%windir%然后回车就能查看当前机器系统目录在Windows2003及WindowsXP中%windir%是系统分区下windows目录在Windows2000中%windir%是系统分区下WinNT目录在笔者机器上这个系统目录是C:\WINDOWS)这个文件里面定义了针对当前机器WinForm和应用配置下面是machine.config文件内容:在这个文件夹下还有个web.config文件这个文件包含了网站WebSite常用配置下面是这个web.config文件内容:网站WebSiteIIS启动时候会加载配置文件中配置信息然后缓存Cache这些信息这样就不必每次去读取配置信息在运行过程中应用会监视配置文件变化情况旦编辑了这些配置信息就会重新读取这些配置信息并缓存Cache当我们要读取某个节点或者节点组信息时是按照如下方式搜索:(1)如果在当前页面所在目录下存在web.config文件查看是否存在所要查找结点名称如果存在返回结果并停止查找(2)如果当前页面所在目录下不存在web.config文件或者web.config文件中不存在该结点名则查找它上级目录直到网站WebSite根目录(3)如果网站WebSite根目录下不存在web.config文件或者web.config文件中不存在该节点名则在%windir%\\Framework\v2.0.50727\CONFIG\web.config文件中查找(4)如果在%windir%\\Framework\v2.0.50727\CONFIG\web.config文件中不存在相应结点则在%windir%\\Framework\v2.0.50727\CONFIG\machine.config文件中查找(5)如果仍然没有找到则返回null所以如果我们对某个网站WebSite或者某个文件夹有特定要求配置可以在相应文件夹下创建个web.config文件覆盖掉上级文件夹中web.config文件中同名配置即可这些配置信息寻找只查找次以后便被缓存Cache起来供后来在应用运行过程中如果web.config文件发生更改就会导致相应应用重新启动这时存储在服务器内存中用户会话信息就会丢失(如存储在内存中Session)些软件Software(如杀毒软件Software)每次完成对web.config访问时就会修改web.config访问时间属性也会导致应用重启配置文件节点介绍说明web.config文件是个XML文件它根结点是<configuration>在<configuration>节点下常见子节点有:<configSections>、<appSettings>、<connectionStrings>和<system.web>其中<appSettings>节点主要用于配置些网站WebSite应用配置信息而<connectionStrings>节点主要用于配置网站WebSite数据库连接串信息<system.web>节点主要是网站WebSite运行时些配置它常见节点有如下:<appSettings>节点<appSettings>节点主要用来存储应用些配置信息比如上传文件保存路径等以下是个例子:<appSettings><!--允许上传图片格式类型--><add key="ImageType" value=".jpg;.bmp;.g;.png;.jpeg"/><!--允许上传文件类型--><add key="FileType" value=".jpg;.bmp;.g;.png;.jpeg;.pdf;.zip;.rar;.xls;.doc"/></appSettings>对于<appSettings>节点中值可以按照key来进行访问以下就是个读取key值为“FileType”节点值例子:fileType=ConfigurationManager.AppSettings["FileType "];<connectionStrings>节点<connectionStrings>节点主要用于配置数据库连接我们可以<connectionStrings>节点中增加任意个节点来保存数据库连接串将来在代码中通过代码方式动态获取节点值来例子化数据库连接对象这样旦部署时候数据库连接信息发生变化我们仅需要更改此处配置即可而不必数据库连接信息变化而需要改动代码和重新部署以下就是个<connectionStrings>节点配置例子:<connectionStrings><!--SQL Server数据库配置--><add name="AspNetStudyConnectionString1" connectionString="Data Source=(local);Initial Catalog=AspNetStudy;User ID=sa;Password=sa"/></connectionStrings>在代码中我们可以这么例子化数据库连接对象://读取web.config节点配置connectionString =ConfigurationManager.ConnectionStrings["AspNetStudyConnectionString1"].ConnectionString;//例子化SqlConnection对象SqlConnection connection = SqlConnection(connectionString);这样做好处是旦开发时所用数据库和部署时数据库不致仅仅需要用记事本的类文本编辑工具编辑connectionString属性值就行了<compilation>节点<compilation>节点配置 使用所有编译设置默认debug属性为“true”即允许调试在这种情况下会影响网站WebSite性能所以在编译完成交付使用的后应将其设为“false”<authentication>节点设置身份验证模式有 4种身份验证模式它们值分别如下:Mode 介绍说明Windows 使用Windows身份验证适用于域用户或者局域网用户Forms 使用表单验证依靠网站WebSite开发人员进行身份验证Passport 使用微软提供身份验证服务进行身份验证None 不进行任何身份验证<authentication>节点<authentication>节点控制用户对网站WebSite、目录或者单独页访问必须配合<authentication>节点起使用<customErrors>节点<customErrors>节点用于定义些自定义信息信息此节点有Mode和defaultRedirect两个属性其中defaultRedirect属性是个可选属性表示应用发生时重定向到默认URL如果没有指定该属性则显示般性Mode属性是个必选属性它有 3个可能值它们所代表意义分别如下:Mode 介绍说明On 表示在本地和远程用户都会看到自定义信息Off 禁用自定义信息本地和远程用户都会看到详细信息RemoteOnly 表示本地用户将看到详细信息而远程用户将会看到自定义信息这里有必要介绍说明下本地用户和远程用户概念当我们访问应用程时所使用机器和发布应用所使用机器为同台机器时成为本地用户反的则称的为远程用户在开发调试阶段为了便于查找Mode属性建议设置为Off而在部署阶段应将Mode属性设置为On或者RemoteOnly以避免这些详细信息暴露了代码细节从而引来黑客入侵下面我们添加个页面CustomErrorsDemo.aspx在它Page_Load事件里抛出个异常代码如下:using ;using .Data;using .Configuration;using .Collections;using .Web;using .Web.Security;using .Web.UI;using .Web.UI.WebControls;using .Web.UI.WebControls.WebParts;using .Web.UI.HtmlControls;public partial CustomErrorsDemo : .Web.UI.Page{protected void Page_Load(object sender, EventArgs e){throw Exception("故意抛出异常");}}我们先配置<customErrors>如下:<customErrors mode="RemoteOnly"><error statusCode="403" redirect="NoAccess.htm" /><error statusCode="404" redirect="FileNotFound.htm" /></customErrors>这时本地运行CustomErrorsDemo.aspx效果如下:远程访问时看到效果:如果我们将customErrorsMode属性设置为“On”本地运行和远程访问都会看到如下效果:如果将customErrorsMode属性设置为“Off”本地运行和远程访问都会看到如下效果:<error>子节点在<customErrors>节点下还包含有<error>子节点这个节点主要是根据服务器HTTP状态代码而重定向到我们自定义页面注意要使<error>子节点下配置生效必须将<customErrors>节点节点Mode属性设置为“On”下面是个例子:<customErrors mode="On" defaultRedirect="GenericErrorPage.htm"><error statusCode="403" redirect="403.htm" /><error statusCode="404" redirect="404.htm" /></customErrors>在上面配置中如果用户访问页面不存在就会跳转到404.htm页面如果用户没有权限访问请求页面则会跳转到403.htm页面403.htm和404.htm页面都是我们自己添加页面我们可以在页面中给出友好提示<httpHandlers>节点<httpHandlers>节点用于根据用户请求URL和HTTP谓词将用户请求交给相应处理可以在配置级别任何层次配置此节点也就是说可以针对某个特定目录下指定特殊文件进行特殊处理下面是和machine.config文件同目录下web.config文件中<httpHandlers>节点配置:<httpHandlers><add path="*.rules" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.xoml" verb="*" type=".ServiceModel.Activation.HttpHandler, .ServiceModel,Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/><add path="trace.axd" verb="*" type=".Web.Handlers.TraceHandler" validate="true"/><add path="WebResource.axd" verb="GET" type=".Web.Handlers.AssemblyResourceLoader" validate="true"/><add path="*.axd" verb="*" type=".Web.HttpNotFoundHandler" validate="true"/><add path="*.aspx" verb="*" type=".Web.UI.PageHandlerFactory" validate="true"/><add path="*.ashx" verb="*" type=".Web.UI.SimpleHandlerFactory" validate="true"/><add path="*.asmx" verb="*" type=".Web.Services.Protocols.WebServiceHandlerFactory,.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"validate="false"/><add path="*.rem" verb="*" type=".Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, .Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"validate="false"/><add path="*.soap" verb="*" type=".Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, .Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"validate="false"/><add path="*.asax" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.ascx" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.master" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.skin" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.browser" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.sitemap" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.dll.config" verb="GET,HEAD" type=".Web.StaticFileHandler" validate="true"/><add path="*.exe.config" verb="GET,HEAD" type=".Web.StaticFileHandler" validate="true"/><add path="*.config" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.cs" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.csproj" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.vb" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.vbproj" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.webinfo" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.licx" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.resx" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.resources" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.mdb" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.vjsproj" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.java" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.jsl" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.ldb" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.ad" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.dd" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.ldd" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.sd" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.cd" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.adprototype" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.lddprototype" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.sdm" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.sdmDocument" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.mdf" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.ldf" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.exclude" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.refresh" verb="*" type=".Web.HttpForbiddenHandler" validate="true"/><add path="*.svc" verb="*" type=".ServiceModel.Activation.HttpHandler, .ServiceModel,Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/><add path="*" verb="GET,HEAD,POST" type=".Web.DefaultHttpHandler" validate="true"/><add path="*" verb="*" type=".Web.HttpMethodNotAllowedHandler" validate="true"/></httpHandlers>从上面配置中可以看出针对*.mdf、*.ldf文件Get或者Post请求都会交给.Web.HttpForbiddenHandler来处理处理结果就是用户不能查看或者下载相关文件如果我们某个文件夹下文件或者某个类型文件不允许用户下载可以在</httpHandlers>节点中增加相应子节点下面我们以个例子来介绍说明<httpHandlers>节点使用方法在我们应用中建立个IPData目录在IPData目录中创建个IPData.txt文件然后在Web.config中添加以下配置:<httpHandlers><add path="IPData/*.txt" verb="*" type=".Web.HttpForbiddenHandler"/></httpHandlers>上面代码作用是禁止访问IPData目录下任何txt文件然后新建个页面在页面中添加个超级链接链接到该目录下IPData.txt文件代码如下:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="HttpHandlersDemo.aspx.cs" Inherits="HttpHandlersDemo" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml" ><head runat="server"><title>httpHandlers节点例子</title></head><body><form id="form1" runat="server"><div><a href="IPData/IPData.txt" title="打开IPData/IPData.txt">打开IPData/IPData.txt</a></div></form></body></html>运行这个页面效果如下:当前web.config文件<customErrors>节点配置如下:<customErrors mode="On" defaultRedirect="GenericErrorPage.htm"><error statusCode="403" redirect="403.htm" /><error statusCode="404" redirect="404.htm" /></customErrors>如果存在403.htm和404.htm页面点击超级链接的后会出现如下效果:我们从上图中可以看到当<customErrors>节点Mode属性为“On”时被禁止访问IPData文件夹下所有txt文件所以会跳转到自定义没有权限提示页面即403.htm<httpRuntime>节点<httpRuntime>节点用于对 HTTP 运行库设置该节可以在计算机、站点、应用和子目录级别声明 例如下面配置控制用户最大能上传文件为40M(40*1024K)最大超时时间为60秒最大并发请求为100个<httpRuntime maxRequestLength="40960" executionTimeout="60" appRequestQueueLimit="100"/><pages>节点<pages>节点用于表示对特定页设置主要有 3个属性分别如下:属性名 介绍说明buffer 是否启用了 HTTP 响应缓冲enableViewStateMac 是否应该对页视图状态运行计算机身份验证检查 (MAC)以放置用户篡改默认为false如果设置为true将会引起性能降低validateRequest 是否验证用户输入中有跨站点脚本攻击和SQL注入式漏洞攻击默认为true如果出现匹配情况就会发 HttpRequestValidationException 异常对于包含有在线文本编辑器页面般自行验证用户输入而将此属性设为false下面就是个配置节点例子:<pages buffer="true" enableViewStateMac="true" validateRequest="false"/><sessionState>节点<sessionState>节点用于配置当前应用会话状态配置以下就是个常见配置:<sessionState cookieless="false" mode="InProc" timeout="30" />上面节点配置是设置在应用中启用Cookie并且指定会话状态模式为在进程中保存会话状态同时还指定了会话超时为30分钟<sessionState>节点Mode属性可以是以下几种值的:属性值 介绍说明Custom 使用自定义数据来存储会话状态数据InProc 默认值由辅助进程来存储会话状态数据Off 禁用会话状态SQLServer 使用进程外SQL Server数据库保存会话状态数据StateServer 使用进程外 状态服务存储状态信息般默认情况下使用InProc模式来存储会话状态数据这种模式好处是存取速度快缺点是比较占用内存所以不宜在这种模式下存储大型用户会话数据<globalization>节点:用于配置应用全球化设置此节点有几个比较重要属性分别如下:属性名 介绍说明fileEncoding 可选属性设置.aspx、.asmx 和 .asax 文件存储编码requestEncoding 可选属性设置客户端请求编码默认为UTF-8.responseEncoding 可选属性设置服务器端响应编码默认为UTF-8.以下就是应用中默认配置:<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8"/>配置文件读写操作虽然web.config文件是个XML文件但是由于权限原因它在部署中不能像操作普通XML文件那样进行修改在.net中提供了个类用于对web.config进行修改下面是针对web.config修改通用类代码:using ;using .Configuration;using .Web;using .Web.Configuration;/// <summary>/// ConfigurationOperator 摘要介绍说明/// </summary>public ConfigurationOperator:IDisposable{private Configuration config;public ConfigurationOperator:this(HttpContext.Current.Request.ApplicationPath){}public ConfigurationOperator( path){config = WebConfigurationManager.OpenWebConfiguration(path);}/// <summary>/// 设置应用配置节点如果已经存在此节点则会修改该节点值否则添加此节点/// </summary>/// <param name="key">节点名称</param>/// <param name="value">节点值</param>public void SetAppSetting( key, value){AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings"); (appSetting.Settings[key] null)//如果不存在此节点则添加{appSetting.Settings.Add(key, value);}//如果存在此节点则修改{appSetting.Settings[key].Value = value;}}/// <summary>/// 设置数据库连接串节点如果不存在此节点则会添加此节点及对应值存在则修改/// </summary>/// <param name="key">节点名称</param>/// <param name="value">节点值</param>public void SetConnectionString( key, connectionString){ConnectionStringsSection connectionSetting =(ConnectionStringsSection)config.GetSection("connectionStrings");(connectionSetting.ConnectionStrings[key] null)//如果不存在此节点则添加{ConnectionStringSettings connectionStringSettings = ConnectionStringSettings(key, connectionString);connectionSetting.ConnectionStrings.Add(connectionStringSettings);}//如果存在此节点则修改{connectionSetting.ConnectionStrings[key].ConnectionString = connectionString;}}/// <summary>/// 保存所作修改/// </summary>public void Save{config.Save;config = null;}public void Dispose{(config != null){config.Save;}}}把上面代码存放到App_Code文件夹下我们在项目中就可以直接使用了我们通过个例子演示如果使用这个通用类对web.config进行设置新建个aspx页面下面是前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ConfigModyDemo.aspx.cs" Inherits="ConfigModyDemo" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml" ><head runat="server"><title>在部署后修改web.config例子</title></head><body><form id="form1" runat="server"><div><table border="0" cellpadding="0" cellspacing="0"><tr><td>类型</td><td>名称</td><td>值</td></tr><tr><td>配置</td><td><asp:TextBox ID="txtKey" runat="server"></asp:TextBox><asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtKey"ErrorMessage="*" Display="Dynamic"></asp:RequiredFieldValidator></td><td><asp:TextBox ID="txtAppSetting" runat="server"></asp:TextBox></td></tr><tr><td>数据库连接</td><td><asp:TextBox ID="txtConnectionName" runat="server"></asp:TextBox><asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="*" ControlToValidate="txtConnectionName"Display="Dynamic"></asp:RequiredFieldValidator></td><td style="height: 24px"><asp:TextBox ID="txtConnectionString" runat="server"></asp:TextBox></td></tr> <tr><td><asp:Button ID="btnMody" runat="server" _disibledevent=></table></div></form></body></html>编写后台代码有时可能需要增加对配置文件读写操作类所在dll引用如下:下面是后台代码:using ;using .Data;using .Configuration;using .Collections;using .Web;using .Web.Security;using .Web.UI;using .Web.UI.WebControls;using .Web.UI.WebControls.WebParts;using .Web.UI.HtmlControls;using .Web.Configuration;//注意添加这个命名空间public partial ConfigModyDemo : .Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}protected void btnMody_Click(object sender, EventArgs e){appSetting = txtAppSetting.Text;//appSetting子节点值connectionString = txtConnectionString.Text;//连接串key = txtKey.Text;//appSetting子节点KeyconnectionName = txtConnectionName.Text;//连接NameConfigurationOperator op = ConfigurationOperator;op.SetAppSetting(key, appSetting);op.SetConnectionString(connectionName, connectionString);op.Save;}}下面是运行界面:我们在上面表单中填入如下信息:假设此时web.config文件相关节点内容如下:<appSettings></appSettings><connectionStrings><add name="Conn" connectionString="Data Source=(local);Initial Catalog=AspNetStudy;Persist Security Info=True;User ID=sa;Password=sa" /></connectionStrings>我们点击“修改”按钮的后文件内容如下:<appSettings><add key="country" value="china" /></appSettings><connectionStrings><add name="Conn" connectionString="Data Source=(local);Initial Catalog=Study;UserID=sa;Password=sa"providerName=".Data.SqlClient" /></connectionStrings>从执行结果可以看出我们确实能做到修改和添加web.config中节点功能需要注意是在利用了某些版本控制软件Software的后(如Microsoft Visual SourceSafe)版本控制软件Software可能会将web.config设置为只读属性就会出现不能设置情况我们需要手动将web.config只读属性去掉才能设置web.config文件在实际部署项目时候就不会存在这个问题整理总结:web.config是应用中个很重要配置文件通过web.config文件可以方便我们进行开发和部署应用此外还能对进行些灵活控制在本篇中详细讲述了各节点作用在部署应用后权限原因不能按照XML方式进行修改web.config文件所以在本篇中还提供了个针对<appSettings>节点和<connectionStrings>节点设置通用类读者朋友可以根据实际项目需要对这个通用类进行完善和补充下篇笔者将带领大家进入到内部了解下内部运行机制这对于我们更加灵活地控制应用是非常有帮助2008-11-5 01:47周公(周金桥)最近事情比较多忙不过来了可能发表时间会比较长不过也好能有时间让我再研究下我表述方式2009-2-12 5:17:12疯狂代码 /。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档