我多年来一直在使用前缀映射,并决定切换到后缀映射,只是为了/faces真正摆脱url.在我挖洞之前,我只是想检查一下我是否朝着正确的方向前进,因为有一些意想不到的事情正在发生.我改变了这个:
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
对此:
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
然后我看到所有内容FacesServlet都.xhtml
附加到它上面,因此浏览器正在请求background.png.xhtml文件,
style.css.xhtml文件 - 这是正确的吗?我认为它被称为后缀映射,但它看起来有些凌乱,我试图说服自己这是要走的路.
在我引用URI的CSS文件中,我还必须附加.xhtml:
background-image: url(images/background.png.xhtml);
Run Code Online (Sandbox Code Playgroud)
然后我看到BalusC的一篇帖子提供了一个解决方案,可以防止资源下载而无需通过FacesServlet:
<security-constraint>
<display-name>Restrict raw XHTML docs</display-name>
<web-resource-collection>
<web-resource-name>XHTML</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
Run Code Online (Sandbox Code Playgroud)
当我添加这个时,只有真实.xhtml文件加载到页面上,所有其他资源(尽管已经.xhtml附加)不显示.
我想知道的是:
这是否适用.xhtml于一切正常(对不起,如果这几年最愚蠢的问题)
为什么'限制原始xhtml文档'安全约束会阻止加载CSS,JavaScript和图像等资源?
感谢您的任何反馈.我在Glassfish 3.1上使用Mojarra 2.1.2.
我正在编写一个自动完成自定义组件作为JSF 2.1.3的学习练习.这个想法(可能非常熟悉)是输入一些文本和输入组件,并显示一个匹配值的列表框.想法是在输入上有一个keyup javascript事件,它调用jsf.ajax.request()来更新组件.到目前为止,我有一个组件,我可以包括这样:
<mycc:autocomplete id="myauto" searchMethod="#{bean.doSearch}"/>
Run Code Online (Sandbox Code Playgroud)
这会呈现这样的HTML:
<span id="myauto">
<input type="text" id="myauto_input" name="myauto_input"
onkeyup="com.myco.ajaxRequest(this, event)"/>
<select id="myauto_listbox" name="myauto_listbox">
<option value="1st">First</option>
<option value="2nd">Second</option>
</select>
</span>
Run Code Online (Sandbox Code Playgroud)
com.myco.ajaxRequest()javascript函数(keyup)执行此操作:
jsf.ajax.request(comp, null, {
execute: 'myauto',
render: 'myauto'
});
Run Code Online (Sandbox Code Playgroud)
因为我想用建议列表重建和重新呈现列表框,我重新渲染自定义组件'myauto'.通过指定execute:'myauto',decode()方法执行,我可以获取输入值.通过指定render:'myauto',执行encode ...()方法来重新生成html.
这一切都很好,但因为我正在渲染myauto_input组件的父级,所以每次keyup事件触发时都会丢失输入焦点.
如果我指定像render这样的东西:'myauto_listbox'(我真的只想重新渲染列表框)问题是编码...()方法不执行,因为它们是整个自定义组件,而不仅仅是列表框.它将在我重建包含建议的列表框的encode ...()方法之一中.
该组件扩展了UIInput,我在encodeEnd()方法中的单独渲染器(componentFamily ="javax.faces.Input")中生成标记(因此这总是在任何提供的转换器之后运行 - 尚未实现).我想强迫javascript的焦点是一个可怕的黑客,并且要避免.
我有点不确定该去哪里,但我怀疑我所看到的表明我正以某种方式以错误的方式接近这一点.如果有人能够指出我正确的方向,我会非常感激.
我试图让一个复合组件使用它自己的支持bean,使用来自Core JSF 3书的p375上的示例,但只是得到一个NPE.问题似乎是在encodeBegin()的开头,Date date =(Date)getValue()返回null.如果我老实说我真的不明白组件的值应该存储在哪里,我使用cc:attribute type =将其指定为java.util.Date,但我真的不明白这是怎么回事:public Object getSubmittedValue(){return this; - 将返回InputDateBean类的实例 - 导致Date.我一般都很好并且对这应该如何工作感到困惑.
与书籍示例不同,我正在尝试使用支持组件进行临时存储,因此当输入日期时,我会尝试将其存储在#{cc.day}中,因为他们出于某种原因使用应用程序范围的bean.
谢谢你的帮助.我正在使用Mojarra 2.1.
inputDate.xhtml
<cc:interface componentType="uk.co.myco.jsfbeans.sqcc.InputDateBean">
<cc:attribute name="value" type="java.util.Date"/>
</cc:interface>
<cc:implementation>
<h:panelGrid columns="3">
<h:inputText id="day" value="#{cc.day}"
converter="javax.faces.Integer"/>
<h:inputText id="month" value="#{cc.month}"
converter="javax.faces.Integer"/>
<h:inputText id="year" value="#{cc.year}"
converter="javax.faces.Integer"/>
</h:panelGrid>
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)
InputDateBean.java
package uk.co.myco.jsfbeans.sqcc;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import javax.faces.component.FacesComponent;
import java.util.GregorianCalendar;
import javax.faces.application.FacesMessage;
import javax.faces.component.NamingContainer;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;
import uk.co.myco.general.SQLog;
import uk.co.myco.jsfbeans.helper.Messages;
@FacesComponent(value = "uk.co.myco.jsfbeans.sqcc.InputDateBean")
public class InputDateBean extends UIInput implements NamingContainer {
private …Run Code Online (Sandbox Code Playgroud) 在使用CDI的最初阶段,我使用faces-redirect = true导航到一个长时间运行的对话活动的页面,所以我有一个像..myPage.xhtml?cid = 1的URL.
在某些时候,我结束了对话,我的意思是,这必须是一个合理的事情,或者你可以使用会话范围?无论如何,我结束了对话,然后用户点击了F5,当然这会导致'找不到对话'错误,因为cid = 1不存在.
任何人都可以建议如何解决这个问题?我正在使用Steven Verborgh ViewScoped实现,只是使用会话范围的bean在页面之间传递参数.所以我有两个@ViewScoped bean,每个bean都返回第1页和第2页.我@Injected @ConversationScoped ParameterBean到两个视图范围的bean中.我在从第1页调用的action方法中启动对话(parameterBean.getConversation().begin()).在第2页的preRenderView事件中,我将parameterBean的属性引用到第2页支持bean实例变量和结束谈话,它完成了它的工作而不再需要.
除了F5问题,它工作正常.如果有人有任何建议我会很感激,希望我不会错过一些非常明显的东西.我有点假设没有摆脱重定向.
谢谢.
我知道那里有数百个类似的问题,相信我,当我说我读了很多这些问题时,但问题仍然存在.如果我有一个输入标签id ="input1"和一个select id ="list1",我想在输入组件中按下向上/向下箭头键,以相应地向上或向下移动选择列表中的选定选项.
我已设置select标记的值,以便选择选项列表中的第一项,但此代码不起作用.我已经检查了keydown事件的绑定工作正常,我已经尝试在select组件上触发keyup/keydown/keypress(所有尝试的)事件之前暂时将焦点设置到select.我是否应该专注于选择组件,然后在触发按键事件之前触发选择或更改事件?
deflectEvent = function(event) {
if((event.which == $.ui.keyCode.UP) ||
(event.which == $.ui.keyCode.DOWN)) {
//$('#list1').focus(); //.focus().click();
$('#list1').trigger(event);
//$('#input1').focus();
return false;
};
}
jQuery(function($){$('#input1').bind('keydown',deflectEvent)});
Run Code Online (Sandbox Code Playgroud)
我观察到的事情,是错误的,没有.在IE8上,我可以按箭头键并使用$('#list1')获得焦点移动.focus().focus().click(); 但在Chrome上,我甚至无法做到这一点.
我知道jquery模拟插件,虽然我没有设法找到它的任何使用示例.例如,如果您模拟按键事件,如何指定按下了哪个键?
谢谢.