2014-10-16 58 views
4

我知道,當HTML表單元素的名稱發生更改時,爲了使正在處理表單的Servlet檢索參數,它必須知道更新的元素名稱。爲了減少必須進行的更改(從2個位置到1個),我在Servlet中創建了一個靜態字段,該字段在檢索參數時在doPost()方法中引用,並且也在JSP中引用,而不是對元素名稱進行硬編碼。任何人都可以想到一個理由,這是一個壞主意,除了使用scriptlet?如果元素的名稱需要改變,我現在只需要在1個地方改變它(Servlet常量)。硬編碼HTML元素名稱

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

_public static ** void ** FOO_FORM_FIRST_NAME_PARAMETER ='fName'_ ???你的意思是'String' – 2014-10-19 21:06:12

+0

是的,我做到了。我只是糾正了它,謝謝 – user1154644 2014-10-19 22:06:19

回答

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

訪問它。如果你不希望使用小腳本還有其他的解決方案,以及。

How to reference constants in EL?

其他解決方案

當我看到它,因爲它會反正是有許多形式和多種輸入更理想的解決方案的大型應用程序是某種形式的結合輸入字段..說的Pojo,這樣servlet就不必跟蹤表單中使用的輸入名稱。這可能會導致使用過濾器捕獲請求參數並保存在某個pojo中,並使其在請求範圍中可用。 或 對於其他Web框架,如Spring mvc,Struts,JSF等。如果您認爲使用這些框架中的任何一個都是過分的,因爲您最終會重寫代碼的重要部分,如果您認爲Struts或者Spring MVC的是沉重的:

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

+0

我理解你的例子,但在這種情況下,設置變量對我來說並不是什麼好事,因爲我只在一個地方引用它,我可以直接使用scriptlet名稱屬性。我的問題更多的與是否有任何理由避免在servlet中使用靜態變量並在jsp中引用它,而不是使用名稱硬編碼對元素名進行硬編碼(這似乎很常見)在JSP中,然後在servlet中有一個常量,但是如果屬性的名稱發生更改,則仍然必須進行2次更新。 – user1154644 2014-10-22 18:51:46

3

如果我理解你的問題正確,您目前正在使用的小腳本如下圖所示,

<input name='<%= Attribute in request %>',這樣就可以在服務器端更改。

這是否是一個壞主意來實現類似的東西?思考?

,並不是與scriptlets的問題,因爲它可以通過ELJSTL。如果你正在在JSP名稱的所有輸入參數是dyanamic更換。您需要將請求傳遞給servlet。

考慮,即使用戶deosn't提交給JSP中的形式,也可以只查看你需要從服務器發送的數據(輸入參數名稱)

因此,所有的請求應當由被截獲該servlet雖然不是必需的。所以它可能會再次造成性能上的開銷。

所以我建議你在servlet攔截URL的頁面中添加你的想法,以防萬一你有很多靜態頁面。

+0

不,名稱實際上並不是請求中的一個屬性,它是對Servlet類中靜態字段的引用。我的問題更多的是尋找一個解決方案,以在兩個地方更改html元素的名稱。 – user1154644 2014-10-22 18:34:21

+0

@ user1154644我想爲常量使用一個通用文件是個好主意,你可以這樣做 – 2014-10-23 05:50:03

2

如果幾個類使用相同的表單,並且在同一表單類型的每個類中有不同的名稱,則可能需要將表單動態綁定到所有這些類。這意味着您可以創建一個動態綁定,在運行時確定實際綁定。但是這個用例在實踐中很少使用,因爲它比靜態綁定更復雜。而且它與你爲你的情況不一樣,你爲字段名創建一個常量,因爲你沒有使用任何的javabean及其屬性來獲取你想要綁定參數的實際字段名。你不喜歡使用與servlet類關聯的字段,但實例化一些bean並填充該屬性。對於這種情況,您可能需要爲bean實例創建一些工廠,並且需要一些常量來構建一個bean。但它似乎遠離你的問題的話題。如果您將這些常量用作映射某些對象的鍵,並且可以使用某種表達式引擎在視圖圖層上重用該鍵,這就是您可以使用該鍵實現的功能。實際值可能會在運行時發生變化,並且會給您一個抽象級別,因爲流程也會動態變化。確保你有正確配置的流量。您應該知道如何使用原始Servlet而不是使生活更簡單的框架來構建複雜功能。

+0

現在我想到了,我想在常量常量文件中使用靜態字段會更有意義,而不一定會綁定到一個特定的servlet。 – user1154644 2014-10-23 04:57:44

+0

無論你喜歡什麼,在早期的時間常量是在接口和類中定義的接口和類,現在你可以使用靜態導入。有時我使用java bean中的getter來從EL中的對象獲取JSP中的值,而不使用靜態訪問。 – 2014-10-23 08:55:52