目录

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?)

此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。

↑回到顶部↑
WIKI教程 @2018