硬编码HTML元素名称

时间:2014-10-16 17:21:25

标签: html jsp servlets

我知道当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>

3 个答案:

答案 0 :(得分:3)

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

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

  

实现类似的东西会不是一个坏主意?想法?

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

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

因此,所有请求都应该被servlet截获,尽管不是必需的。因此,它可能会再次在性能上产生开销。

因此,如果您有许多静态页面,我建议您在servlet拦截URL的页面中添加您的想法。

答案 1 :(得分:2)

通过您的解决方案:

设置变量,然后使用jstl和basic 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}" />

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

How to reference constants in EL?

其他解决方案

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

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

答案 2 :(得分:2)

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