简述struts框架使用的一般步骤,
Struts2在软件设计中的应用可以独立于Servlet API和struts API。Struts2的这个设计属于无创设计;
2)拦截器,实现参数拦截、注入等功能;
3)类型转换器,可以将特殊的请求参数转换成需要的类型;
4)多种表示层技术,如JSP、freeMarker、Velocity等。
5)5)struts 2的输入验证可以验证一个指定的方法;
6)提供了全局范围、包范围和动作范围的国际资源文件管理实现。
struts2是如何开始的?
Struts2框架由Filter启动,即StrutsPrepareAndExecuteFilter,是struts2的核心过滤器;
类路径下的默认配置文件struts.xml将在StrutsPrepareAndExecuteFilter的init()方法中读取,以完成初始化操作。2 struts2在读取了struts.xml的内容后,就要把
封装成javabean对象然后存储在内存中,内存中的数据将用于以后用户的每次请求处理,而不是每次请求都读取struts.xml文件。
- web.xml加载StrutsPrepareAndExecuteFilter。
-调用ActionMapper。这个请求需要struts2来处理吗?
-如果需要,请求将由actionProxy处理,ActionProxy将根据配置管理器和ActionMapper分析执行的具体操作。
-然后ActionProxy会实例化一个ActionInvoke实例来调用真正的激活类。
ActionInvocation实例初始化时,会根据配置文件加载相应的拦截器。
-最后,返回ActionInvocation以返回相应的结果。根据struts.xml配置文件,返回相应的页面给浏览器,或者返回动作执行整个循环流程。
2)功能:
负责拦截由url-pattern /* /url-pattern指定的所有用户请求。当用户请求到达时,这个过滤器将过滤用户的请求。默认情况下,如果用户请求的路径
没有后缀或者以结尾。动作,请求将被转移到struts2框架进行处理,否则struts2框架将跳过请求的处理。
可以通过常量 struts.action.extension 修改动作的后缀,比如:
struts常量名称=struts.action.extension 值=do//struts
如果用户需要指定多个请求后缀,后缀之间用英文逗号(,)分隔。比如:
constant name= struts . action . extension value= do,go/
2 struts 2配置文件的加载顺序?
struts . XML —— struts . properties
可以在struts.xml或struts.properties中配置常量。如果在多个文件中配置了相同的常量,则后一个文件中配置的常量值将覆盖前一个文件中配置的常量值。
struts.xml文件的作用:通知Struts2框架加载相应的动作资源——一般不需要struts.properties配置文件,可以直接在struts.xml中配置常量。
2如何修改struts2常量?
常量可以在struts.xml或struts.properties中配置。这两种配置如下:
1)在struts.xml文件中配置常量。
支杆
常量名称=struts.action.extension 值=do/
/struts
2)在struts.properties中配置常量(struts.properties文件放在src下):
struts.action.extension=do
struts2如何访问三个域对象:HttpServletRequest、HttpSession和ServletContext?
选项1:
http servlet request request=servletactioncontext . get request();
http servlet response response=servletactioncontext . getresponse();
HttpSession会话=
request . getsession();
ServletContext servletContext=
servletactioncontext . getservletcontext();
选项2:
种类
实现ServletRequestAware、ServletResponseAware、SessionAware、ServletContextAware
注意:框架自动传入相应的域对象。
struts2如何管理动作?这种管理方式的优点是什么?
2 struts2框架使用包来管理动作,包的作用和java中类包的作用非常相似。
它主要用于管理与一组业务功能相关的操作。在实际应用中,我们应该将一组与业务功能相关的操作放在同一个包中。
struts2中的默认包struts-default有什么作用?
1)struts-default包是struts内置的,struts2中定义了很多拦截器和结果类型,Struts2的很多核心功能都是通过这些内置的拦截器实现的,比如:from requests
将请求参数封装到动作中,上传文件,验证数据等。都是通过拦截器实现的。只有当包继承了struts-default包,我们才能使用struts2提供的功能。
2)struts-default包在struts-default.xml中定义,也是Struts2的默认配置文件。2 struts每次都会自动加载struts-default.xml文件。
3)通常每个包都应该继承struts-default包,
struts2的工作流程?
用户请求
—— strutsprepareendexecutefilter
——拦截器
——行动
——结果
—— Jsp/html
3354响应
struts2的动作的URL访问路径是由什么构成的?
由两部分组成:包的命名空间动作名称【动作后缀】,即:package.namespace action.name。
在struts.xml中可以不指定action的class属性吗?struts2中的默认属性是什么?
是的,如果没有为action指定class,默认为com . open symphony . xwork 2 . action support。
默认属性:
如果没有为操作指定类别操作支持
如果没有为action指定execute()方法,注意:ActionSupport的execute方法中只有一句返回‘success’;
如果没有指定结果的名称success
如果未指定结果分派器类型
默认情况下,在action中有一个对interceptor的引用,即:interceptor-ref name= default stack
注意:
1)一旦我们为这个包中的一个动作显式指定了拦截器,默认拦截器就不起作用了,所以这个时候要显式引入默认拦截器;
2)每个包只能指定一个默认拦截器,每个默认拦截器只对当前包有效。
struts2如何验证指定的方法?
1)1)validate()方法将验证动作中与execute方法具有相同签名的所有方法;
2)为了验证指定的方法是通过重写validateXxx()方法实现的,validateXxx()将只验证动作中名为Xxx的方法。Xxx的第一个字母要大写;
3)当某些数据验证失败时,调用addFieldError()方法将验证失败信息添加到系统的fieldErrors中(为了使用addFieldError()方法,action可以继承ActionSupport),
如果系统的fieldErrors包含失败信息,struts2会将请求转发给结果;命名输入;
4)在输入视图中,可以通过s:fielderror/显示故障信息。
5)先执行validate xxxx()-validate()-如果有错误,将转发result name=input/指定的页面;如果没有错误,将直接执行Action:execute()方法。
struts2能默认解决get和post提交方法的乱码问题吗?
不能。struts.i18n.encoding=UTF-8属性的值只能解决POST提交下的乱码问题。
struts2如何上传文件?
1.JSP页面:
1)1)JSP页面上传文件的组件:s: file name="upload"/。如果需要一次上传多个文件,必须使用多个文件标签,但它们的名称必须相同,即:
name="XXX "的值必须相同;
2)表单的enctype属性必须设置为:multipart/form-data;
3)表单的方法必须是post,因为post提交的数据在消息体中,没有大小限制。
2.相应的操作:
1)在Action中添加三个与文件上传相关的新属性;
2)如果上传单个文件,uploadImage属性的类型为java.io.File,代表上传的文件,第二个和第三个属性的类型为String,分别代表上传的文档。
文件名和文件类型定义如下:
jsp文件组件ContentType的名称,
jsp文件组件文件名的名称。
3)如果在上上传了多个文件,可以使用数组或列表。
struts2的拦截器和拦截器栈有什么区别:
1)Struts2拦截器在访问操作方法之前或之后进行拦截。Struts2拦截器是可插拔的。
2)拦截器栈:将拦截器按照一定的顺序链接成链。当访问被拦截的方法时,Struts2拦截器链中的拦截器将按照之前定义的顺序进行排序。
调用,类似于web.xml文件中Filter的配置序列调用。
拦截器的生命周期和工作流程?
1)每个拦截器都是实现拦截器接口的Java类;
2)init():这个方法会在拦截器创建后立即调用,在拦截器的生命周期中只调用一次。相关资源的必要初始化可以在该方法中完成;
3) Intercept (action invocation调用):每次拦截到一个动作请求,就会调用一次这个方法;
4)destroy:这个方法会在拦截器被销毁之前调用,在拦截器的生命周期内只调用一次;
Struts 2内置了18个拦截器。
拦截器的作用是什么?拦截器和过滤器有什么区别?
1)拦截器处理被调用的动作。它为开发人员提供了一种机制来定义在执行一个动作之前和之后要执行的代码。拦截器只能拦截动作,也就是说拦截器其实就是动作。
的功能块仅在操作前后执行。拦截器可以抽象出一部分代码,用来完善原来的动作。同时可以减少代码冗余,提高复用率。
2)过滤器拦截用户的请求,其范围显然比拦截器大得多。
请在struts2中写下至少5个默认拦截器?
FileUpload提供文件上传功能。
I18n记录用户选择的地区。
cookie使用配置的名称name,value来引用cookie
Checkbox添加复选框自动处理代码,将未选中复选框的内容设置为false,而html默认不提交未选中复选框。
Chain允许上一个动作的属性被下一个动作访问,现在与chain类型的result()结合使用。
Alias在不同的请求之间转换不同名称的请求参数,请求内容保持不变。
的result type属性中的结果类型是什么?
共有10种:
Dispatcher struts是默认的结果类型。如果需要将控制权重定向到外部资源,则应该在将控制权转发给应用程序中的资源时使用它。
重定向结果类型
将响应重定向到另一个资源(包括外部资源)
RedirectAction将响应重定向到另一个操作。
freemarker、velocity、chain、httpheader、xslt、明文、流
struts2如何完成html表单到动作的类型转换?
1)在struts2中,Params拦截器负责将请求参数映射到动作属性,它是defaultStack拦截器的成员。Params拦截器可以自动完成字符串。
和基本数据类型。
2)对于引用类型(字符串和集合除外)的数据转换,需要定义一个自定义类型转换器;
3)自定义TypeConverter必须实现TypeConverter接口或扩展该接口的某些特定实现,如:StrutsTypeConverter,重写convertToString和convertFromString方法;
4)两种定制类型的转换器:
本地:
创建一个属性文件:action class name-conversion . properties,该文件应该和对应的action类(Action)放在同一个目录下,Actionclass name是Action的类名。
下面的-conversion.properties是固定的。属性文件中的内容是:属性名=类型转换器的完整类名。
全球:
在WEB-INF/classes/目录中创建xwork-conversion.properties文件。属性文件中的内容是:要转换的类型=类型转换器的完整类名
注意:对于转换后的属性,只需要写属性名即可;对于对应的类型,需要写完整的类名。
ValueStack valuestack的原理和生命周期?
1)ValueStack贯穿整个动作的生命周期,存储在请求域中,所以ValueStack的生命周期与请求的生命周期相同。当Struts2接受请求时,它会快速创建ActionContext,
值堆栈,操作.然后,该动作被存储在ValueStack中,因此OGNL可以访问该动作的实例变量。当请求到来时,动作的生命,ValueStack开始,请求结束,动作,
价值的生命结束了;
2)action是多实例的,不像Servlt,Servlt是单实例的;
3)每个动作都有对应的值栈。存储在值堆栈中的数据类型是动作的实例和动作中的实例变量。默认情况下,操作对象保存在堆栈的顶部;
4)ValueStack本质上是一个ArrayList;
5)关于上下文映射,Struts会将以下映射压入上下文映射:
参数:该映射包含当前请求的请求参数。
请求:这个映射包含当前请求对象中的所有属性。
会话:该映射包含当前会话对象中的所有属性。
应用程序:该映射包含当前应用程序对象中的所有属性。
Attr:该映射按以下顺序检索属性:请求、会话、应用程序。
6)使用OGNL访问值栈的内容时,不需要#号,但是访问request、session、application、attr时,需要加一个#号;
7)注意:在Struts2中,OGNL表达式需要匹配Struts标签才能使用。例如s:属性值=名称/
8)引用struts2配置文件中的ognl表达式,引用value stack的值,此时用 $ 代替#或%;
action、ServletContext和ActionContext有什么区别?
1)ActionContext是当前动作的上下文环境,通过它可以得到request、session、ServletContext等动作相关对象的引用。
2)ServletContext是一个域对象。一个web应用只有一个ServletContext,它的生命周期是和整个web应用在一起的;
3)pageContext是JSP中最重要的内置对象,可以用来获取其他域对象的应用。同时,它是一个域对象,其作用域只针对当前页面。当前页面结束时,pageContext将被销毁。
生命周期是JSP的四个域对象中最小的一个。
struts2如何防止用户表单的重复提交?
步骤1:添加s:token/
第二步是使用令牌拦截器定义invalid.token结果集。