以下测试用例说明了我的问题。我有一个JSF应用程序,它使用HTML表单,我必须使用enctype =“multipart / form-data”,因为我正在使用文件上传see here。但是,当我使用此编码时,输入到我的Textarea中的换行符在提交给服务器时会消失。
result.xhtml中的文本区域始终显示用户在index.xhtml上输入的所有文本,无论用户输入的是什么换行符。输出文本总是计算为“False”以反映支持property永远不会收到带有“\ n”或“\ r”的任何文本。
的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:body>
<h:form enctype="multipart/form-data">
<h:inputTextarea value="#{controller.text}"/>
<h:inputFile value="#{controller.file}"/>
<h:commandButton value="Upload and Continue" type = "submit" action="#{controller.respond}"/>
</h:form>
</h:body>
</html>
Controller.java
package main;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import javax.servlet.http.Part;
@Named("controller")
@SessionScoped
public class Controller implements Serializable {
private static final long serialVersionUID = 1L;
private String text;
private boolean containsNewline = false;
private Part file;
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);
}
public void setFile(Part value) { file = value; }
public Part getFile() { return file; }
}
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:body>
<h:form>
<h:inputTextarea value="#{controller.text}"/>
<h:outputText value="#{controller.containsNewline}"/>
</h:form>
</h:body>
</html>
我读了RFC2388,根据我的理解,multipart / form-data使用一系列字符来界定流中的Parts,并在其他博客上阅读我看到使用换行符是很常见的作为分隔符的一部分。我的Textarea中的换行符是否可能混合到分隔符中?
我唯一能想到的是,在RFC2388 4.5中,每个部分都允许有自己的内容类型,在文本数据的情况下是charset参数。如何设置不同的字符集?我使用哪一个?
我甚至可能完全偏离上述情况,这些只是我目前的理论。
我正在使用在Websphere Application Server 17.0.0.2上运行的JSF 2.2和CDI 1.2。升级到JSF 2.3对我来说不是一个选择,我已经走上了这条道路,遇到了无法解决的问题,请参阅SO上的这两个问题: implementing JSF-2.3 and CDI together in WebSphere Application Server和JSF-2.3 not finding my @Named CDI-1.2 managed bean