繁体   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