相关疑难解决方法(0)

点击bean方法并重定向GET请求

我在GlassFish上使用JSF 2和PrimeFaces 2.1.

我有一个页面,旨在允许人们在关注回调URL后执行操作(例如,作为电子邮件中嵌入的链接或某些外部身份验证或支付服务的回调URL参数).在我的情况下,我需要重置密码.回调URL有一个tokenGET参数,如下所示:

http://example.com/app/resetPasswordForm.jsf?token=abc123

在页面加载时resetPasswordForm.jsf,我需要检查令牌是否有效并重定向到主应用程序屏幕,如果它无效.

我的想法是有一个bean方法,如:

public String resetPasswordHandler.showResetForm(String token) {
  if /* token is valid */ {
    return "resetPasswordForm.jsf";
  } else {
    return "main.jsf";
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如何在页面加载时使该方法受到影响?

不知道如何进行 - 欢迎提出建议.

jsf http-get method-invocation query-string jsf-2

12
推荐指数
1
解决办法
2万
查看次数

有没有简单的方法来预处理和重定向GET请求?

我正在寻找最佳实践答案.我想为GET请求做一些预处理.因此,例如,如果不允许用户查看该页面,则将其重定向到另一页面.但我不想使用普通的servlet过滤器,因为我想表达这种行为faces-config.xml.这是可能的,如何调用,怎么做?

我可以定义一些Filter bean,它还返回一个String,告诉faces-config.xml下一步该去哪里?

我用Google搜索,但只打了正常的过滤器.如果我使用的过滤器,可以一个@WebFilter@ManagedBean在同一时间?还是那种糟糕的风格?

authentication jsf jsf-2 servlet-filters

11
推荐指数
1
解决办法
9249
查看次数

JSF bean:设置ViewParam后调用@PostConstruct函数

我有一个product.xhtml和一个ProductBean.我使用/ product/{id}来访问产品,所以我在product.xhtml中有一个viewParam,其值为value = ProductBean.id.问题是在bean内部我使用带有PostConstruct注释的init函数来填充产品的细节.为此,我需要id来调用外部函数.我想虽然在viewParam设置bean的id之前调用了init,因此在init中我无法调用外部函数,因为id尚未设置.我做错了什么,如何解决这个问题?

UPDATE

我发现了什么问题.我认为viewParam方法适用于CDI bean,但ManagedProperty方法适用于JSF bean.

我现在还有另一个问题.我的CDI bean是RequestScoped,当渲染product.xhtml时,bean被创建,我猜想以后会被丢弃.有趣的是,我在该bean中有一个函数,当我调用时,我可以读取id(我认为这是因为连接到视图参数)而不是任何其他属性.任何想法如何解决这一问题?

postconstruct jsf-2 managed-bean viewparams

11
推荐指数
1
解决办法
9034
查看次数

在JSF2中加载页面之前重定向

我有一个要求,在页面加载之前,我想检查查询字符串是否存在,如果查询字符串存在,那么我想重定向到另一个页面而不是当前页面如何在JSF 2中处理这种类型的需求.

提前致谢

jsf-2

10
推荐指数
1
解决办法
1万
查看次数

通过"查看参数"功能进行书签

是否可以通过includeViewParams=trueJSF隐式导航使用查询参数来实现书签?如果是,那怎么样?

jsf bookmarks jsf-2

8
推荐指数
1
解决办法
3137
查看次数

使用GET提交JSF表单

如何将表单提交到同一页面并使用GET参数?

JSF页面内容:

<f:metadata>
    <f:viewParam name="item1" value="#{bean.item1}"/>
    <f:viewParam name="item2" value="#{bean.item2}"/>
</f:metadata>

...

<h:form>
  <h:inputText value="#{bean.item1}"/>
  <h:inputText value="#{bean.item2}"/>

  <h:button value="Submit" >
      <f:param name="item1" value="#{bean.item1}"/>
      <f:param name="item2" value="#{bean.item2}"/>
  </h:button>
</h:form>
Run Code Online (Sandbox Code Playgroud)

如果我请求页面:form.jsf?item1 = foo&item2 = bar,它将填充文本字段,但表单提交到自身似乎不起作用.

forms jsf http-get jsf-2 viewparams

7
推荐指数
1
解决办法
7040
查看次数

如何将旧JSP的片段重构为某些JSF等价物?

ORIGINAL JSP(WorkItem.jsp)

<c:forEach var="actionItem" items="${workItem.work_action_list}">
    <c:if test="${actionItem.workActionClass.work_action_type_id == '1'}" >
       <%@ include file="inc_done_button.jsp" %>
    </c:if>
    <c:if test="${actionItem.workActionClass.work_action_type_id == '2'}" >
         <c:set var="actionItem" value="${actionItem}" scope="request" />
         <c:set var="checklist" value="${actionItem.meat}" scope="request" />
        <jsp:include page="inc_dynamic_checklist_v.jsp" flush="true" />
    </c:if>
    etc...
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

原始Java

for (ListIterator<WorkflowInstanceWorkItemAction> actionIter = wfiwi.getWork_action_list().listIterator(); actionIter.hasNext();) {
    if ("2".equals(work_action_type_id)) {
        ChecklistInstanceForm ciForm = new ChecklistInstanceForm(this, authenticatedUser);
         ChecklistInstance ci = null; 
        ci = (ChecklistInstance) ciForm.getChkLstInstanceByWfiWiaOwner(wfiWorkItemAction, authenticatedUser);
    // Get the meat details for this action and inject it into the object
        wfiWorkItemAction.setMeat(ci);
    } …
Run Code Online (Sandbox Code Playgroud)

jsf jsp facelets composite-component

7
推荐指数
1
解决办法
1177
查看次数

如何在preRenderView侦听器方法中执行导航

我从什么可以<f:metadata>,<f:viewParam>和<f:viewAction>开始?

我有一个预呈现视图事件监听器:

<f:metadata>
    <f:event type="preRenderView" listener="#{loginBean.performWeakLogin()}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

它调用以下方法:

public String performWeakLogin() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    String parameter_value = (String) facesContext.getExternalContext().getRequestParameterMap().get("txtName");

    if (parameter_value != null && parameter_value.equalsIgnoreCase("pippo")) {
        try {
            return "mainPortal";
        } catch (IOException ex) {
            return null;
        }
    } else {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

和以下导航规则:

<navigation-rule>
    <from-view-id>/stdPortal/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>mainPortal</from-outcome>
        <to-view-id>/stdPortal/stdPages/mainPortal.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)

但是,它不执行导航.它使用命令按钮时,如下所示:

<p:commandButton ... action="#{loginBean.performWeakLogin()}"  /> 
Run Code Online (Sandbox Code Playgroud)

navigation listener jsf-2 prerenderview

6
推荐指数
1
解决办法
1万
查看次数

在回发中保留原始GET请求参数

我只是页面与关联的@RequestScoped支持bean.我从其他页面到达此页面,我在其中传递参数"project".所以,当我进入正确的页面时,我会像contextRoot/faces/jsf.xhtml?project=123.

视图:

<f:metadata>
    <f:viewParam name="project" value="#{entityBean.projectId}" />
</f:metadata>       
...
<p:commandButton value="#{msg['button.add']}"
    actionListener="#{entityBean.addNewEntity((entityName),(entityDescritpion))}"
    ajax="true" update=":projectDetailForm"/>
Run Code Online (Sandbox Code Playgroud)

支持豆:

@Named("entityBean")
@RequestScoped
public class EntityBean implements Serializable{
    private String projectId;

    @PostConstruct
    public void init() {
        params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();

        for (Map.Entry<String, String> entry : params.entrySet()) {
            System.out.println(entry.getKey() + " / " + entry.getValue());
        }

        if (params.get("project") != null) {
            projectId = params.get("project");
        } else {
            HttpServletRequest request =
                (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
            String projectId = request.getParameter("project");
        }
    }

    //projectId getter and setter
    //public void addNewEntity(String …
Run Code Online (Sandbox Code Playgroud)

jsf jsf-2

5
推荐指数
1
解决办法
3746
查看次数

当托管 bean 构造函数发送 404 错误代码时 JSF 调用方法

在 JSF 托管 bean 构造函数中,我使用请求参数从数据库加载实体。有时,实体不在数据库中,我想显示带有 404 消息的其他 JSF (.xhtml) 页面。
这是托管 bean 的示例:

@ManagedBean(name = "someBean")
@RequestScoped
public class SomeBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private SomeData someData;

    public SomeBean() throws IOException {
        someData = ... loads from database using JPA features
        if(someData == null){
              HttpServletResponse response = (HttpServletResponse) FacesContext
                    .getCurrentInstance().getExternalContext().getResponse();
              response.sendError(404);
        }
    }

    public SomeData getSomeData(){
        return someData;
    }
}
Run Code Online (Sandbox Code Playgroud)

我配置了类似这样的 web.xml 文件:

<error-page>
   <error-code>404</error-code>
   <location>/404.xhtml</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

我有一个 JSF 页面来处理托管 bean 加载的实体。当实体存在时,我将在页面中使用它。像那样:

<h1>#{someBean.someEntity.name}</h1>
<h2>#{someBean.someEntity.description}</h2> …
Run Code Online (Sandbox Code Playgroud)

jsf jsf-2

5
推荐指数
1
解决办法
1590
查看次数