Web.xml
Add the jars
1. jsf-api-2.0.jar
2. jsf-impl.2.0.2.jar
Шаг 1: Измените web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
Шаг 2: webmvc-config.xml
<!-- Handles requests mapped to the Spring Web Flow system -->
<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
<property name="flowExecutor" ref="flowExecutor" />
<property name="ajaxHandler">
<bean class="org.springframework.faces.webflow.JsfAjaxHandler" />
</property>
</bean>
Шаг 3: facess-config.xml
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">
FileDescriptor
- это объект, несущий дескриптор файла ОС, что означает, что это объект, несущий указатель файла.
Только один поток может одновременно использовать дескриптор файла / указатель файла, поскольку a FileDescriptor
не поддерживает многопоточность. Доступ был синхронизирован.
Если вы хотите, чтобы два потока имели независимый доступ к файлу, вам нужны два FileDescriptors.
Чтобы доказать мою точку зрения на указатель общего файла, как вы думаете, что произойдет, если вы поочередно читаете из FileInputStream
и пишете в FileOutputStream
?
Вот код, показывающий, что происходит:
String fileName = "Test.txt";
Files.writeString(Paths.get(fileName), "abcdefghijklmnopqrstuvwxyz", StandardCharsets.US_ASCII);
try (RandomAccessFile raFile = new RandomAccessFile(fileName, "rw");
FileInputStream in = new FileInputStream(raFile.getFD());
FileOutputStream out = new FileOutputStream(raFile.getFD()) ) {
byte[] buf = new byte[4];
for (int i = 0; i < 3; i++) {
int len = in.read(buf);
System.out.println(new String(buf, 0, len, StandardCharsets.US_ASCII));
out.write("1234".getBytes(StandardCharsets.US_ASCII));
}
}
String s = Files.readString(Paths.get(fileName), StandardCharsets.US_ASCII);
System.out.println(s);
Вывод
abcd
ijkl
qrst
abcd1234ijkl1234qrst1234yz
Как видите, чтение 4 байтов возвращает байты 0-3 и перемещает указатель файла, поэтому запись 4 байтов заменяет байты 4- 7, затем чтение 4 байтов возвращает байты 8-11, а запись 4 байтов заменяет байты 12-15 и т. Д.