簡體   English   中英

Struts2:基於下拉值自動填充字段,而無需JavaScript

[英]Struts2: Autopopulating fields based on a dropdown value without JavaScript

我嘗試搜索該站點,但找不到我的問題的答案。

我正在開發Java Struts2 Web應用程序。 jsp頁面上有3個表單字段,如下所示:(正在使用Struts2標簽)

<s:form action="action1">

other fields
......
<s:select name="test1" list="{'A','B','C'}"></s:select>
<s:textfield name="test2"></s:textfield>
<s:textfield name="test3"></s:textfield>
.....
other fields
<s:submit value="submit1"><s/submit>
</s:form>

當在test1字段中選擇一個值時,將需要根據test1中選擇的值從數據庫中填充test2和test3。

根據我需要實現的過程,我需要基於jsp1(上面顯示)的輸入進行一些計算,並將結果顯示在jsp2上,該內容必須與jsp1完全不同。 我的問題僅限於jsp1中的數據輸入。

沒有JavaScript,這樣做的最佳方法是什么? 假設在訪問應用程序的瀏覽器中禁用了javascript。

謝謝,

編輯

似乎這里有些混亂,讓我們嘗試澄清一下:

從瀏覽器觸發與服務器的通信基本上有三種方法:

  1. 提交HTML
  2. 提交JS
  3. AJAX提交

可能會可能不會在乎為禁用JavaScript的用戶提供支持;

  • 如果您不在乎,則可以按照自己的意願進行;
  • 如果您確實在乎,那么您將面臨兩種方式:
    • 制作頁面的唯一版本,無論是否使用JS都可以使用該頁面(通過使用選項“ 1”,“提交HTML”);
    • 使頁面以兩種可能的方式工作,相互排斥:在處理頁面時,您會檢測用戶是否啟用了javascript:如果是,則使用JS(提交或AJAX),如果否,則退回到非JS解決方案( “提交HTML”)。

這兩種解決方案都可以使用JS,也可以不使用JS,但后者通常是首選,因為您可以使用JavaScript以及最終使用AJAX為99%的用戶設置一個美觀,美觀的用戶體驗型WebApp。一個針對1%的用戶的后備解決方案,即使該網站不能像JS版本那樣好,即使它不具有JS版本的所有功能,它仍然可以使用,並且核心功能將可用。

正如我在上面的評論中所說,WebApp的后備版本不需要像JS版本一樣好,一樣快,在用戶體驗方面一樣好:它應該...可以工作。

例如,此JSP在這兩種情況下都可以工作:如果啟用了JS,則從Select中選擇一個元素后,它將執行JavaScript提交;如果禁用了JS,它將在按Submit按鈕后執行提交。

在禁用JS的情況下,onchange將被忽略並進行<noscript>處理。
啟用JS后,將處理onchange並忽略<noscript>

<s:form action="myAction">
    <s:select    onchange="javascript:document.forms[0].submit();" 
                 name="test1" value="test1" list="{'A','B','C'}"  />
    <s:textfield name="test2" value="test2" />

    <noscript>
        <span>
            Since you have JS disabled, 
            you need to manually press to the GO button, 
            but you still can make it work ;)
        </span>
        <s:submit    value="go" />
    </noscript>

</s:form>

在你的行動中

public class MyAction extends ActionSupport{

    private String test1="";
    private String test2;
    /* Getters and Setters */       

    public String execute(){
        if (test1.length()>0)
            assignValues();
        return SUCCESS;
    }

    private void assignValues(){
        if (test1.equals("A")){
            test2 = "A was chosen, do something";
        } else if (test1.equals("B")){
            test2 = "B was chosen, do something else";
        } else if (test1.equals("C")){
            test2 = "C was chosen, what's next?";
        }
    }
}

您在評論中表達的其他疑問表明您可能需要退后一會並閱讀一些Struts2教程,以確保從框架中獲得最大收益。

如果您不想影響同一表單中的其他字段,只需在Action(使用Getter和Setter)中聲明一個變量,即可針對每個變量進行聲明:它們將保留在重新加載的頁面中,因為它們將與提交一起發送(因為它們采用表單形式),所以它們將通過Setter注入,它們將通過Getter讀回,並通過與它們的名稱和Action變量的匹配注入到新頁面中。

否則,您可以使用AJAX,但是我將從這里開始。

不,您不能嵌套表格。

感謝Andrea Ligios ,我對我的問題有以下解決方案。

jsp1更改如下

<s:form action="action2">

other fields
......
<s:select name="test1" list="{'Select','A','B','C'}" 
    onchange="javascript:document.forms[0].submit();"></s:select>
<noscript><s:submit value="populate test2 and test3"></s:submit></noscript>
<s:textfield name="test2"></s:textfield>
<s:textfield name="test3"></s:textfield>
.....
other fields
<s:submit value="submit1" action="action1"><s/submit>
</s:form>

struts.xml具有以下映射

.....
<action name="action2" class="MyAction" method="populate">
    <result name="success">/jsp1.jsp</result>
</action>
<action name="action1" class="MyAction">
    <result name="success">/jsp2.jsp</result>
</action>
.....

MyAction具有以下代碼

public class MyAction extends ActionSupport{

    //all field declarations

    //Getters and Setters

    public String execute(){

    //do processing for jsp2 based on values from jsp1

    return SUCCESS;
    }

    public String populate(){

    //populate test2 and test3 from database based on value of test1

    return SUCCESS;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM