【问题标题】:Hard-coding HTML element names硬编码 HTML 元素名称
【发布时间】:2014-12-12 04:01:52
【问题描述】:

我知道当 HTML 表单元素的名称发生变化时,为了让处理表单的 Servlet 检索参数,它必须知道更新后的元素名称。在尝试减少必须进行的更改量(从 2 个位置减少到 1 个位置)时,我在 Servlet 中创建了一个静态字段,该字段在检索参数时在 doPost() 方法中引用,并且还在JSP,而不是硬编码元素名称。除了使用 scriptlet 之外,谁能想到这将是一个坏主意的原因?如果元素的名称需要更改,我现在只需更改 1 个位置(Servlet 常量)。

Servlet 代码:

package com.example.servlets;

public class ServletDemo extends HttpServlet {
    public static final String FIRST_NAME_FIELD = "firstName"; 

    public void doPost(HttpServletRequest request, HttpServletResponse response){
        String firstName = request.getParameter(FIRST_NAME_FIELD);
        //do something with the first name
    }
}

JSP:

<%@ page import="com.example.servlets.ServletDemo" %>
<html>
  <head>
    <title>Example Page</title>
  </head>
  <body>
    <form method="POST">
      <h3>FirstName:</h3>
      <input name="<%=ServletDemo.FIRST_NAME_FIELD%>"/>
      <input type="submit" value="Submit"/>
    </form>
  </body>
</html>

【问题讨论】:

  • public static void FOO_FORM_FIRST_NAME_PARAMETER = 'fName' ???当然你的意思是String
  • 是的,我做到了。我刚刚更正了,谢谢

标签: html jsp servlets


【解决方案1】:

如果我正确理解了您的问题,您目前正在使用如下脚本,

&lt;input name='&lt;%= Attribute in request %&gt;',以便在服务器端更改。

实施这样的事情会是个坏主意吗?想法?

这不是scriptlets的问题,因为它可以通过ELJSTL替换。如果您将jsp名称中的所有输入参数设置为动态。您需要将请求传递给 servlet。

考虑即使用户没有将表单提交到 jsp ,可能只是查看您需要从服务器发送数据(用于输入参数名称)

所以你的所有请求都应该被 servlet 拦截,尽管它不是必需的。所以它可能会再次造成性能开销。

所以我建议你在 URL 被 servlet 拦截的页面中添加你的想法,以防你有很多静态页面。

【讨论】:

  • 不,名称实际上不是请求中的属性,它是对 Servlet 类中的静态字段的引用。我的问题更多的是寻找一种解决方案,以便在 2 个地方更改 html 元素的名称。
  • @user1154644 我想为常量使用通用文件是个好主意,你可以这样做
【解决方案2】:

按照您的解决方案进行:

设置一个变量,然后使用 jstl 和基本 scriptlet 在代码中的任何位置使用它。

<%@page import="com.foo.Constant"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="FOO_NAME" value="<%=Constant.FOO_FORM_FIRST_NAME_PARAMETER %>"/>

通过EL访问

<input name ="${FOO_NAME}" />

如果您不想使用小脚本,还有其他解决方案。

How to reference constants in EL?

其他解决方案

正如我所看到的,因为它无论如何都会是一个具有许多表单和多个输入的大型应用程序,更理想的解决方案是将输入字段绑定到某种形式。比如说 Pojo,这样 servlet 就不必跟踪表单中使用的输入名称。这可能会导致使用过滤器来捕获请求参数并保存在一些 pojo 中并使其在请求范围内可用。 要么 对于其他 Web 框架,如 Spring mvc、Struts、JSF 等。如果您认为使用这些框架中的任何一个都是矫枉过正的,因为您最终会重写代码的重要部分,如果您认为 Struts 或 Spring,您可以试一试MVC 很重:

https://code.google.com/p/microservlet/

【讨论】:

  • 我理解你的例子,但在这种情况下,我认为设置变量对我没有任何好处,因为我只在一个地方引用它,我可以直接使用 scriptlet在名称属性中。我的问题更多地与是否有充分的理由避免在 servlet 中使用静态变量并在 jsp 中引用它,而不是硬编码元素名称,这似乎很常见,名称硬编码在 JSP 中,然后在 servlet 中有一个常量,但是如果属性名称发生更改,您仍然需要进行 2 次更新。
【解决方案3】:

如果多个类使用相同的表单,并且您在相同表单类型的每个类中具有不同的名称,那么您可能需要将表单动态绑定到所有这些类。这意味着您可以创建一个动态绑定,其中实际绑定是在运行时确定的。但是这个用例在实践中很少使用,因为它比静态绑定更复杂。这与您为字段名称创建常量的情况不同,因为您没有使用任何 javabean 及其属性来获取要与参数绑定的实际字段名称。而且您不喜欢使用与 servlet 类关联的字段,而是实例化一些 bean 并填充该属性。对于这种情况,您可能希望为 bean 实例化创建一些工厂,并且您需要一些常量来构建 bean。但这似乎与您的问题主题相去甚远。如果您将这些常量用作映射某些对象的键,并且可以使用某些表达式引擎在视图层上重用该键,那么您可以使用该键实现。实际值可能会在运行时发生变化,它为您提供了一定程度的抽象,因为流程也会动态变化。确保您拥有正确配置的流程。您应该知道使用原始 servlet 而不是使生活更轻松的框架来构建复杂功能是多么困难。

【讨论】:

  • 现在我想了想,我想将静态字段放在通用常量文件中会更有意义,而不必绑定到特定的 servlet。
  • 不管你喜欢什么,在早期,常量是在接口中定义的,而类实现了这些接口,现在你可以使用静态导入。有时我在 java bean 中使用 getter 从 EL 中的对象获取 JSP 中的值以不使用静态访问。
猜你喜欢
  • 2010-09-24
  • 2012-06-27
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2015-06-13
相关资源
最近更新 更多