2

我尝试搜索该网站,但找不到我的问题的答案。

我正在开发一个 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。

谢谢,

4

2 回答 2

1

编辑

好像这里有点混乱,我们试着说清楚:

从浏览器触发与服务器的通信基本上有三种方式:

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

可能关心也可能不关心为禁用 JavaScript 浏览的用户提供支持;

  • 如果您不关心,那么您可以按照自己的意愿进行;
  • 如果您确实关心,那么您面前有两种方法:
    • 制作页面的独特版本,无论是否使用 JS(使用选项“1”、“提交 HTML”);
    • 使页面以两种可能的方式工作,互斥:在处理页面时,您检测用户是否启用了 javascript:如果是,则使用 JS(提交或 AJAX),如果不是,则回退到非 JS 解决方案( “提交 HTML”)。

这两种解决方案都可以使用和不使用 JS,但通常首选后者,因为您可以通过使用 JavaScript 并最终使用 AJAX 为 99% 的用户设置一个漂亮、美观、面向用户体验的 WebApp,并创建为 1% 的用户提供的后备解决方案,即使网站不像 JS 版本那样好,即使它没有 JS 版本的所有功能,它仍然可以使用,并且核心功能将可用。

正如我在上面的评论中所说,WebApp 的后备版本不需要像 JS 版本一样好、一样快、一样好用户体验:它应该简单地......工作。

例如,这个 JSP 在两种情况下都可以工作:如果启用 JS,它将在从 Select 中选择一个元素后执行 JavaScript 提交;如果 JS 禁用,它将在按下提交按钮后执行提交。

禁用 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 教程,以确保从框架中获得最大收益。

如果您不想影响同一表单中的其他字段,只需在操作中声明一个变量(使用 Getter 和 Setter),为它们中的每一个:它们将保留在重新加载的页面中,因为它们将与提交一起发送(因为它们在表单中),它们将通过 Setter 注入,它们将通过 Getter 读回并通过匹配它们的名称和 Action 变量注入新页面。

否则你可以使用 AJAX,但我会从这里开始。

不,你不能嵌套表格。

于 2013-07-03T10:13:42.313 回答
0

Thanks to Andrea Ligios, i have the below solution to my issue.

jsp1 was changed as below

<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 has following mappings

.....
<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 has following code

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;
    }
}
于 2013-07-03T19:56:32.287 回答