我知道,当 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>
如果我正确理解您的问题,您当前正在使用如下所示的脚本,
<input name='<%= Attribute in request %>'
,这样你就可以在服务器端更改它。
实施这样的事情是不是一个坏主意?想法?
不是
scriptlets
的问题,可以通过EL
或者JSTL
来替换。如果你把jsp name中的所有输入参数都设置为动态的。您需要将请求传递给 servlet。
考虑即使用户没有将表单提交到 jsp ,可能只是查看您需要从服务器发送的数据(对于输入参数名称)
因此您的所有请求都应该被 servlet 拦截,尽管这不是必需的。因此,它可能会再次造成性能开销。
所以我建议你在 servlet 拦截 URL 的页面中添加你的想法,以防你有很多静态页面。
按照您的解决方案:
设置变量,然后使用 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,还有其他解决方案。
其他解决方案
正如我所见,因为它无论如何都是一个具有多种表单和多个输入的大型应用程序,更理想的解决方案是将输入字段绑定到某种形式..比如说Pojo,这样servlet就不必跟踪输入名称形式中使用。这可能会导致使用过滤器来捕获请求参数并保存在一些 pojo 中并使其在请求范围内可用。 或者 对于其他 Web 框架,如 Spring mvc、Struts、JSF 等。如果您认为使用这些框架中的任何一个都是大材小用,因为您最终会重写大部分代码,如果您认为 Struts 或 Spring,您可以尝试以下框架MVC 很重:
如果多个类使用相同的表单,并且在相同表单类型的每个类中具有不同的名称,那么您可能需要将表单动态绑定到所有这些类。这意味着您可以创建动态绑定,其中实际绑定在运行时确定。但这个用例在实践中很少使用,因为它比静态绑定更复杂。这与您为字段名称创建常量的情况不同,因为您没有使用任何 javabean 及其属性来获取要与参数绑定的实际字段名称。您不喜欢使用与 servlet 类关联的字段,而是实例化一些 bean 并填充该属性。对于这种情况,您可能想要创建一些工厂来实例化 bean,并且需要一些常量来构建 bean。但好像离你问题的主题很远。如果您使用这些常量作为映射某些对象的键,并且可以使用某些表达式引擎在视图层上重用该键,那么您就可以使用该键来实现。实际值可能会在运行时发生变化,并且它为您提供了一定程度的抽象,因为流程也会动态变化。确保您的流程配置正确。您应该知道使用原始 servlet 而不是使用使生活更轻松的框架来构建复杂的功能是多么困难。