[ 文章导读 ] SSH面试总结什么是MVCMVC是Model—View—Controler的简称。即模型—视图—控制器。1.视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。2.模型: 模型表示业务数据和业务处理。相当于JavaBean ...
SSH面试总结 什么是MVC MVC是Model—View—Controler的简称。即模型—视图—控制器。 1.视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。 2.模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性 3.控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图。 项目中为什么使用 SSH Struts核心类 1. ActionServlet类:前端控制器,将请求转发给RequestProcesser来处理,提供被Action对象使用的方法 2. ActionMapping类:ActionConfiguration子类,对struts-config.xml的一个映射类,从中得到所有配置信息。 3. ActionForward类:mapping中一个forward包装,对应一个URL 4. Action类:链接客户端请求和业务操作,负责处理请求。所有的Action类都扩展org.apache.struts.action.Action类,覆盖其中execute方法。 5. DispatchAction类:普通Action类只能通过execute()执行一项任务,dispatchAction类可以通过配置参数执行多重任务,如insert、update、list、delete Struts1与Struts2有什么区别 struts2不是struts1的升级,而是继承的webwork的血统,它吸收了struts1和webwork的优势。 1.Action 类: · Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口。 · Struts 2 Action类可以实现一个Action接口,也可实现其他接口。Struts2提供一个ActionSupport基类去实现常用的接口。 2.线程模式: · Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。 · Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 3. Servlet 依赖: · Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时,HttpServletRequest和HttpServletResponse 被传递给execute方法。 · Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。 4. 捕获输入: · Struts1 使用ActionForm对象捕获输入。 · Struts 2直接使用Action属性作为输入属性。Action属性能够通过we页面上的taglibs访问。 从开发者角度看,需要显示给用户的数据可以直接从Action中获取,而Struts1.x那样,必须把相应的Bean存到Page、Request或者Session中才能获取。Struts1.x 必须继承org.apache.struts.action.Action或者其子类,表单数据封装在FormBean中。 5. 表达式语言: · Struts1 整合了JSTL,因此使用JSTL EL。 · Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--”Object Graph Notation Language” (OGNL). 6.校验: · Struts 1支持在ActionForm的validate方法中手动校验。同一个类可以有不同的校验内容,但不能校验子对象。 · Struts2支持通过validate方法和XWork校验框架来进行校验。 XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。 Struts2的工作流程 1.Tomcat启动,加载web.xml,加载web.xml中的FilterStrutsPrepareAndExecuterFilter过滤器, 2.客户端发起一个(HttpServletRequest)请求到Tomcat容器 3.请求被提交到一系列(主要是三层)的过滤器(Filter)如(ActionContextCleanUp、FilterDispatcher)。 注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器、最后到FilterDispatcher。 FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 4.FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求, 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。 5.ActionProxy通过struts.xml询问框架的配置文件,找到需要调用的Action类. 6.ActionProxy创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。 但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor。 7.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。WebWork 的拦截器链自动对请求应用通用功能, 例如 workflow、 validation 或文件上传等功能。 8.回调Action的execute方法,该方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。实际上,因为Action只是一个控制器, 它会调用业务逻辑组件来处理用户的请求。 9.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。Action 的 execute 方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或者其他文档。此时支持的视图技术非常多,既支持 JSP,也支持 Velocity、FreeMarker。 Struts1的工作流程 1.在 web 应用启动时就会加载初始化 ActionServlet,ActionServlet 从 struts-config.xml 文件中读取配置信息,把它们存放到各种配置对象。2.ActionServlet 接收到一个客户请求 3.检索和用户请求匹配的 ActionMapping 实例,如果不存在,就返回无效信息; 4.如果 ActionForm 实例不存在,就创建一个 ActionForm 对象,把客户提交的表单数据保存到ActionForm 对象中; 5.根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; 6.如果ActionForm的validate() 方法返回null或返回一个不包含ActionMessage的ActionErrors 对象, 就表示表单验证成功; 7.ActionServlet 根据 ActionMapping 所包含的映射信息决定将请求转发给哪个 Action。 如果相应的 Action 实例不存在,就先创建这个实例,然后调用 Action 的 execute()方法; 8.Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件; ActionForward 对象指向 JSP 组件生成动态网页,返回给客户; Struts1配置文件 1. Web.xml:映射ActionServlet,用于接收所有用户的请求。 <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/conf/struts-config.xml</param-value> </init-param> </servlet> 2. Servlet-mapping:用户可以将访问web应用个的扩展名映射到具体处理的servlet,例如将.do结尾的请求都转发到ActionServlet控制器 <servlet-mapping> <servlet-name>action</servlet-name> <url-param>*.do</url-param> </servlet-mapping> 3. Struts-config.xml:用来配置组件:ActionForm、DynaActionForm、Action、全局异常。 <?Xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE struts-config PUBLIC “-//Apache Software Foundation//DTD Struts Configration 1.1//EN”“/WEB_INF/dtd/struts-config_1_2.dtd”> <struts-config> 各种子元素:form-bean,action </struts-config> 4.在struts-config中的元素配置 1. <form-bean>和<form-beans>:定义表单对象,如定义ActionForm类,<form-bean name=“menuForm” type=”com.itjob.struts.MemuForm”> 定义DynaActionForm类: <form-bean name=“loginForm” type=”org.apache.struts.DynaActionForm”> <form-property name=”username” type=”java.lang.String”/> <form-property name=”password” type=”java.lang.String”/> </form-bean> 2. <globle-forward>和<forward>:将一些常用的页面配置成全局,这样就不用在action中配置forward 3. <action-mapping>和<action>:action元素描述从特定的请求路径到相应的Action类的映射, 如form-bean中定义name指定表单名称,提供给action,用于指定使用哪个表单。 5.Action属性包括:path,type(完整类名),name(form-bean名),scope,validate,input(输入表单的路径,当表单验证失败时将请求转发到该URL) 6.Action中子元素forward用于指定局部forward走向。 <action-mapping> <action path=”/login” type=”完整类名” name=”loginForm” scope=”request” validate=”ture” input=”/login.jsp”/> <action path=”/welcom” type=”完整类名” > <forward name=”continue” path=”/welcome.jsp”/> </action> </action-mapping> 7. <globle-exceptions>和<exception>:定义全局异常 8. <controller>:用于配置ActionServlet请求处理器,代替自己创建的ActionServlet子类 9. <message-resources>:配置本地化消息文本 10. <piug-in>:插件 11. <data-sources>:配置应用程序的数据源 12. Validation.xml:对表单进行验证,使用<plug-in> 13. 资源文件.properties:针对不同语言编写不同资源文件,方便web程序的国际化:资源文件名_国别_语言.properties Struts1标签库 1. <html:form>:为了创建 Struts和html交互的表单。它的Action属性必须在Struts的配治文件中找到,以便找到相应的Action类: <html:form action=”/advise.do” enctype=”multipart/form-data”> </html:form> 另外还有text、hiden、password、textarea、img、link、submit、select、reset、checkbox 2. <bean:cookie>:在访问JavaBean及属性,以及定义一个新bean时使用,将请求的cookie值定义成脚本可以访问的JavaBean实例。 还有define(定义变量)、header、include、message、page、parameter、resource、Struts、write <bean:define id=”test” value=”this is a test”></bean:define> 3. <logic:equal>:管理条件,以及循环产生对象,判断变量是否与指定变量相等。 还有greaterThan、greaterEqual、lessThan、lessEqual、iterate(循环遍历)、empty、present(是否存在)、forward、redirect <logic:iterate id=”user” name=”yserArray”> <bean:write name=”user” property/> </logic:iterate> 4. <nested:nest>:增强嵌套能力。定义嵌套级别,表达JavaBean间的嵌套关系。在一个表单中加入属性值,则可以使用nested进行嵌套写入。 还有root:指定底层界别的JavaBean 5. <title:insert>:用于创建复合式网页,将指定网页加入某网页中。 拦截器Interceptor和过滤器Filter的区别 (1)拦截器是基于java反射机制的,而过滤器则可以对几乎所有请求起作用 (2)拦截器不依赖servlet容器,而过滤器依赖于servlet容器。 (3)拦截器只能对执行到Action中的请求起作用,而过滤器可以对任意请求起作用,比如直接跳转到jsp的请求 (4)拦截器可以访问action中上下文值栈里面的对象,过滤器不能。 (5)在action的生命周期中,拦截器可以多次调用,而filter只能在servlet容器初始化的时候调用。 为什么要用Struts JSP、 Servlet、 JavaBean 技术的出现给我们构建强大的企业应用系统提供了可能。 在Struts之前,最常见的做法是在JSP中加入业务和应用逻辑,或者在Servlet中通过println()来生成视图。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。基于 Struts,是通过结合JSP和Servlet,使Web应用的视图和业务/应用逻辑得以清晰地分离开来。 struts 如何实现国际化 以下以两国语言(中文, 英文)为例: 1. 在工程中加入 Struts 支持 2. 编辑ApplicationResource.properties文件 , 在其中加入要使用国际化的信息 :lable.welcome.china=Welcome!!! 3. 创建英文资源文件 ApplicationResource_en.properites 4. 创建临时中文资源文件 ApplicationResource_temp.properites 例如: lable.welcom.china=中国欢迎您! 5. 对临时中文资源文件进行编码转换。 可以使用 myeclipse 的插件,也可以在 dos 下执行: native2ascii -encoding gb2312 ApplicationResource_temp.properties ApplicationResource_zh_CN.properties 6. 在 jsp 中加入 struts 的 bean 标记库<%@ taglib uri=”/WEB-INF/struts-bean.tld” prefix=”bean”%> 显示信息: <bean:message key=”label.welcome.china”> 可以在 struts-config.xml 文件中定义多个资源包,而每个资源包可使用 key 属性指定包的名称。 拦截器 1.拦截是AOP的一种实现策略。在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。 2.它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取action中可重用的部分的方式。Struts1.x的标准框架中不提供任何形式的拦截器。 3.拦截器是Struts2的一个强有力的工具,如国际化、转换器,校验等。 4.拦截器链(Interceptor Chain,在Struts2中称为拦截器栈Interceptor Stack)。 拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。 5.Struts 2的拦截器实现相对比较简单。 当请求到达Struts2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一一地调用列表中的拦截器,Struts 2已经提供丰富多样功能齐全的拦截器实现。 读者可以到struts2-all-2.0.6.jar或struts2-core-2.0.6.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。作为“框架(framework)”,可扩展性是不可缺少的,因为世上没有放之四海而皆准的东西。 6.创建自定义拦截器。 IOC控制反转在Struts中的应用 如何利用IoC在Action处理过程中可以访问到当前请求HttpServerRequest对象。 在例子中,使用的依赖注入机制是接口注入,接口注入需要的是已经被实现了的接口。这个接口包含了相应属性的setter,为Action提供值。 例子中使用了ServletRequestAware接口,如下: public interface ServletRequestAware { public void setServletRequest(HttpServletRequest request);} 当继承这个接口后,原本简单的Action看起来有点复杂了,但是这时可以获取HttpServerRequest对象来使用了。 public class IoCForStruts2 implements ServletRequestAware { } Struts2配置文件:web.xml、Struts.xml 1. 在web.xml中配置(Struts1)org.apache.struts.action.ActionServlet (Struts2)加载核心控制器FilterDispacher <filter> <filter-name>struts2<filter-name> <filter-class>org.apache.struts2.sidpacher.FilterDispacher</filer-class> </fliter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 2.Struts.xml:负责管理所有的action <!DOCTYPE struts PUBLIC ”-//Apache Software Foundation//DTDD Struts Configuration 2.0//EN” “http://struts./dtd/struts-2.0.dtd”> <struts> </struts> Struts使用的标签: 1. include:将不同的配置模块放在不同的配置文件中 2. package:导包 3. action:将一个请求对应一个Action去处理 <action name =”adminLogin” class=”包名” method=”动作指向Action的哪个方法”> <result>index.jsp</result> </action> 4. result: 5. param:action的子标签,是设置参数 Struts.properties 配置Struts2的框架属性,放在src下,编译后将会放在工程的classes下 default.properties Struts2数据校验:重写validate和整合Xwork校验框架 1. 重写validate 2. 使用框架校验:每个Action同目录下都有一个Action名-validation.xml文件。在xml文件中编写<validator>进行校验。 Struts2标签库:OGNL 1. 控制标签:iterator,if、else,append,generator,sort,merge,subset 2. 数据标签:action(调用action),bean(创建JavaBean),set,include,debug,push,url 3. UI标签:form,textfile,select,radio,checkboxlist, Struts2拦截器:基于AOP 在Struts2配置拦截器只需要指定拦截器的名称和实现类,使用<intercepts><intercepts><param> 拦截器放在struts-default.xml中 10. STRUTS 的应用(如 STRUTS 架构) Struts 是采用 Java Servlet技术,开发 Web 应用程序的开放源码的framework。采用 Struts 能开发出基于 MVC(Model-View-Controller)设计模式的应用构架。 Struts 有如下的主要功能: 包含一个 controller servlet,能将用户的请求发送到相应的Action 对象。 JSP 自由 tag 库,并且在 controller servlet 中提供关联支持,帮助开发员创建交互式表单应用。 三.提供了一系列实用对象: XML 处理、通过 Java reflection APIs 自动处理 JavaBeans 属性、国际化的提示和消息。 |
|