您好,欢迎访问三七文档
struts1的工作原理图:[img][/img]1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。(面向对象思想)2.发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。3.form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。4.派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。5.处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。6.返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。7.查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。8.响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。网页跳转的三种方式:方法1response.redirect这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但他可以跳转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录保护。但速度慢是其最大缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端。需要注意的是跳转后内部空间保存的所有数据信息将会丢失,所以需要用到session.(此方法与JSP中的redirect相似)方法2server.transfer速度快,只需要一次postback,但是……他必须是在同一个站点下,因为它是server的一个方法。另外,他能跳过登录保护。你可以写个小程序试试:设计一个由页面一到页面二的跳转,但要进入到页面二需要登录,forms认证,但如果跳转语句使用transfer的话,那就不会弹出登录页面了。这个方法的重定向请求是发生在服务器端,所以浏览器的url地址仍然保留的是原页面的地址!方法3sever.execute这个方法主要是用在页面设计上面,而且他必须是跳转同一站点下的页面。这个方法是需要将一个页面的输出结果插入到另一个aspx页面的时候使用,大部分是在表格中,将某一个页面类似于嵌套的方式存在于另一页面。(此方法效果类似于JSP中的jsp:include标签效果)总结:当需要把用户跳转到另一台服务器上的页面的时候使用redirect当需要把用户跳转到非aspx页面时候,如html使用redirect需要把查询字符串作为url一部分的时候保留传给服务器的时候,因为其他2种方法不能做到2次postback,把数据先带回服务器使用redirect需要aspx页面间的转换(不涉及登录)使用transfer当需要把aspx页面的输出结果插入到另一个aspx页面的时候使用execute方法。当然,忘记了还有一个超链接!当然这个就不需要讲太多了。他是在当需要用户来决定什么时候跳转页面,就使用超链接。顺便提一下,如何使用redirect方法在查询字符串中使用汉字,因为经常的情况是出现乱码,原因是url不支持汉字。这个时候需要转换:stringmessage=server.urlencode(欢迎来到赛跑专栏);先转换,再使用查询字符串response.redirect(webform2.aspx?msg=+message);各位javaeye的朋友们,我这里有个问题请求你们的帮忙,谢谢。我希望可以配置spring管理hibernate事务,当一个service调用多dao的时候,全部save成功才commit,可以怎么实现?这是配置文件Java代码1.beanid=transactionManagerclass=org.springframework.orm.hibernate3.HibernateTransactionManager/2.3.beanid=accountManagerTargetclass=com.vas.brd.service.impl.AccountManagerImpl4.propertyname=userOrderDAOreflocal=userOrderDAO//property5./bean6.7.beanid=accountManagerclass=org.springframework.transaction.interceptor.TransactionProxyFactoryBean8.propertyname=transactionManagerreflocal=transactionManager//property9.propertyname=targetreflocal=accountManagerTarget//property10.propertyname=transactionAttributes11.props12.propkey=save*PROPAGATION_REQUIRED/prop13.propkey=remove*PROPAGATION_REQUIRED/prop14.propkey=*PROPAGATION_REQUIRED/prop15./props16./property17./bean18./*******************************************************************************/sevice就没写了Java代码1.publicclassAccountManagerImplimplementsAccountManager{2.3.publicSyncResponseInfosaveKnSyncData(){4.//15.dao.saveObject2(object1);6.//27.dao.saveObject1(object2));8.}9.}Springio首先想说说IoC(InversionofControl,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(DependencyInjection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢?Java1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。关于反射的相关资料请查阅javadoc。理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作只是在spring的框架中堆积木而已。strtus2.0实现上传实现原理Struts2是通过CommonsFileUpload文件上传。1.CommonsFileUpload通过将HTTP的数据保存到临时文件夹,我们可以设置保存临时文件夹的路径,若不设置那么它会放到tomcat服务器安装目录下\work\Catalina\localhost\你的项目名下的文件夹;如我的将上传文件项目Struts2Upload发布到tomcat后,那么上传的文件的临时文件会保存形如:D:\Java\apache-tomcat-6.0.20\work\Catalina\localhost\Struts2Upload\upload_243601eb_1277f7c2df8__7ffc_00000001.tmp,我们在action类里再相当于本地的资源一样来读取,再转移到如数据库等的地方去。总之,我觉得上传文件时,数据会随用户的提交,而由浏览器端将识别出的传输文件标签,将本地的文件转化为文件流,再通过建立好的tcp连接(每次用户访问一个页面时,会建立tcp连接,服务器应答完响应后会断开连接),将数据上传至服务器,应该是这样,而不是用服务器端的action类或servlet类来完成传输的,应该是浏览器对上传文件标签的解析,从而完成本地资源的传输的。2.然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。以下是例子所依赖类包的列表:commons-fileupload-1.2.1.jarcommons-io-1.3.2.jarcommons-logging-1.0.4.jarfreemarker-2.3.8.jarognl-2.6.11.jarstruts2-core-2.0.14.jarxwork-2.0.7.jar注意:1.页面的表单enctype须设置为multipart/form-data;2.s:filename=loadFile标签将上传文件赋值给ACTION中的FileloadFile属性,并且将文件名,文件类型都会邦定到a
本文标题:中软JAVA面试
链接地址:https://www.777doc.com/doc-1043128 .html