java – 如何使用参数创建GET请求,使用JSF和导航规则?

前端之家收集整理的这篇文章主要介绍了java – 如何使用参数创建GET请求,使用JSF和导航规则?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法使用h:outputLink,其他JSF标签代码创建一个html链接来创建一个具有请求参数的非面部请求(HTTP GET)?

例如我有以下导航规则

  1. <navigation-rule>
  2. <navigation-case>
  3. <from-outcome>showMessage</from-outcome>
  4. <to-view-id>/showMessage.jsf</to-view-id>
  5. <redirect/>
  6. </navigation-case>
  7. </navigation-rule>

在我的页面中,我想输出以下HTML代码

  1. <a href="/showMessage.jsf?msg=23">click to see the message</a>

我可以在页面中写入HTML代码,但是我想使用导航规则,以便将所有的URL定义在一个可配置的文件中.

@R_502_323@

这是一个有趣的想法.我很想知道在实践中如何平静下来.

获取导航规则

导航由NavigationHandler处理.保持NavigationHandler并不困难,但是API并没有公开其使用的规则.

我看到,你可以:

>在初始化时解析faces-config.xml并将规则存储在应用程序上下文中(容易)
>实现自己的NavigationHandler,忽略faces-config.xml中的规则,或者用自己的规则文件来补充它们,并以某种方式公开其规则集(可行,但需要一些工作)
>模拟自己的FacesContext并将其传递给现有的导航处理程序(真的很难使两个FacesContext对象在同一个线程中共存并且非常低效)

现在,你也有另一个问题.你要在哪里保持映射查看视图?在豆中硬编码?

使用导航规则

不过,我可以想到两种可以从后端构建参数的URL.两者都涉及定义某种豆类.

  1. <managed-bean>
  2. <managed-bean-name>navBean</managed-bean-name>
  3. <managed-bean-class>foo.NavBean</managed-bean-class>
  4. <managed-bean-scope>application</managed-bean-scope>
  5. </managed-bean>

资源:

  1. package foo;
  2.  
  3. import java.io.IOException;
  4. import java.io.Serializable;
  5. import java.net.URLEncoder;
  6.  
  7. import javax.faces.context.ExternalContext;
  8. import javax.faces.context.FacesContext;
  9.  
  10. public class NavBean implements Serializable {
  11.  
  12. private String getView() {
  13. String viewId = "/showMessage.faces"; // or look this up somewhere
  14. return viewId;
  15. }
  16.  
  17. /**
  18. * Regular link to page
  19. */
  20. public String getUrlLink() {
  21. FacesContext context = FacesContext.getCurrentInstance();
  22. ExternalContext extContext = context.getExternalContext();
  23. String viewId = getView();
  24. String navUrl = context.getExternalContext().encodeActionURL(
  25. extContext.getRequestContextPath() + viewId);
  26. return navUrl;
  27. }
  28.  
  29. /**
  30. * Just some value
  31. */
  32. public String getValue() {
  33. return "" + System.currentTimeMillis();
  34. }
  35.  
  36. /**
  37. * Invoked by action
  38. */
  39. public String invokeRedirect() {
  40. FacesContext context = FacesContext.getCurrentInstance();
  41. ExternalContext extContext = context.getExternalContext();
  42. String viewId = getView();
  43. try {
  44. String charEncoding = extContext.getRequestCharacterEncoding();
  45. String name = URLEncoder.encode("foo",charEncoding);
  46. String value = URLEncoder.encode(getValue(),charEncoding);
  47. viewId = extContext.getRequestContextPath() + viewId + '?' + name
  48. + "=" + value;
  49. String urlLink = context.getExternalContext().encodeActionURL(
  50. viewId);
  51. extContext.redirect(urlLink);
  52. } catch (IOException e) {
  53. extContext.log(getClass().getName() + ".invokeRedirect",e);
  54. }
  55. return null;
  56. }
  57.  
  58. }

得到

对于GET请求,您可以使用UIParameters设置值,并让渲染器构建参数列表.

  1. <h:outputLink value="#{navBean.urlLink}">
  2. <f:param name="foo" value="#{navBean.value}" />
  3. <h:outputText value="get" />
  4. </h:outputLink>

POST

如果要在POST操作期间将URL设置为视图,则可以使用操作中的重定向(由按钮或commandLink调用)来实现.

  1. <h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
  2. <h:outputText value="post" />
  3. </h:commandLink>

笔记

请注意,ExternalContext.encodeActionURL用于对字符串进行编码.这是生成可以跨上下文(portlet等)移植的代码的好习惯.如果要编码图像或下载文件链接,则可以使用encodeResourceURL.

猜你在找的Java相关文章