第一篇:struts2知识总结
struts2知识总结
1.全局的逻辑控制器为一个过滤器,负责过滤所有的请求。该过滤器引用的API类为
org.apache.struts2.disapatcher.FilterDispatcher
2.MVC:页面请求(jsp)——>逻辑控制器(Filter)——>业务控制器(Action)——>业务逻辑组件——>业务处理/DAO
3.struts2的配置文件放在classpath下。
4.struts2的类型转换:
a.继承DefaultTypeConverter,覆盖父类的public Object convertValue(Map context, Object value, Class toType)方法
b.继承StrutsTypeConverter, 覆盖父类的public Object convertFromString(Map context, String[] values, Class toClass)该方法负责转换从页面传递过来的数据。
覆盖父类的public String convertToString(Map context, Object o)
该方法负责将Action中处理好的数据转换成相应格式的字符串。
5.struts2的数据验证:
a.使用编码方式进行验证。业务控制器Action继承ActionSupport类,重写public void validate()方法。
在该方法中进行数据验证。若Action中处理业务的方法为test,则可以编写public void validateTest()方法,来对test方法的数据进行验证。(系统在进行validateTest方法后,会接着执行validate方法,然后
才执行相应的业务代码。)
若严重出错,则可以调用addFieldError或者调用addActionError方法,增加相应的错误提示信息。
b.使用配置xml文件进行验证。验证文件的名字为:×××Action-validation.xml。验证的方式包含字段验证和非字段验证。
其中字段验证表示对某个字段进行某些类型的验证。非字段验证表示用某个类型的验证来验证,某个字段。两种方式
底层实现一样,只是表现方式不同,字段验证方式比较直观。
验证的类型有一下几种:required,requiredstring,int,date,double,expression,fieldexpression email,url,visitor,conversion,stringLength,regex(正则表达式)。
对验证类型可以指定shourt-circuit参数为true,来执行短路验证。
如果Action中执行业务的方法为test,则可以通过编写×××Action-test-validation.xml方法来对test方法的数据进行 验证。且执行完test方法的私有验证文件后,还会执行默认的验证文件×××Action-test-validation.xml的验证。
c.struts2进行客户端的验证。首先需要使用struts2的标签库,且标签库的theme属性不能为simple,然后设置标签的validate属性为true。
注意:struts2的客户端验证依赖于服务器的验证配置文件。
6.struts2的拦截器。struts2的拦截器是struts2的核心,其底层实现使用了Java的反射机制与动态代理。在struts2的配置文件中
为一个Action引入了一个拦截器,则配置的默认拦截器不会被调用,需要手工配置到该Action中。
实现struts2拦截器的方法:
a.实现Interceptor接口,并实现init,destrory以及intercept方法。
b.继承AbstractInterceptor类,覆盖intercept方法。
c.继承MethodFilterInterceptor类,覆盖intercept方法。该类可以对特定的方法进行拦截。
拦截器栈可以包含拦截器和拦截器栈。
7.文件的上传和下载:
a.使用apache组织开发的commons-fileupload和commons-io包,并且按需要配置fileUpload拦截器和相应的上传参数,比如上传文件的类型,上传文件的大小。多文件的上传可以使用js代码来在页面修改上传文件的列表,在Action中
则用三个列表分别来保存文件对象(file),文件名(fileName),以及文件类型(fileContentType)。
b.文件下载使用流进行读取:return ServletActionContext.getServletContext.getResourceAsStream(“文件名”)并将Action的结果返回类设定为stream,即流。按需要配置相应的参数。
8.struts2的国际化。struts2国际化的底层实现用到了Java基础类库中的Locale(地区)和ResourceBundle(消息资源)两个类。
struts2的国际化主要用在一下几个地方:
a.jsp页面:使用struts2的标签时,指定标签的key属性(对应消息资源文件中的key)。
使用
还可以用
b.Action中:调用getText(key)或者getText(key,args)方法取得消息资源文件中的消息资源。
c.xml验证文件中:指定message元素的key属性(对应消息资源文件中的key)。(怎么传参数?)d.类型转换过程中:通过查看xwork包的源代码可以找到:ge.properties文件中可以找到如下的键值对:
xwork.default.invalid.fieldvalue=Invalid field value for field “{0}”.在消息资源文件中重新指定该键值对即可。
另外在struts.properties中设定键值对struts.i18n.encoding=GBK,可以解决中文乱码问题。
9.struts2的异常处理。在Action中,我们的业务逻辑处理方法都对抛出异常进行了声明。具体的异常对应具体的处理结果。
在action配置中:
还可以配置全局的异常处理:
struts2的其他东西:
1.对于struts.xml中的package:
a.设置
,则表明该包中没有action的配置,只定义一个基础公共的组件。
b.package的namespace可以将不同的请求路径分隔开,在多人合作项目中用到比较多。当接收到一个请求,若在当前的namespace中没有相应的请求地址,则会到默认的namespace中去寻找匹配的地址。
2.模型驱动机制(ModelDriven),将一个Action中的各个参数封装成为一个JavaBean(类似struts1.x中的
ActionForm)。需要实现ModelDriven
3.防止表单的重复提交:在jsp的表单中设置
配置该key,来实现国际化。
4.struts2中Action与Servlet容器的耦合。主要有三种方式: a.实现ServletRequestAware或ServletResponseAware接口。并提供对request或者response熟悉的设置方法。
b.使用ActionContext(但不能获得response对象)。改方法方便单元测试。
c.使用ServletActionContext。ServletActionContext是ActionContext的子类。
首选使用ActionContext,其次ServletActionContext。
5.整合多个struts配置文件,在struts2的配置文件中使用include元素包含其他的配置文件。用于多模块开发。
6.可以在web.xml中对struts2的核心过滤器FilterDispatcher设置初始化参数(不推荐使用)。
7.动态方法调用(DynamicMethodInvocation).a.action配置中指定:
b.在客户端即页面指定:
c.使用通配符:
使得程序不明了,不提倡使用该方法。
8.struts2的结果类型。在struts2-core包中,有几种struts2已经配置好的结果类型。
其中默认的类型为dispatcher,此外还有:redirectAction,chain,freemaker,httpheader,redirect, redirectAction,stream,velocity,xslt,plainText。
9.struts2与spring的整合。导入struts2-spring-plugin包,在web.xml中设置spring的监听器, spring监听器对应的API类为:org.springframework.web.context.ContextLoaderListener。
struts2-spring-plugin包为我们将struts2的对象工厂设置为spring的IoC容器,其代码为:
很明显,将struts.objectFactory定位为org.apache.struts2.spring.StrutsSpringObjectFactory 其余的工作就交给spring的IoC容器去做了。
另外:当我们需要增加spring的配置文件时,需要在web.xml中设定contextConfigLocation参数。代码如下:
contextConfigLocation 其他的spring配置文件名,用逗号隔开
需要注意的一些地方
1.存储fieldError的是一个LinkedHashMap
ActionSupport中的getFieldError方法返回的是一个新的集合。该集合是原fieldError集合的一个副本。
在struts2的源代码中返回的是:new LinkedHashMap(internalGetFieldError),即一个新的集合对象。
所以执行代码:this.getFieldErrors.put(”username“,”ErrorMsg");不会影响原fieldError集合的数据。
2.若一个Action注册了PreResultListner,则会在该Action返回的时候调用相应结果验证的逻辑代码。
3.struts2-core包中的default.properties和struts-default.xml文件保存了一些struts2默认的配置。
可以在自己的struts配置文件中对相应的配置进行覆盖或重新设值。比如修改请求的后缀名:在struts.properties 中加入:
struts.action.extension = do 则将struts2请求的后缀名修改成了struts1中的do后缀名的形式。
4.在配置文件中配置struts.multipart.saveDir来设定上传文件时的临时文件的存储位置。需要定期清理该路径下的文件。
第二篇:struts2面试题(自己总结)
Struts2面试题
1、struts2工作流程
Struts 2框架本身大致可以分为3个部分:
核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。
业务控制器Action和业务逻辑组件是需要用户来自己实现的。
用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。
Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。基本简要流程如下: 1、客户端初始化一个指向Servlet容器的请求;
2、这个请求经过一系列的过滤器(Filter)
(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
9、响应的返回是通过我们在web.xml中配置的过滤器
10、如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。
2、说下Struts的设计模式
MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生 成动态的网页,返回给客户。
3、拦截器和过滤器的区别
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
4、struts1于struts2的比较
1、Action 类: Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
2、线程模式: Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
3、Servlet 依赖: Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和
HttpServletResponse 被传递给execute方法。
Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和
HttpServletResponse的必要性。
4、可测性:
测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
5、捕获输入:
Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。
Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过
web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种
ModelDriven 特性简化了taglib对POJO输入对象的引用。
6、表达式语言:
Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言-- “Object Graph Notation Language ”(OGNL).7、绑定值到页面(view): Struts 1使用标准JSP机制把对象绑定到页面中来访问。
Struts 2 使用
“ValueStack ”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
8、类型转换:
Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
9、校验:
Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
10、Action执行的控制:
Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
为什么要使用Struts2 Struts2 是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优点,同时做了相当的改进。
1.Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程。
2使用OGNL进行参数传递。
OGNL提供了在Struts2里访问各种作用域中的数据的简单方式,你可以方便的获取Request,Attribute,Application,Session,Parameters中的数据。大大简化了开发人员在获取这些数据时的代码量。3强大的拦截器
Struts2 的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,可以将一些通用的功能如:登录验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实现的的一Web项目中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。4易于测试
Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测试用例,大大方便了5Java Web项目的测试。
易于扩展的插件机制在Struts2添加扩展是一件愉快而轻松的事情,只需要将所需要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中作一些简单的设置就可以实现扩展。6模块化管理
Struts2已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包含的应用模块创建为插件创建新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。
7全局结果与声明式异常
为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程中出现指定异常时,可以跳转到特定页面。
他的如此之多的优点,是很多人比较的青睐,与spring ,Hibernate进行结合,组成了现在比较流行的ssh框架,当然每个公司都要自己的框架,也是ssh变异的产品。
struts2有哪些优点?
1)在软件设计上Struts2的应用可以不依赖于Servlet API和struts API。Struts2的这种设计属于无侵入式设计; 2)拦截器,实现如参数拦截注入等功能;
3)类型转换器,可以把特殊的请求参数转换成需要的类型; 4)多种表现层技术,如:JSP、freeMarker、Velocity等; 5)Struts2的输入校验可以对指定某个方法进行校验;
6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现
struts2是如何启动的?
struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器; StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。
struts2框架的核心控制器是什么?它有什么作用?
1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。2)作用:
负责拦截由
可以通过常量“struts.action.extension”修改action的后缀,如:
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
struts2配置文件的加载顺序?
struts.xml ——> struts.properties 常量可以在struts.xml或struts.properties中配置,如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.struts.xml文件的作用:通知Struts2框架加载对应的Action资源
struts2常量的修改方式?
常量可以在struts.xml或struts.properties中配置,两种配置方式如下: 1)在struts.xml文件中配置常量
struts.action.extension=do struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域对象?
方案一:
HttpServletRequest request =ServletActionContext.getRequest();HttpServletResponse response =ServletActionContext.getResponse();HttpSession session= request.getSession();ServletContext servletContext=ServletActionContext.getServletContext();
方案二:
类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 注意:框架自动传入对应的域对象
struts2是如何管理action的?这种管理方式有什么好处?
struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。
主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
struts2中的默认包struts-default有什么作用?
1)struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中
把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。2)struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载 struts-default.xml文件。
3)通常每个包都应该继承struts-default包。
struts2如何对指定的方法进行验证?
1)validate()方法会校验action中所有与execute方法签名相同的方法; 2)要校验指定的方法通过重写validateXxx()方法实现,validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写; 3)当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport),如果系统 的fieldErrors包含失败信息,struts2会将请求转发到名为input的result;
4)在input视图中可以通过
struts2默认能解决get和post提交方式的乱码问题吗?
不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。
请你写出struts2中至少5个的默认拦截器?
fileUpload 提供文件上传功能
i18n 记录用户选择的locale cookies 使用配置的name,value来是指cookies checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
chain 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。
alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变
值栈ValueStack的原理与生命周期?
1)ValueStack贯穿整个 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一样。当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。请求来的时候,action、ValueStack的生命开始,请求结束,action、ValueStack的生命结束;
2)action是多例的,和Servlet不一样,Servelt是单例的;
3)每个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action对象默认保存在栈顶; 4)ValueStack本质上就是一个ArrayList;
5)关于ContextMap,Struts 会把下面这些映射压入 ContextMap 中: parameters : 该 Map 中包含当前请求的请求参数
request : 该 Map 中包含当前 request 对象中的所有属性 session :该 Map 中包含当前 session 对象中的所有属性
application :该 Map 中包含当前 application 对象中的所有属性 attr:该 Map 按如下顺序来检索某个属性: request, session, application 6)使用OGNL访问值栈的内容时,不需要#号,而访问request、session、application、attr时,需要加#号;
7)注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:
ActionContext、ServletContext、pageContext的区别?
1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用; 2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;
3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁,生命周期是JSP四个域对象中最小的。
result的type属性中有哪几种结果类型?
一共10种:
dispatcher struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,若需要把控制权重定向到一个外部资源, 应该使用 redirect结果类型
redirect 把响应重定向到另一个资源(包括一个外部资源)redirectAction 把响应重定向到另一个 Action freemarker、velocity、chain、httpheader、xslt、plainText、stream
拦截器的生命周期与工作过程?
1)每个拦截器都是实现了Interceptor接口的 Java 类;
2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次.可以在该方法中对相关资源进行必要的初始化;
3)intercept(ActionInvocation invocation): 每拦截一个动作请求, 该方法就会被调用一次; 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;
5)struts2中有内置了18个拦截器。
struts2如何完成文件的上传?
1、JSP页面:
1)JSP页面的上传文件的组件:
name=“xxx”的值必须一样;
2)必须把表单的enctype属性设置为:multipart/form-data; 3)表单的方法必须为post,因为post提交的数据在消息体中,而无大小限制。
2、对应的action:
1)在 Action 中新添加 3 个和文件上传相关的属性;
2)如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文 件的文件名和文件类型,定义方式是分别是:
jsp页面file组件的名称+ContentType, jsp页面file组件的名称+FileName 3)如果上上传多个文件, 可以使用数组或 List
第三篇:easyui结合struts2总结
easyui 结合Struts2 总结 在把struts2框架搭好以后,由于easyui和后台交互主要是靠ajax来进行的并且返回的数据格式是json形式的。所以我们必须在项目中引入struts2-json-plugin 来方便的把数据转换为json格式。需要的jar包如下图:
下面是我写的一个小例子,来更好的说明之间数据是如何传递的。(为了节省篇幅,数据库表就省略了)jsp页面主要代码如下:
当我们把页面写好以后就要写action类了。主要代码如下:
get、set方法这里就省略了。
接下来就是在struts.xml 中进行配置了。代码如下
这里要特别注意了,继承的是json-default, result 中德type是json。这里的配置是关键,起初由于配置问题,花了我很多时间。然后就是写EmpService类和getAll方法了。代码如下
这里我是把对象先放到map集合中,让和放到list集合中,这样就自动转为json格式(感觉有些麻烦,谁有好的方法,请发送到zl673170035@163.com,谢谢哈)然后在浏览器上运行。
在js 中加入了工具条。
剩下的修改、删除、增加,我是仿照easyui官网的demo中的一个例子做的。我遇到的主要问题就是,ajax 如何把参数传给action和ajax如何接收action传回的参数。
首先说说第一个问题,ajax 如何把参数传给action.。
只要action 中有相对应的get和set 方法。我们发起ajax请求时struts就自动的把参数加到action中了。
这里把参数名都变为emp.XX 然后在action 中加入成员变量emp和get、set方法。这样action就能接收值了。
接下来需要从action中给ajax中传递参数了。我们在struts.xml中如下配置
在action中设置result 的get、set 方法。这样ajax就能接收到action传回的参数了。
好了这是我的一点心得,希望对你有用。
第四篇:Struts2介绍
Struts2集成指南
关于Struts2 Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是MVC经典设计模式中的一个经典产品。
Struts,a history 在Java EE的Web应用发展的初期,除了使用Servlet技术以外,普遍是在JavaServer Pages(JSP)的源代码中,采用HTML与Java代码混合的方式进行开发。因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,Craig McClanahan采用了MVC的设计模式开发Struts。后来该框架产品一度被认为是最广泛、最流行JAVA的WEB应用框架。
Craig McClanahan 2006年,WebWork与Struts这两个优秀的Java EE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x版本产品称为“Struts 1”。
至此,Struts项目并行提供与维护两个主要版本的框架产品——Struts 1与Struts 2。Struts1 vs.Struts2 侵入性
Struts 1 在编程方面是面向抽象类编程,而不是面向接口编程。Struts 1要求自定义Action 类继承一个特定的抽象基类Action。另一方面,Struts 1的 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。例如 e.g.public class LogonAction extends Action {
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){
} }
Struts 2 Action 类可以实现一个Action接口,也可以实现其他接口,甚至不实现任何接口。这使得可选的和定制的服务成为可能。e.g.public class ExampleAction {
public String doSomething(){
return “success”;} }
线程模式
Struts 1 Action类 是单例模式并且必须是线程安全的,因为在web容器中,仅有Action类 的一个实例来处理所有的请求。
Struts2 Web容器为每一个请求产生一个Action类实例,因此没有线程安全问题。可测试性
Struts1 由于对Servlet API的依赖,使得针对于自定义Action类的测试变得复杂。
Struts2 由于自定义Action可以为POJO,所以可以向测试一个POJO一样来测试Action类。
请求参数封装
Struts1 使用ActionForm 对象封装用户的请求参数,所有的 ActionForm 必须继承一个基类:ActionForm。普通的JavaBean 不能用作ActionForm,并且需要在配置文件中定义ActionForm。e.g.public class LogonForm extends ActionForm {
private String userpassword;
private String username;}
Struts2 直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的 Rich对象类型。e.g.public class ExampleAction {
private String responseMessage;private String requestMessage;
public String getResponseMessage(){
return responseMessage;}
public void setResponseMessage(String responseMessage){
this.responseMessage = responseMessage;}
public String getRequestMessage(){
return requestMessage;
} } public void setRequestMessage(String requestMessage){ } this.requestMessage = requestMessage;public String doSomething(){
} setMessage(“Hi, ” + getRequestMessage());return “success”;EL Struts1 整合了 JSTL,因此可以使用JSTL 表达式语言。JSTL有基本对象图遍历,但在对集合和索引属性的支持上则功能不强。在向视图绑定值时,Struts1 使用标准JSP 机制把对象绑定到视图页面。
Struts2 Struts 2 可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2 下的表达式语言功能更加强大。在向视图绑定值时,Struts2 使用“ValueStack ”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。
校验框架
Struts1 Struts1 支持在 ActionForm 重写validate 方法中手动校验,或者通过整合 Commons-validator 框架来完成数据校验。
Struts2 Struts 2 支持通过重写validate方法进行校验,也支持整合XWork 校验框架进行校验。Struts2 architacture
名词约定
凡是代码、配置文件、IDE中出现的名词,均采用英文原称。
Roadmap 本文档的目标是,帮助读者在Eclipse中将Struts2集成至一个崭新的Dynamic Web Project。集成步骤大致如下:配置Struts2的代码环境-> 在web.xml中加入Struts2功能-> 测试Struts2。文档目标达成的标志是:页面请求能够通过Struts2的Action Mapping成功转发,并且基于Java的Struts2验证框架能够生效。
集成步骤
引入Struts2相关的jar文件
Struts2 jars commons-fileupload-1.2.2.jar commons-io-2.1.jar commons-lang-2.4.jar commons-logging-1.1.1.jar freemarker-2.3.16.jar javassist.jar jstl-1.2.jar ognl-3.0.1.jar struts2-core-2.2.3.jar xwork-core-2.2.3.jar 加入build path 将以上10个jar文件,拷贝至WebContent/WEB-INF/lib下:
对于Web Dynamic Project,一般情况下,当你向lib目录下copy了jar文件,eclipse会自动将jar文件加入build path下的名为Web App Libraries的Library。请确认在工程下出现了名为Web App Libraries的Library。如果有,说明这些jar文件已经被添加至build path了:
如果在工程目录下找不到名为Web App Libraries的Library,说明jar文件没有被添加至build path,需要进行手动添加。首先进入build path设置界面,选中Libraries 页,并点击Add JARs:
在JAR Selection窗口中,选中lib下所有的jar文件。选中后点击OK:
你将看到被选中的jar文件已经被添加至build path:
在工程中会出现一个名为Referenced Libraries的Libraries。这说明jar文件已经被添加至build path:
以上两种方法都可以将jar文件添加至build path,它们的效果是一样的。
配置web.xml 添加filter 在web.xml中添加一个filter:
filter-name表示filter的名字,你可以任意决定这个名字。filter-class表示使用哪个类作为filter,从这个类的全称来判断,可以发现FilterDispatcher是Struts2提供的一个类。它是Struts2转发请求的起点。在web.xml中添加一个filter-mapping:
filter-mapping用来映射url和filter的映射关系。filter-name表示filter的名字,这个名字必须和之前filter声明中的filter-name一致。url-pattern表示哪些格式的url会被此filter滤中。/*表示在此web应用域名下,所有的地址都会被filter滤中,换言之,所有的http请求都会通过Struts2进行转发。
filter的作用
通过以上的配置,FilterDispatcher和url与filter-name联系在了一起。
由于在web容器中注册了FilterDispatcher这个filter,Struts2可以收到所有http://localhost:8080/tyland-b2b 的http请求。随后,FilterDispatcher会根据我们定义的action-mapping规则,将请求分发到指定的action类以及它的拦截器栈。最后,Struts2按照action-mapping规则,将后台计算的结果返回给指定页面。笼统地来说,Struts2就是这样工作的,所以说,FilterDispatcher是Struts2工作的入口。
编写代码,测试Struts2 Struts2的环境已经配置好了,基于action-mapping的转发机制已经可以运行了。为了证明这一点,请编写一些测试jsp页面和java代码。
在编写代码的过程中,请确保代码文件的位置如下图所示:
代码清单如下:
Java代码
UserVO.java package com.tyland.b2b.vo;
// 一个Value Object(Data Model),用来存放用户名、密码 public class UserVO {
private String username;private String password;
// 成员变量password的getter方法。
// 在Strtus2中,用来在页面和服务器间传值的Value Object必须有getter方法
public String getPassword(){
return password;
} } // 成员变量password的setter方法。
// 在Strtus2中,用来在页面和服务器间传值的Value Object必须有setter方法 public void setPassword(String password){ } this.password = password;// 同password
public String getUsername(){ } return username;// 同password
public void setUsername(String username){ } this.username = username;BaseAction.java package com.tyland.b2b.web.base;
import com.opensymphony.xwork2.ActionSupport;
// 为了代码的灵活性和可扩展性,请声明一个BaseAction基类
// BaseAction继承Struts2的ActionSupport,因为我们想使用Struts2的一些额外帮助。// 对于ActionSupport的继承不是必须的
public class BaseAction extends ActionSupport {
private static final long serialVersionUID = ***74952195L;} UserAction.java package com.tyland.b2b.web;
import com.tyland.b2b.vo.UserVO;import com.tyland.b2b.web.base.BaseAction;
// 自定义的Action类,继承BaseAction // 由于继承了ActionSupport,我们可以使用Struts2默认的action方法execute()// 由于继承了ActionSupport,我们可以使用Struts2默认的校验方法validate()public class UserAction extends BaseAction {
private static final long serialVersionUID =-7***3684190L;
// 用来在页面和服务器之间传递用户名、密码的Value Object。变量名任意。
private UserVO userVO;
执行。// 用来在页面和服务器之间传递message变量。名称任意。private String message;//用来在页面和服务器之间传递sayHiTo变量。名称任意。private String sayHiTo;// 用来传值的变量必须有getter方法 public UserVO getUserVO(){ return userVO;}
//用来传值的变量必须有setter方法
public void setUserVO(UserVO userVO){ } this.userVO = userVO;public String getMessage(){ } return message;public void setMessage(String message){ } this.message = message;public String getSayHiTo(){ } return sayHiTo;public void setSayHiTo(String sayHiTo){ } this.sayHiTo = sayHiTo;// Override声明说明这个方法复写或实现了父类或接口方法。
// 如action-mapping中不显示指定别的方法,struts2会将execute()作为默认的action方法// 返回的SUCCESS常量,来自ActionSupport,值为“success”。
// action-mapping会根据不同的返回值采取不同的转发或页面跳转动作。@Override
public String execute()throws Exception {
} System.out.println(“******execute******”);System.out.println(userVO.getUsername()+ “ logins”);return SUCCESS;
// 在Struts2执行execute()之前,会先执行validateExecute()进行用户输入验证 // 这个方法名必须符合Struts2验证框架所规定的命名规范 public void validateExecute(){
}
} System.out.println(“******validateExecute******” + userVO.getUsername());if(null == userVO.getUsername()|| userVO.getUsername().length()< 5){ this.addFieldError(“username”, “USERNAME ERROR”);} if(null == userVO.getPassword()|| userVO.getPassword().length()< 5){ this.addFieldError(“password”, “PASSWORD ERROR”);} // 一个自定义方法。通过在action-mapping中的设置,可以实现使用POJO的自定义服务配置 public String sayHi()throws Exception {
} System.out.println(“say hi to ” + getSayHiTo());return SUCCESS;// 符合验证框架命名规范的、真对于sayHi()的验证方法 public void validateSayHi(){
} System.out.println(“******validateSayHi******” + getSayHiTo());if(null == getSayHiTo()|| getSayHiTo().length()< 5){ this.addFieldError(“sayHiTo”, “SAYHITO ERROR”);} ExampleAction.java package com.tyland.b2b.web;
import com.tyland.b2b.web.base.BaseAction;
public class ExampleAction extends BaseAction {
private static final long serialVersionUID =-***7281L;
private String message;private String sayHiTo;
public String getMessage(){
return message;}
public void setMessage(String message){
this.message = message;}
public String getSayHiTo(){
return sayHiTo;}
} public void setSayHiTo(String sayHiTo){ } this.sayHiTo = sayHiTo;public String finish(){
} System.out.println(“example finished”);setMessage(getSayHiTo());return SUCCESS;JSP代码
index.jsp <%@ page language=“java” contentType=“text/html;charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib uri = “http://java.sun.com/jsp/jstl/core” prefix = “c” %>
第五篇:Struts2试题
Struts2 试题
1.struts2的执行流程?
客户端提交一个HttpServletRequest请求(action或JSP页面)
请求被提交到一系列Filter过滤器,如ActionCleanUp和FiterDispatcher等
FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器 询问ActionMapper是否需要调用某个action来处理
如果ActonMapper据诶的那个需要调用某个A传统,FilterDispatcher则把请求教到ActionProxy,由其进行处理
ActionProxy通过Configuration Manager询问框架配置文件,找到需要调用的Action类 ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用action Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器 最后ActionInvocation负责根据struts配置文件中配置的result元素,找到与返回值对应的result
2.struts2的web里需要配置什么?
1.
3.struts.xml文件哪个常量可以实现不用重新启动服务就可以得到反馈?
4.struts中的package的作用是什么?namespace可以为空吗?如果namespace为空会意味着什么呢?
标识
可以、Timmer
如果没写,说明该包为默认空间 只要敲index没有精确对应的package都交给namespackage 如果还没有就崩溃
5.Action 的实现通集成常用那种方法? 一种是直接实现自己的Action 另一种是实现Action的接口 继承ActionSupport
6.路径设置用什么路径,绝对还是相对? 都可以
7.通配符有几种?要遵循什么原则? {1}
方法名
8.Action的属性?
path属性:指定请求访问Action的路径
type属性:指定Action的完整类名
name属性:指定需要传递给Action的ActionForm Bean scope属性:指定ActionForm Bean的存放范围
validate属性:指定是否执行表单验证
input属性:指定当表单验证失败时的转发路径。
9.用于读取资源文件,实现国际化的Struts2的标签(
10.一下关于struts的描述中,不正确的是(D)struts 是一个基于JAVA EE的MVC struts2的框架配置文件是struts-configxml struts2的控制组建核心包括核心控制和业务控制器
在struts中解决中文乱码可以通过修改struts。I18n。encoding的值为GBK来实现 11.不属于Struts2的动作类的常量返回值的是(C)
A.success
B.input
C.never
D.login 12.一下不属于Struts2动作执行的结果类型是(A)a.action b.redirect c.redirectAction d.dispatcher 13.在struts.xml中。假如在一个package中没有配置namespace,那么在其中配置一个Action名字叫做login,它的result是这样配置的
14.正规开发中,在使用struts2时定义Action使用哪种方式。B A.直接定义Action类。B.从ActionSupport继承。C.从Action继承。D.实现Action接口。
15.不同的线程在调用Action时创建几个Action实例。C A.1个 B.2个
C.每个线程创建1个。D.可以自定义配置。
16.struts2的体系结构主要包括那几个部分(A)A.模型层
B.struts控制器组件 C。struts配置文件 D。struts标签库
17.struts提供了Action接口定义了5个标准字符串常量,不包括的有(C)A SUCCESS
B NONE C REG D LOGIN 18.struts中数据验证失败时,通过(B)标签显示错误信息。A
默认结果类型是dispatcher chain:Action链式处理的结果类型,也就是将结果转发到这个action中。dispatcher:用于整合JSP的结果类型
redirect:实际上dispatcher和redirect的区别就是在于转发和重定向的区别。redirect-action:重定向action
20.简述struts2文件上传的方法。
Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
21.在struts2标签内部 能否使用el表达式?
不可
22.struts2中result-type的chain和redirectAction的区别
chain,它是一个琏式的,是从一个Action转发另外一个Aciton redirectAction,是从新请求一个Action
23.
24.action的name里边写的名字是什么地方用的? From 表单action引用
25.action的class里面写的是什么? Action相应类的详细路径
26.action的extends里面调用的是什么?
从另外一个包继承、相当于拥有即承包的所有配置
27.如果不写action的后面mothod,默认的调用的方法是什么,如果写的话,写的时候有什么需要注意的?
不写会默认调用最上面的方法
28.输出值的strtus标签是什么?
s:property
28.循环的struts标签是什么?
s:iterator
29.判断的strtuts标签是什么?
s:if
30.显示文本的strtuts标签是什么?
31.要调用struts标签需要导入什么? <%@taglib uri=“/struts-tags” prefix=“s”%>
32.如果需要调用sc:datetimepicker需要导入什么,sc代表的是什么意思?
33.
获取前台文本的值
34.请简述前台提交后是如何到达后台action的。
通过from表单action找到struts配置文件相应action的类 再去找相应action类里的方法