硬编码HTML元素名称

4
我知道当HTML表单元素的名称更改时,为了使处理该表单的Servlet能够检索参数,它必须知道更新后的元素名称。为了减少所需进行的更改量(从2个位置到1个位置),我在Servlet中创建了一个静态字段,在doPost()方法中引用该字段以在检索参数时获取值,并在JSP中使用,而不是硬编码元素名称。除了使用脚本之外,还有人认为这种做法有什么不好的地方吗?如果需要更改元素名称,现在我只需要在一个位置(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>

公共静态 void FOO_FORM_FIRST_NAME_PARAMETER = 'fName'_ ??? 你肯定是指 String - Aleks G
是的,我做了。我刚刚纠正了它,谢谢。 - user1154644
3个回答

3
如果我理解您的问题正确,您当前正在使用以下类似的脚本:

<input name='<%= Attribute in request %>',以便您可以在服务器端更改它。

实现类似这样的东西会不会是个坏主意?想法是什么?

问题并不在于 scriptlets,因为它可以被 ELJSTL 替代。如果您要使 JSP 名称中的所有输入参数都是动态的,则需要将请求传递给 servlet。

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

所以您需要拦截所有请求到servlet,尽管这不是必需的。因此,它可能会再次创建性能开销。

因此,如果您有许多静态页面,请将您的想法添加到 URL 被 servlet 拦截的页面中。


不,名称实际上不是请求中的属性,它是Servlet类中静态字段的引用。我的问题更多地是寻找一个解决方案,以便在两个位置更改HTML元素的名称。 - user1154644
@user1154644 我想使用一个通用文件来存储常量是个好主意,你可以这么做。 - Santhosh

2
根据您的解决方案:
使用jstl和基本脚本,设置一个变量并在代码中的任何位置使用它。
<%@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}" />

如果您不想使用脚本片段,也有其他解决方案。 如何在EL中引用常量? 其他解决方案
我认为,由于它将是一个带有许多表单和多个输入的大型应用程序,更理想的解决方案是将输入字段绑定到某种Pojo,这样servlet就不必跟踪表单中使用的输入名称。这可能会导致使用过滤器捕获请求参数并保存在某个pojo中,并使其在请求范围内可用。 或者使用其他Web框架,如Spring MVC、Struts、JSF等。如果您认为使用这些框架是一种过度设计,因为您最终会重写重要部分的代码,那么您可以尝试以下方法,如果您认为Struts或Spring MVC太重:

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


我理解你的例子,但在这种情况下,我认为设置变量并没有什么好处,因为我只在一个地方引用它,我可以直接在name属性中使用脚本。我的问题更多是关于是否有任何好的理由避免在servlet中使用静态变量并在jsp中引用它,而不是硬编码元素名称,这似乎是相当普遍的,将名称硬编码在JSP中,然后在servlet中有一个常量,但如果属性名称更改,则仍然需要进行2次更新。 - user1154644

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

现在我想想,把那个静态字段放在一个通用的常量文件中可能更有意义,而不是绑定到特定的servlet。 - user1154644
无论你喜欢什么,在早期时间常量是在接口中定义的,而类实现了这些接口,现在你可以使用静态导入。有时我会在Java Bean中使用getter来从对象中获取值,在EL中使用它们而不是使用静态访问。 - Roman C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接