如何通过 servlet 将 Applet 中的序列化对象提交到支持 bean,然后打开结果 JSF 页面 [英] How to submit a serialised object from an Applet, via a servlet, to a backing bean then open a results JSF page

查看:10
本文介绍了如何通过 servlet 将 Applet 中的序列化对象提交到支持 bean,然后打开结果 JSF 页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一名应用程序程序员,正在创建我的第一个 JSF 2.0 网站,但我承认我对 JSF 的了解并不多.几个月来我一直在研究文档,特别是由于这些论坛,我还没有陷入困境.网站的大部分内容已经完成并可以运行,这里使用的支持 bean 可以在其他地方使用,没有问题.

我有一个序列化的搜索条件对象,需要通过 servlet 从小程序提交到支持 bean.然后,支持 bean 方法处理搜索条件数据并将其应用于保存在数据库中的产品列表,然后在新的 JSF 页面中显示排名的产品列表.

尝试打开包含正确数据的结果页面的所有尝试均已失败.导航案例"return "process_MainSearchResult";"未在支持 bean 中执行任何操作(请参阅进一步的支持 bean 代码和 faces-config 条目).我曾尝试使用 appletContext.showDocument(见下文)从小程序打开结果页面,但新页面没有搜索条件对象传递到的支持 bean,因此没有正确的数据.

注意小程序中setRequestMethod上设置POST是没有效果的;它总是使用服务.如果 setDoInput 和 setDoOutput 未设置为 true 并且响应从 servlet 发送回小程序,则不会发送提交的对象并且什么也不会发生.我怀疑这是我问题的核心,但以任何方式更改它都会阻止成功提交序列化对象.

就目前而言,对象已成功发送到支持 bean,但新页面不会加载正确的数据(使用小程序中的 showDocument 而不是 servlet 中的重定向).有没有办法在新网页上设置原始支持 bean 还是我做错了?

Web 服务器为 Glassfish 3.x,IDE 为 Netbeans 7.0.1,系统为 WinXP.支持 bean 类是ProductSelection";servlet 类是CriteriaServlet".

小程序提交搜索条件"按钮代码:

private void jButton8ActionPerformed(java.awt.event.ActionEvent evt){标准模型.loadCodeBase();int choice = JOptionPane.showConfirmDialog(this,"您确定要提交搜索条件并退出自定义搜索条件"网页吗?","确认提交",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);如果(选择== 0){尝试{网址网址;url = 新 URL(criteriaModel.getCodeBase(), "CriteriaServlet");System.out.println("Servlet 地址为:" + url);//获取搜索条件对象.对象 searchSubmitObject = criteriaModel.getObjectSlideData();HttpURLConnection 连接 = (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();关闭();关闭();System.out.println("对象写入");//如果这个和相应的servlet响应代码被删除//那么 searchSubmitObject 发送失败.ObjectInputStream in = new ObjectInputStream(connection.getInputStream());String response = (String)in.readObject();System.out.println(响应);附寄();}catch (MalformedURLException ex){JOptionPane.showMessageDialog(jPanel8, "提交标准文件格式错误的 URL."+ ex.toString());System.out.println("MalformedURLException发生");Logger.getLogger(CriteriaInterfaceView.class.getName()).log(Level.SEVERE, null, ex);}捕获(例外 e){System.out.println("提交条件文件错误异常:" + e.toString());JOptionPane.showMessageDialog(jPanel8, "提交标准文件错误异常:"+ e.toString());}}//这会打开一个新页面,但带有一个带有错误数据的新支持 bean.尝试{appletContext.showDocument(new URL(criteriaModel.getCodeBase()+"MainSearchResult.xhtml"),"_SELF");}catch (MalformedURLException ex){Logger.getLogger(CriteriaInterfaceView.class.getName()).log(Level.SEVERE, null, ex);}}

我尝试在 servlet 中使用 redirect(url) 重定向但没有成功:

@Overridepublic void service(ServletRequest req, ServletResponse res) 抛出 ServletException, IOException{System.out.println("service(ServletRequest req, ServletResponse res)");res.setContentType("application/x-java-serialized-object");尝试{ObjectInputStream in = new ObjectInputStream(req.getInputStream());slideData = (MultipleSlideDataObject2)in.readObject();附寄();如果(幻灯片数据!= null){System.out.println("提交的幻灯片序列号为:" + slideData.getSerialNumber());}String temp = "收到的标准文件";ObjectOutputStream outputToApplet = new ObjectOutputStream(res.getOutputStream());outputToApplet.writeObject(temp);outputToApplet.flush();outputToApplet.close();}捕获(ClassNotFoundException 前){Logger.getLogger(CriteriaServlet.class.getName()).log(Level.SEVERE, null, ex);}FacesContext facesContext = FacesUtil.getFacesContext(req, res);//获取支持 bean.ProductSelection productSelection = (ProductSelection) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{productSelection}", ProductSelection.class);productSelection.submitSearchCriteriaFile(slideData);//这会引发 java.lang.IllegalStateException 错误.尝试{FacesContext 上下文 = FacesContext.getCurrentInstance();ExternalContext extContext = context.getExternalContext();String url = extContext.encodeActionURL(context.getApplication().getViewHandler().getActionURL(context, "/MainSearchResult.xhtml"));extContext.redirect(url);}捕获(IOException e){抛出新的 FacesException(e);}

给出以下错误,因为我怀疑当前响应已经提交:

<块引用>

警告:StandardWrapperValve[CriteriaServlet]:PWC1406:servlet CriteriaServlet 的 Servlet.service() 抛出异常java.lang.IllegalStateException在 org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:522)在 com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:572)在 searchselection.CriteriaServlet.service(CriteriaServlet.java:217)在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)在 com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)在 com.sun.grizzly.ContextTask.run(ContextTask.java:69)在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)在 java.lang.Thread.run(Thread.java:619)

返回process_MainSearchResult";在支持 bean 中不起作用:

public String submitSearchCriteriaFile(MultipleSlideDataObject2 slideData) 抛出 IOException{System.out.println("收到的幻灯片序列号:" + slideData.getSerialNumber());//如果没有幻灯片数据则...如果(幻灯片数据 == 空){返回process_MainSearchResultFailed";}别的{排名产品(幻灯片数据);}行开始 = 0;当前起始页 = 0;当前页面索引 = 0;计算NumberPages();设置分页值();//忽略这个...返回process_MainSearchResult";}

Faces-config.xml 条目:

<导航案例><from-outcome>process_MainSearchResult</from-outcome><to-view-id>/MainSearchResult.xhtml</to-view-id></navigation-case></导航规则>

我也在支持 bean 中尝试过这个以强制重定向:

FacesContext context = FacesContext.getCurrentInstance();HttpServletResponse 响应 = (HttpServletResponse)context.getExternalContext().getResponse();尝试{response.sendRedirect("MainSearchResult.xhtml");//response.redirect("http://localhost:8080/SearchEngineServer/faces/MainSearchResult.xhtml");}捕获(IOException e){e.printStackTrace();}返回空;

还有这个在支持 bean 中:

 redirectToPage("/MainSearchResult.xhtml");

调用这个方法:

private void redirectToPage(String toUrl){尝试{FacesContext ctx = FacesContext.getCurrentInstance();ExternalContext extContext = ctx.getExternalContext();String url = extContext.encodeActionURL(ctx.getApplication().getViewHandler().getActionURL(ctx, toUrl));extContext.redirect(url);}捕获(IOException e){抛出新的 FacesException(e);}}

所有都给出与上面给出的 servlet 示例相同的 java.lang.IllegalStateException 错误.重定向的文档说明了这一点:

<块引用>

IllegalStateException - 如果在 portlet 环境中,当前响应对象是 RenderResponse 而不是 ActionResponseIllegalStateException - 如果在 servlet 环境中,当前响应已经提交

解决方案

BalusC 的答案是对少量对象数据的合适答案,但是,我提交给支持 bean 的对象是 2.2 兆字节,不适合在网址.此外,我不希望人们将此特定页面添加为书签,因为将来可能会将更多属性添加到搜索条件文件中,这会使书签属性无效.

我使用的解决方案技术含量很低,但它有效.小程序将序列化的对象提交给 servlet,servlet 又将其传递给支持 bean,然后向小程序返回失败或成功消息.如果提交成功,则小程序调用网页上的 javascript 函数来加载结果页面.这可确保保留正确的支持 bean.

最终代码如下:

小程序提交搜索条件"按钮代码:

private void jButton8ActionPerformed(java.awt.event.ActionEvent evt){标准模型.loadCodeBase();int choice = JOptionPane.showConfirmDialog(this,"您确定要提交搜索条件并退出自定义搜索条件"网页吗?","确认提交",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);如果(选择== 0){尝试{URL url = new URL(criteriaModel.getCodeBase(), "CriteriaServlet");System.out.println("Servlet 地址为:" + url);对象 searchSubmitObject = criteriaModel.getObjectSlideData();HttpURLConnection 连接 = (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();关闭();关闭();System.out.println("对象写入");ObjectInputStream in = new ObjectInputStream(connection.getInputStream());String response = (String)in.readObject();System.out.println(响应);附寄();如果(响应.等于(失败")){JOptionPane.showMessageDialog(jPanel8, "向服务器提交搜索条件文件失败.\n 稍后再试.");}别的{getAppletContext().showDocument(new URL("javascript:openResultsPage()"));}}catch (MalformedURLException ex){JOptionPane.showMessageDialog(jPanel8, "提交标准文件格式错误的 URL."+ ex.toString());System.out.println("MalformedURLException发生");Logger.getLogger(CriteriaInterfaceView.class.getName()).log(Level.SEVERE, null, ex);}捕获(例外 e){System.out.println("提交条件文件错误异常:" + e.toString());JOptionPane.showMessageDialog(jPanel8, "提交标准文件错误异常:"+ e.toString());}}}

在 servlet 中:

@Overridepublic void service(ServletRequest req, ServletResponse res) 抛出 ServletException, IOException{System.out.println("service(ServletRequest req, ServletResponse res)");res.setContentType("文本/普通");尝试{ObjectInputStream in = new ObjectInputStream(req.getInputStream());slideData = (MultipleSlideDataObject2)in.readObject();附寄();字符串回复 = "失败";如果(幻灯片数据!= null){System.out.println("提交的幻灯片序列号为:" + slideData.getSerialNumber());FacesContext facesContext = FacesUtil.getFacesContext(req, res);ProductSelection productSelection = (ProductSelection) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{productSelection}", ProductSelection.class);productSelection.submitSearchCriteriaFile(slideData);回复 = "成功";}ObjectOutputStream outputToApplet = new ObjectOutputStream(res.getOutputStream());outputToApplet.writeObject(reply);outputToApplet.flush();outputToApplet.close();}捕获(ClassNotFoundException 前){Logger.getLogger(CriteriaServlet.class.getName()).log(Level.SEVERE, null, ex);}}

在支持 bean 中:

public String submitSearchCriteriaFile(MultipleSlideDataObject2 slideData) 抛出 IOException{System.out.println("收到的幻灯片序列号:" + slideData.getSerialNumber());//如果没有幻灯片数据则...如果(幻灯片数据 == 空){返回process_MainSearchResultFailed";}别的{排名产品(幻灯片数据);}返回process_MainSearchResult";}

在包含小程序的 JSF 页面的标题中:





        
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆