我知道当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>
答案 0 :(得分:3)
如果我正确理解了您的问题,那么您目前正在使用如下的脚本
<input name='<%= Attribute in request %>'
,以便您可以在服务器端更改它。
实现类似的东西会不是一个坏主意?想法?
这不是scriptlets
的问题,因为它可以通过EL
或JSTL
替换。如果你使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很重:
答案 2 :(得分:2)
如果几个类使用相同的表单,并且在同一表单类型的每个类中有不同的名称,则可能需要将表单动态绑定到所有这些类。这意味着您可以创建动态绑定,其中在运行时确定实际绑定。但是这个用例在实践中很少使用,因为它比静态绑定更复杂。并且它与您为字段名创建常量的情况不同,因为您没有使用任何javabean及其属性来获取要与参数绑定的实际字段名称。而且您不想使用与servlet类关联的字段,而是实例化一些bean并填充该属性。对于这种情况,您可能希望为bean实例化创建一些工厂,并且需要一些常量来构建bean。但它似乎远离你的问题的主题。如果您使用这些常量作为键来映射某些对象,并且可以使用某些表达引擎在视图层上重用该键,这是使用该键可以实现的。实际值可能会在运行时更改,它会为您提供抽象级别,因为流也会动态更改。确保您具有正确配置的流。您应该知道使用原始servlet而不是使生活更轻松的框架来构建复杂功能是多么困难。