服务器端不会从h保留换行符:inputTextarea

时间:2017-07-05 07:04:36

标签: jsf xhtml

我有一个使用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>

result.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);
    }
}

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

  

ABC
  ABC

result.xhtml的文本区域为&#34; abcabc&#34;,输出文本的评估结果为false。将表单提交到服务器时,换行符似乎会丢失,可以使用控制器中的containsNewLine布尔值来查看。

我已经阅读过很多帖子,说明为什么在文本来自服务器端时,网页浏览器上没有显示换行符,但我的情况则相反,由于某种原因,新行未从Textarea到支持bean。

我尝试了什么

我试过了:

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

在CSS中:

.termineesTextInput { white-space: pre; }

我正在使用的技术

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

如何获取转移到支持属性的换行符?

1 个答案:

答案 0 :(得分:0)

@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