【问题标题】:Newline characters are not preserved on server side from h:inputTextarea换行符不会从 h:inputTextarea 保留在服务器端
【发布时间】:2017-07-05 07:04:36
【问题描述】:

我有一个使用 JSF h:inputTextarea 的表单,如下所示:

index.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head></h:head>
    <h:body>
        <div id="ContentFrame">

            <h:form enctype="multipart/form-data">

                <h:inputTextarea
                    id="termineesText"
                    value="#{controller.text}"/>

                <h:commandButton
                    value="Upload and Continue" 
                    type = "submit"
                    action="#{controller.respond}"/>

            </h:form>
        </div>
    </h:body>
</html>

结果.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head></h:head>
    <h:body>
        <div id="ContentFrame">

            <h:form enctype="multipart/form-data">

                <h:inputTextarea
                    id="termineesText"
                    value="#{controller.text}"/>

                <h:outputText value="#{controller.containsNewline}"/>

            </h:form>
        </div>
    </h:body>
</html>

使用这个支持 bean:

controller.java:

package main;

import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named("controller")
@SessionScoped
public class Controller implements Serializable {
    private static final long serialVersionUID = 1L;
    private String text;
    private boolean containsNewline = false;

    public String respond() {
        return "result.xhtml";
    }

    public void setText(String value) {
        if (value.contains("\n") || value.contains("\r")) {
            containsNewline = true;
        }
        text = value;
    }
    public String getText() {return text;}
    public String getContainsNewline()
    {
        return String.valueOf(containsNewline);
    }
}

当用户输入多行文本(按回车键)并提交表单时,result.xhtml 的文本区域中的换行符会消失。例如,如果用户输入:

abc
abc

result.xhtml 的文本区域为“abcabc”,输出文本计算为false。当表单提交到服务器时,换行符似乎会丢失,这可以使用控制器中的 containsNewLine 布尔值来查看。

我已经阅读了很多关于为什么当文本来自服务器端时 Web 浏览器上没有显示换行符的帖子,但我的情况是相反的,由于某种原因,新行没有从 Textarea 转移到支持 bean。

我尝试过的

我试过了:

<pre><h:inputTextarea id="termineesText" styleClass="termineesTextInput" onchange="enableDisableSubmitBtn()" value="#{controller.termineesText}"/></pre>

在 CSS 中:

.termineesTextInput { white-space: pre; }

我正在使用的技术

JSF 2.2 和 CDI 1.2 在 Websphere Application Server 上运行,我使用 Chrome 隐身窗口完成了大部分测试。

如何让换行符转移到支持属性?

【问题讨论】:

  • 英语以具有多种含义的单词和表达而闻名,因此我认为大写字母可能会被解释为挫败感。不需要反对票。从来没有...编辑过。
  • Downvote 不是我的...但是谢谢...将删除我的评论。但是这个问题不是 java-se(你不能只在一个带有 main 的 pojo 中重现它),它不是 java-ee(一个很少使用的标签和广泛的方式)虽然是的,jsf 是其中的一部分。它与 CSS 无关。 CSS 在从输入向服务器提交数据时不发挥任何作用。添加不相关或广泛的标签主要会吸引不相关的 cmets/建议/答案。这就是我删除它们(并再次删除它们)的原因......干杯。
  • 你能试试当你删除'multipart/form-data'和显式类型属性时会发生什么吗?
  • 好的,谢谢,删除 'enctype' 属性会在表单提交时产生 Servlet 错误,不确定“显式类型属性”是什么意思?
  • 如果您仅使用此表单时出现提交错误,则您遇到了一些在此代码中不可见的完全不同的问题。您确定这是该页面的最小版本吗?对于显式类型,我的意思是type="post"...

标签: jsf xhtml


【解决方案1】:

@Kukeltje 指出的问题是我使用了enctype="multipart/form-data"。由于某种原因,当表单提交到服务器时,这会导致换行符丢失。如果您能够删除该编码并使用正常的enctype="application/x-www-form-urlencoded",那么这将为您解决问题。希望这对某人有所帮助。

对我来说,删除这不是一个选项,因为我在我的表单上使用文件上传控件,这需要使用 multipart/form-data。为了解决这个问题,我提出了一个新问题: Newline characters lost when using enctype="multipart/form-data" in html form

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2018-09-04
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多