我在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)
但是,如何在页面加载时使该方法受到影响?
不知道如何进行 - 欢迎提出建议.
我正在寻找最佳实践答案.我想为GET请求做一些预处理.因此,例如,如果不允许用户查看该页面,则将其重定向到另一页面.但我不想使用普通的servlet过滤器,因为我想表达这种行为faces-config.xml.这是可能的,如何调用,怎么做?
我可以定义一些Filter bean,它还返回一个String,告诉faces-config.xml下一步该去哪里?
我用Google搜索,但只打了正常的过滤器.如果我使用的过滤器,可以一个@WebFilter是@ManagedBean在同一时间?还是那种糟糕的风格?
我有一个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(我认为这是因为连接到视图参数)而不是任何其他属性.任何想法如何解决这一问题?
我有一个要求,在页面加载之前,我想检查查询字符串是否存在,如果查询字符串存在,那么我想重定向到另一个页面而不是当前页面如何在JSF 2中处理这种类型的需求.
提前致谢
是否可以通过includeViewParams=trueJSF隐式导航使用查询参数来实现书签?如果是,那怎么样?
如何将表单提交到同一页面并使用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,它将填充文本字段,但表单提交到自身似乎不起作用.
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) 我从什么可以<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) 我只是页面与关联的@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 托管 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-2 ×9
jsf ×7
http-get ×2
viewparams ×2
bookmarks ×1
facelets ×1
forms ×1
jsp ×1
listener ×1
managed-bean ×1
navigation ×1
query-string ×1