私は最初のJSF2.0Webサイトを作成しているアプリケーションプログラマーであり、JSFについて私がすべきことをあまり知らないことを告白します。私は何ヶ月もドキュメントに苦しんでおり、特にこれらのフォーラムのおかげで、この時点まで立ち往生していません。Webサイトの大部分は完成して機能しており、ここで使用されているバッキングBeanは他の場所でも問題なく使用されています。
サーブレットを介してアプレットからバッキングBeanに送信する必要があるシリアル化された検索条件オブジェクトがあります。次に、バッキングBeanメソッドは、検索基準データを処理して、データベースに保持されている製品のリストに適用し、ランク付けされた製品のリストを新しいJSFページに表示します。
正しいデータで結果ページを開く試みはすべて失敗しました。ナビゲーションケース「return"process_MainSearchResult";」バッキングBeanで何も実行していません(バッキングBeanコードの詳細とfaces-configエントリを参照してください)。appletContext.showDocument(以下を参照)を使用してアプレットから結果ページを開こうとしましたが、新しいページには検索条件オブジェクトが渡されたバッキングBeanがないため、正しいデータがありません。
アプレットのsetRequestMethodにPOSTを設定しても効果がないことに注意してください。常にサービスを使用します。setDoInputとsetDoOutputがtrueに設定されておらず、サーブレットからアプレットに応答が返される場合、送信されたオブジェクトは送信されず、何も起こりません。これが私の問題の核心にあると思いますが、何らかの方法で変更すると、シリアル化されたオブジェクトが正常に送信されなくなります。
現状では、オブジェクトはバッキングBeanに正常に送信されますが、新しいページには正しいデータがロードされません(サーブレットのリダイレクトではなく、アプレットのshowDocumentを使用)。新しいWebページに元のバッキングBeanを設定する方法はありますか、それともこれをすべて間違って行っていますか?
WebサーバーはGlassfish3.x、IDEはNetbeans 7.0.1、システムはWinXPです。バッキングBeanクラスは「ProductSelection」です。サーブレットクラスは「CriteriaServlet」です。
アプレットの「検索基準の送信」ボタンコード:
private void jButton8ActionPerformed(java.awt.event.ActionEvent evt)
{
criteriaModel.loadCodeBase();
int choice = JOptionPane.showConfirmDialog(this,
"Are you sure you want to submit your search criteria and exit the \"Customise Search Criteria\" web page?",
"Confirm Submit",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (choice == 0)
{
try
{
URL url;
url = new URL(criteriaModel.getCodeBase(), "CriteriaServlet");
System.out.println("Servlet address is: " + url);
// Get the search criteria object.
Object searchSubmitObject = criteriaModel.getObjectSlideData();
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type","application/x-java-serialized-object");
ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream());
out.writeObject(searchSubmitObject);
out.flush();
out.close();
out.close();
System.out.println("Object Written");
// If this and the corresponding servlet response code is removed
// then the searchSubmitObject fails to be sent.
ObjectInputStream in = new ObjectInputStream(connection.getInputStream());
String response = (String)in.readObject();
System.out.println(response);
in.close();
}
catch (MalformedURLException ex)
{
JOptionPane.showMessageDialog(jPanel8, "Submit criteria file Malformed URL."
+ ex.toString());
System.out.println("MalformedURLException occurred");
Logger.getLogger(CriteriaInterfaceView.class.getName()).log(Level.SEVERE, null, ex);
}
catch (Exception e)
{
System.out.println("Submit criteria file ERROR exception: " + e.toString());
JOptionPane.showMessageDialog(jPanel8, "Submit criteria file ERROR exception:"
+ e.toString());
}
}
// This opens a new page but with a new backing bean with the wrong data.
try
{
appletContext.showDocument(new URL(criteriaModel.getCodeBase()+"MainSearchResult.xhtml"),"_SELF");
}
catch (MalformedURLException ex)
{
Logger.getLogger(CriteriaInterfaceView.class.getName()).log(Level.SEVERE, null, ex);
}
}
redirect(url)を使用してサーブレットでリダイレクトしようとしましたが、成功しませんでした。
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
{
System.out.println("service(ServletRequest req, ServletResponse res)");
res.setContentType("application/x-java-serialized-object");
try
{
ObjectInputStream in = new ObjectInputStream(req.getInputStream());
slideData = (MultipleSlideDataObject2)in.readObject();
in.close();
if(slideData != null)
{
System.out.println("Serial number of submitted slide series is: " + slideData.getSerialNumber());
}
String temp = "Criteria file Recieved";
ObjectOutputStream outputToApplet = new ObjectOutputStream(res.getOutputStream());
outputToApplet.writeObject(temp);
outputToApplet.flush();
outputToApplet.close();
}
catch (ClassNotFoundException ex)
{
Logger.getLogger(CriteriaServlet.class.getName()).log(Level.SEVERE, null, ex);
}
FacesContext facesContext = FacesUtil.getFacesContext(req, res);
// Get the backing bean.
ProductSelection productSelection = (ProductSelection) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{productSelection}", ProductSelection.class);
productSelection.submitSearchCriteriaFile(slideData);
// This throws an java.lang.IllegalStateException error.
try
{
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String url = extContext.encodeActionURL(context.getApplication().getViewHandler().getActionURL(context, "/MainSearchResult.xhtml"));
extContext.redirect(url);
}
catch (IOException e)
{
throw new FacesException(e);
}
現在の応答がすでにコミットされていると思われるため、次のエラーが発生します。
警告:StandardWrapperValve [CriteriaServlet]:PWC1406:サーブレットCriteriaServletのServlet.service()は、com.sun.facesのorg.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:522)で例外java.lang.IllegalStateExceptionをスローしました。 context.ExternalContextImpl.redirect(ExternalContextImpl.java:572)at searchselection.CriteriaServlet.service(CriteriaServlet.java:217)at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)at org.apache.catalina .core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641 )com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)atcom.sun。Enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java: 325)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)at com.sun.grizzly .http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954 )com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)atcom.sun.grizzly.DefaultProtocolChain。executeProtocolFilter(DefaultProtocolChain.java:135)at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)at com.sun.grizzly.http .HttpProtocolChain.execute(HttpProtocolChain.java:76)at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)atcom.sun。 grizzly.ContextTask.run(ContextTask.java:69)at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330)at com.sun.grizzly.util.AbstractThreadPool $ WorkerThreadPool java:309)at java.lang.Thread.run(Thread.java:619)execute(DefaultProtocolChain.java:102)at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)at com.sun.grizzly .ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)at com.sun.grizzly.ContextTask.run(ContextTask.java:69)atcom.sun。 grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330)at com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:309)at java.lang.Thread.run(Thread.java: 619)execute(DefaultProtocolChain.java:102)at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)at com.sun.grizzly .ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)at com.sun.grizzly.ContextTask.run(ContextTask.java:69)atcom.sun。 grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330)at com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:309)at java.lang.Thread.run(Thread.java: 619)76)com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)at com.sun.grizzly.ContextTask.run(ContextTask.java :69)com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330)at com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:309)atjava.lang。 Thread.run(Thread.java:619)76)com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)at com.sun.grizzly.ContextTask.run(ContextTask.java :69)com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330)at com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:309)atjava.lang。 Thread.run(Thread.java:619)run(AbstractThreadPool.java:309)at java.lang.Thread.run(Thread.java:619)run(AbstractThreadPool.java:309)at java.lang.Thread.run(Thread.java:619)
戻り値"process_MainSearchResult"; バッキングBeanでは機能しません:
public String submitSearchCriteriaFile(MultipleSlideDataObject2 slideData) throws IOException
{
System.out.println("Recieved slide series with serial number: " + slideData.getSerialNumber());
// If there is no slide data then...
if (slideData == null)
{
return "process_MainSearchResultFailed";
}
else
{
rankProducts(slideData);
}
rowStart = 0;
currentStartPage = 0;
currentPageIndex = 0;
calculateNumberPages();
SetupPaginationValues();
// Ignores this...
return "process_MainSearchResult";
}
Faces-config.xmlエントリ:
<navigation-rule>
<navigation-case>
<from-outcome>process_MainSearchResult</from-outcome>
<to-view-id>/MainSearchResult.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
また、バッキングBeanでこれを試し、リダイレクトを強制しました。
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();
try
{
response.sendRedirect("MainSearchResult.xhtml");
//response.redirect("http://localhost:8080/SearchEngineServer/faces/MainSearchResult.xhtml");
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
また、これはバッキングBeanに含まれています。
redirectToPage("/MainSearchResult.xhtml");
このメソッドを呼び出すもの:
private void redirectToPage(String toUrl)
{
try
{
FacesContext ctx = FacesContext.getCurrentInstance();
ExternalContext extContext = ctx.getExternalContext();
String url = extContext.encodeActionURL(ctx.getApplication().getViewHandler().getActionURL(ctx, toUrl));
extContext.redirect(url);
}
catch (IOException e)
{
throw new FacesException(e);
}
}
上記のサーブレットの例と同じjava.lang.IllegalStateExceptionエラーが発生します。リダイレクトのドキュメントには、次のように記載されています。
IllegalStateException - if, in a portlet environment, the current response object is a RenderResponse instead of an ActionResponse IllegalStateException - if, in a servlet environment, the current response has already been committed