如何将 HTML 元素名称映射到 servlet?

问题描述 投票:0回答:3

我知道,当 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>
html jsp servlets servlet-mapping
3个回答
3
投票

如果我正确理解您的问题,您当前正在使用如下所示的脚本,

<input name='<%= Attribute in request %>'
,这样你就可以在服务器端更改它。

实施这样的事情是不是一个坏主意?想法?

不是

scriptlets
的问题,可以通过
EL
或者
JSTL
来替换。如果你把jsp name中的所有输入参数都设置为动态的。您需要将请求传递给 servlet。

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

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

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


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}" />

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

如何在EL中引用常量?

其他解决方案

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

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


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.