最佳实践?在 Struts2 中,我应该将自己的应用程序的配置参数放在哪里?

Posted

技术标签:

【中文标题】最佳实践?在 Struts2 中,我应该将自己的应用程序的配置参数放在哪里?【英文标题】:Best Practice? Where do I put configuration parameters for my own application in Struts2? 【发布时间】:2011-11-09 08:48:46 【问题描述】:

在 Java servlet 中,有<context-param>。在桌面应用程序中,我们通常会定义自己的配置文件。

我应该将我的 Struts2 应用程序的配置参数放在哪里?例如,我的应用程序需要设置用户输入的时间限制,或者保存和读取存储在某处的文件,或者用户输入错误密码的最长时间等。我希望这些东西是可配置的。

人们通常在 Struts2 应用程序中使用什么方式?有什么最佳做法吗?

【问题讨论】:

您可以在 web.xml 中使用<context-param> 方法。 @Steven 如何从我的 struts2 应用程序中检索它?使用 Struts2 Actions 可以调用的专用于常量处理的 servlet?人们是这样做的吗? 我将评论扩展为答案。 【参考方案1】:

如果您熟悉您提到的ServletContext 方法,您可以坚持下去。在您的web.xml 中,添加您的<context-param>s。

然后,要在您的操作中获取ServletContext,只需实现ServletContextAware,它将自动为您注入。

这是一个简短的例子:

web.xml

<context-param>
  <param-name>someSetting</param-name>
  <param-value>someValue</param-value>
</context-param>

你的行动

public class YourAction extends ActionSupport implements ServletContextAware 
  private ServletContext servletContext;

  @Override
  public String execute() throws Exception 
    String someValue = (String) servletContext.getAttribute("someSetting");

    return SUCCESS;
  

  @Override
  public void setServletContext(final ServletContext context) 
    this.servletContext = servletContext;
  

【讨论】:

感谢您的回复。这就是我想要的答案。并感谢您纠正我的错字。该死的,我没注意到。 哈哈!没问题。很高兴这对您有所帮助。【参考方案2】:

请看这里:Apache Struts 2 Documentation - Handling File Uploads 或:Apache Struts 2 Documentation - File Upload

可以通过将 struts.properties 文件放入 WEB-INF/classes 来设置属性。在属性文件中找到的任何属性都将覆盖默认值。

struts.multipart.parser - 此属性应设置为扩展 MultiPartRequest 的类。目前,该框架随 Jakarta FileUpload 实现一起提供。 struts.multipart.saveDir - 上传文件的存放目录。如果未设置此属性,则默认为 javax.servlet.context.tempdir。 struts.multipart.maxSize - 允许上传的最大文件大小(以字节为单位)。这有助于防止有人上传大量大文件而滥用系统。默认值为 2 MB,可以设置为 2 GB(如果您想编辑 Pell 多部分源,则更高,但如果您需要上传大于 2 GB 的文件,您真的需要重新考虑!)如果您要上传更多maxSize 适用于合并的总数,而不是单个文件的大小。

如果您对默认值感到满意,则无需将任何属性放在 struts.prop 中

我通常将所有这些设置放在我的 struts.properties 文件中,该文件位于默认包中。如果您使用这种类型的配置,也可以在 struts.xml 文件中设置它们。

Google 搜索显示了大量使用“Struts2 文件上传”作为搜索参数的 struts 2 文件处理示例。

【讨论】:

您阅读我的问题了吗?我不是在问文件处理! “例如,我的应用程序需要保存和读取存储在某处的文件” - 这让我相信您正在谈论文件处理以及在哪里配置这些设置。无论如何,这样的设置通常在 struts.properties 文件或 struts.xml 文件中处理,除此之外,您可以像使用 web.xml 或以编程方式配置任何其他应用程序一样。 对不起。那将是我的错。如果你现在明白了,你能再回答我的问题吗?谢谢。 有很多 struts2 设置可以被覆盖或在 struts.properties 中设置。我通常使用这个:struts.apache.org/2.0.11/docs/strutsproperties.html 作为我的项目的基础,并注释掉我不需要的东西。没有通过标准 API 提供的东西,我通常会编写自己的东西来处理这种情况。 我并不是要覆盖 struts2 设置。我的意思是我应该在哪里保存我自己的设置以供我自己的操作使用。人们通常是怎么做的?【参考方案3】:

我使用了一个配置 xml 文档,该文档加载到一个实现 javax.servlet.ServletContextListener 类的类中。从那里我将属性设置为 servletContext:

public void contextInitialized(ServletContextEvent contextEvent) 
    try

        Document xmlDocument = readConfigFile(contextEvent.getServletContext().getRealPath("") + fileSeperator + AppConfigConstants.XML_CONFIG_LOCATION);

        contextEvent.getServletContext().setAttribute(AppConfigConstants.RECORDS_PAGE_NODE_NAME,this.getValueFromConfig(AppConfigConstants.RECORDS_PAGE_NODE_NAME,xmlDocument));

...


然后在我的 struts 基本动作类中,我有从 servlet 上下文获取属性的方法。

protected Integer getRecordsPage()
    Integer recordsPage = Integer.valueOf("0");

    if(this.getServlet().getServletContext().getAttribute(AppConfigConstants.RECORDS_PAGE_NODE_NAME)!= null)
        recordsPage = Integer.valueOf(this.getServlet().getServletContext().getAttribute(AppConfigConstants.RECORDS_PAGE_NODE_NAME).toString());
    

    return recordsPage;


【讨论】:

以上是关于最佳实践?在 Struts2 中,我应该将自己的应用程序的配置参数放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Web开发最佳实践-Struts2之三拦截器(Interceptor)

如何组织导航栏下方的“标签”?最佳实践?

是否有将 API 密钥和秘密保存到数据库中的最佳实践?

Android 包结构最佳实践 [关闭]

Heroku 最佳实践时钟与 node.js

最佳实践:我应该将价格和成本存储为 NULL 还是 NOT NULL?