Struts2 Interview Questions
亲爱的读者们,这些Struts2 Interview Questions专门设计用于让您熟悉Struts2 Programming主题面试中可能遇到的问题的本质。 根据我的经验,优秀的面试官在你的面试中几乎没有计划提出任何特定的问题,通常问题从这个主题的一些基本概念开始,后来他们继续基于进一步的讨论和你回答的问题 -
Struts2是基于MVC设计模式的流行且成熟的Web应用程序框架。 Struts2不仅仅是Struts 1的下一个版本,而且完全重写了Struts架构。
以下是一些可能迫使您考虑Struts2的强大功能 -
POJO forms and POJO actions - Struts2已经废除了Action Forms,它是Struts框架不可或缺的一部分。 使用Struts2,您可以使用任何POJO来接收表单输入。 同样,您现在可以将任何POJO视为Action类。
Tag support - Struts2改进了表单标记,新标记允许开发人员编写更少的代码。
AJAX support --Struts2已经认识到Web2.0技术的接管,并通过创建AJAX标签将AJAX支持集成到产品中,其功能与标准Struts2标签非常相似。
Easy Integration - 通过Struts2提供的各种集成,现在可以更轻松地与Spring,Tiles和SiteMesh等其他框架集成。
Template Support - 支持使用模板生成视图。
Plugin Support - 可以通过使用插件来增强和增强核心Struts2行为。 Struts2有许多插件可供使用。
Struts2中的模型 - 视图 - 控制器模式通过以下五个核心组件实现 -
Actions
Interceptors
价值堆栈/ OGNL
结果/结果类型
查看技术
以下是Struct2应用程序中请求的生命周期 -
用户向服务器发送请求以请求某些资源(即页面)。
FilterDispatcher查看请求,然后确定相应的Action。
配置的拦截器功能适用于验证,文件上传等。
执行所选操作以执行所请求的操作。
同样,如果需要,应用配置的拦截器进行任何后处理。
最后,结果由视图准备并将结果返回给用户。
struts.xml文件包含在开发操作时将要修改的配置信息。 此文件可用于覆盖应用程序的默认设置,例如struts.devMode = false以及属性文件中定义的其他设置。 可以在WEB-INF/classes文件夹下创建此文件。
常量标记以及name和value属性将用于覆盖default.properties中定义的任何以下属性,就像我们设置struts.devMode属性一样。 设置struts.devMode属性允许我们在日志文件中查看更多调试消息。
我们定义动作标签对应于我们想要访问的每个URL,我们使用execute()方法定义一个类,只要我们访问相应的URL就会访问它。
结果确定执行操作后返回浏览器的内容。 从操作返回的字符串应该是结果的名称。 结果按上述操作配置,或作为“全局”结果配置,可用于包中的每个操作。 结果具有可选的名称和类型属性。 默认名称值为“success”。
struts-config.xml配置文件是Web客户端中View和Model组件之间的链接。
这是将ActionForm子类映射到名称的位置。 您可以在struts-config.xml文件的其余部分甚至JSP页面上将此名称用作ActionForm的别名。
此部分将您的webapp上的页面映射到名称。 您可以使用此名称来引用实际页面。 这样可以避免在网页上对网址进行硬编码。
这是您声明表单处理程序的位置,它们也称为操作映射。
本节告诉Struts在哪里可以找到属性文件,其中包含提示和错误消息。
此配置文件提供了一种更改框架的默认行为的机制。 实际上,struts.properties配置文件中包含的所有属性也可以使用init-param在web.xml中配置,以及使用struts.xml配置文件中的constant标记。 但是如果你想把事情分开并且更具特异性,那么你可以在WEB-INF/classes文件夹下创建这个文件。 此文件中配置的值将覆盖default.properties中配置的默认值,该默认值包含在struts2-core-xyzjar分发中。
拦截器在概念上与servlet过滤器或JDKs Proxy类相同。 拦截器允许横切功能与动作和框架分开实现。 您可以使用拦截器实现以下目标 -
在调用操作之前提供预处理逻辑。
在调用操作后提供后处理逻辑。
捕获异常以便可以执行备用处理。
创建自定义拦截器很容易; 需要扩展的接口是Interceptor接口。
将通过invocation.invoke()调用使用拦截器执行实际操作。 因此,您可以根据您的要求进行一些预处理和一些后处理。
框架本身通过首次调用ActionInvocation对象的invoke()来启动该过程。 每次调用invoke()时,ActionInvocation都会查询其状态并执行下一个拦截器。 当调用了所有已配置的拦截器时,invoke()方法将导致执行操作本身。
Action类管理应用程序的状态,Result Type管理视图。
默认结果类型是dispatcher,用于分派到JSP页面。
调度程序结果类型是默认类型,如果未指定其他结果类型,则使用该类型。 它用于转发到服务器上的servlet,JSP,HTML页面等。 它使用RequestDispatcher.forward()方法。
重定向结果类型调用标准的response.sendRedirect()方法,导致浏览器向给定位置创建新请求。 我们可以在元素的主体中提供位置,也可以在元素中提供位置。
值堆栈是一组多个对象,它们按提供的顺序保存以下对象 -
Temporary Objects - 在执行页面期间会创建各种临时对象。 例如,在JSP标记中循环的集合的当前迭代值。
The Model Object - 如果在struts应用程序中使用模型对象,则将当前模型对象放在值堆栈上的操作之前。
The Action Object - 这将是正在执行的当前操作对象。
Named Objects - 这些对象包括#application,#session,#request,#attr和#parameters,并引用相应的servlet范围。
对象图导航语言(OGNL)是一种功能强大的表达式语言,用于引用和操作ValueStack上的数据。 OGNL还有助于数据传输和类型转换。
ActionContext映射包含以下内容 -
application - 应用程序范围变量。
session - 会话范围的变量。
root/value stack - 所有操作变量都存储在此处。
request - 请求范围变量。
parameters - 请求参数。
atributes - 存储在页面,请求,会话和应用程序范围中的属性。
可以通过名为FileUpload拦截器的预定义拦截器在Struts中上传文件,该拦截器可通过org.apache.struts2.interceptor.FileUploadInterceptor类获得,并作为defaultStack的一部分包含在内。
以下是控制文件上载过程的Struts2配置属性 -
struts.multipart.maxSize - 要接受为文件上载的文件的最大大小(以字节为单位)。 默认值为250M。
struts.multipart.parser - 用于上传多部分表单的库。 默认情况下是雅加达。
struts.multipart.saveDir - 存储临时文件的位置。 默认情况下是javax.servlet.context.tempdir。
fileUplaod拦截器使用几个默认的错误消息密钥 -
struts.messages.error.uploading - 无法上载文件时发生的一般错误。
struts.messages.error.file.too.large - 当上载的文件太大而不是maximumSize指定时发生。
struts.messages.error.content.type.not.allowed - 在上载的文件与指定的预期内容类型不匹配时发生。
您可以在WebContent/WEB-INF/classes/messages.properties资源文件中覆盖这些消息的文本。
在Struts的核心,我们有验证框架,可以帮助应用程序在执行操作方法之前运行规则来执行验证。 Action类应该扩展ActionSupport类,以便执行validate方法。
当用户按下提交按钮时,Struts 2将自动执行validate方法,如果方法中列出的任何if语句为true,Struts 2将调用其addFieldError方法。 如果添加了任何错误,Struts 2将不会继续调用execute方法。 而Struts 2框架将作为调用操作的结果返回输入。
因此,当验证失败并且Struts 2返回输入时,Struts 2框架将重新显示视图文件。 由于我们使用了Struts 2表单标记,因此Struts 2会自动在表单字段上方添加错误消息。
这些错误消息是我们在addFieldError方法调用中指定的消息。 addFieldError方法有两个参数。 第一个是应用错误的表单字段名称,第二个是在该表单字段上方显示的错误消息。
第二种进行验证的方法是在操作类旁边放置一个xml文件。 基于Struts2 XML的验证提供了更多的验证选项,如电子邮件验证,整数范围验证,表单验证字段,表达式验证,正则表达式验证,必需的验证,必需字符串验证,stringlength验证等。
xml文件需要命名为'[action-class]' - validation.xml。
以下是Struts2中可用的各种类型的字段级别和非字段级别验证的列表 -
日期验证员
双重验证器
电子邮件验证员
表达验证器
int验证器
正则表达式验证器
必需的验证员
requiredstring验证器
stringlength验证器
网址验证器
国际化(i18n)是规划和实施产品和服务的过程,以便能够轻松地适应特定的当地语言和文化,这一过程称为本地化。 国际化过程有时被称为翻译或本地化支持。
Struts2提供本地化即。 国际化(i18n)通过以下地方的资源包,拦截器和标签库提供支持 -
UI标签。
消息和错误。
在行动类中。
资源文件的最简单命名格式是 -
bundlename_language_country.properties
这里的bundlename可以是ActionClass,Interface,SuperClass,Model,Package,Global resource properties。 下一部分language_country表示国家/地区语言环境,例如西班牙语(西班牙)语言环境由es_ES表示,英语(美国)语言环境由en_US等表示。您可以跳过可选的国家/地区部分。
当您通过其键引用消息元素时,Struts框架按以下顺序搜索相应的消息包 -
ActionClass.properties
Interface.properties
SuperClass.properties
model.properties
package.properties
struts.properties
global.properties
StrutsTypeConverter类通过重写两个方法convertFromString()和convertToString()告诉Struts如何将Environment转换为String,反之亦然。
Struts 2带有三个内置主题 -
simple theme - 一个没有“花里胡哨”的simple theme 。 例如,textfield标记呈现HTML“input /”标记,没有标签,验证,错误报告或任何其他格式或功能。
xhtml theme - 这是Struts 2使用的默认主题,提供了简单主题提供的所有基础知识,并添加了一些功能,如HTML的标准双列表格布局,每个HTML的标签,验证和错误报告等。
css_xhtml theme - 这个主题提供了简单主题提供的所有基础知识,并添加了一些功能,如标准的双列基于CSS的布局,使用“div”作为HTML Struts标签,每个HTML Struts标签的标签,放置根据CSS样式表。
Struts通过使用“异常”拦截器使异常处理变得容易。 “异常”拦截器作为默认堆栈的一部分包含在内,因此您无需执行任何额外的配置。 它开箱即用,随时可供您使用。
@Results注释是结果的集合。 在@Results注释下,我们可以有多个@Result注释。
@Results({
@Result(name = "success", value = "/success.jsp"),
@Result(name = "error", value = "/error.jsp")
})
public class Employee extends ActionSupport{
...
}
@result注释具有与execute方法的结果相对应的名称。 它们还包含一个位置,该位置应该提供与execute()的返回值相对应的视图。
@Result(name = "success", value = "/success.jsp")
public class Employee extends ActionSupport{
...
}
这用于装饰execute()方法。 Action方法还接受一个值,该值是调用操作的URL。
public class Employee extends ActionSupport{
private String name;
private int age;
@Action(value = "/empinfo")
public String execute() {
return SUCCESS;
}
}
@After注释标记了在主操作方法和执行结果之后需要调用的操作方法。 返回值被忽略。
public class Employee extends ActionSupport{
@After
public void isValid() throws ValidationException {
// validate model object, throw exception if failed
}
public String execute() {
// perform secure action
return SUCCESS;
}
}
@Before注释标记需要在主操作方法和结果执行之前调用的操作方法。 返回值被忽略。
public class Employee extends ActionSupport{
@Before
public void isAuthorized() throws AuthenticationException {
// authorize request, throw exception if failed
}
public String execute() {
// perform secure action
return SUCCESS;
}
}
@BeforeResult注释标记需要在结果之前执行的操作方法。 返回值被忽略。
public class Employee extends ActionSupport{
@BeforeResult
public void isValid() throws ValidationException {
// validate model object, throw exception if failed
}
public String execute() {
// perform action
return SUCCESS;
}
}
此验证注释会检查字段是否存在任何转换错误,并在存在时应用它们。
public class Employee extends ActionSupport{
@ConversionErrorFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true)
public String getName() {
return name;
}
}
此验证注释检查日期字段是否具有指定范围内的值。
public class Employee extends ActionSupport{
@DateRangeFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true,
min = "2005/01/01", max = "2005/12/31")
public String getDOB() {
return dob;
}
}
此验证注释检查双字段是否具有指定范围内的值。 如果既没有设置min也没有设置max,则不会执行任何操作。
public class Employee extends ActionSupport{
@DoubleRangeFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true,
minInclusive = "0.123", maxInclusive = "99.987")
public String getIncome() {
return income;
}
}
如果字段包含非空字符串,则此验证注释会检查字段是否为有效的电子邮件地址。
public class Employee extends ActionSupport{
@EmailValidator(message = "Default message",
key = "i18n.key", shortCircuit = true)
public String getEmail() {
return email;
}
}
此非字段级验证器验证提供的正则表达式。
@ExpressionValidator(message = "Default message", key = "i18n.key",
shortCircuit = true, expression = "an OGNL expression" )
此验证注释检查数字字段是否具有指定范围内的值。 如果既没有设置min也没有设置max,则不会执行任何操作。
public class Employee extends ActionSupport{
@IntRangeFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true,
min = "0", max = "42")
public String getAge() {
return age;
}
}
此批注使用正则表达式验证字符串字段。
@RegexFieldValidator( key = "regex.field", expression = "yourregexp")
此验证注释检查字段是否为空。 必须在方法级别应用注释。
public class Employee extends ActionSupport{
@RequiredFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true)
public String getAge() {
return age;
}
}
此验证注释检查String字段不为空(即长度> 0的非null)。
public class Employee extends ActionSupport{
@RequiredStringValidator(message = "Default message",
key = "i18n.key", shortCircuit = true, trim = true)
public String getName() {
return name;
}
}
此验证器检查String字段的长度是否合适。 它假定该字段是一个字符串。 如果既未设置minLength也未设置maxLength,则不执行任何操作。
public class Employee extends ActionSupport{
@StringLengthFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true,
trim = true, minLength = "5", maxLength = "12")
public String getName() {
return name;
}
}
此验证程序检查字段是否为有效URL。
public class Employee extends ActionSupport{
@UrlValidator(message = "Default message",
key = "i18n.key", shortCircuit = true)
public String getURL() {
return url;
}
}
如果要使用相同类型的多个注释,则这些注释必须嵌套在@Validations()注释中。
public class Employee extends ActionSupport{
@Validations(
requiredFields =
{@RequiredFieldValidator(type = ValidatorType.SIMPLE,
fieldName = "customfield",
message = "You must enter a value for field.")},
requiredStrings =
{@RequiredStringValidator(type = ValidatorType.SIMPLE,
fieldName = "stringisrequired",
message = "You must enter a value for string.")}
)
public String getName() {
return name;
}
}
此批注可用于自定义验证器。 使用ValidationParameter批注提供其他参数。
@CustomValidator(type ="customValidatorName", fieldName = "myField")
这是类型级别的类型转换的标记注释。 必须在类型级别应用转换注释。
@Conversion()
public class ConversionAction implements Action {
}
此批注为类型转换设置CreateIfNull。 必须在字段或方法级别应用CreateIfNull注释。
@CreateIfNull( value = true )
private List<User> users;
此注释设置元素以进行类型转换。 元素注释必须在字段或方法级别应用。
@Element( value = com.acme.User )
private List<User> userList;
此注释设置类型转换的键。 必须在字段或方法级别应用密钥注释。
@Key( value = java.lang.Long.class )
private Map<Long, User> userMap;
此批注为类型转换设置KeyProperty。 KeyProperty注释必须在字段或方法级别应用。
@KeyProperty( value = "userName" )
protected List<User> users = null;
此批注注释用于类和应用程序范围的转换规则。 TypeConversion注释可以在属性和方法级别应用。
@TypeConversion(rule = ConversionRule.COLLECTION,
converter = "java.util.String")
public void setUsers( List users ) {
this.users = users;
}
接下来是什么 (What is Next?)
此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。