1、JSF的重定向和一般的重定向不同
首先,一般的重定向,比如springMVC不管拦截的url是什么样的,/或者/spring/*重定向的时候重定向url是什么就在浏览器地址栏显示什么,如return “redirect:/login”,则浏览器地址栏一定显示localhost:8080/login
然而JSF的重定向不是这样的,如果JSF拦截的URL是/faces/*这种形式的那么重定向之后浏览器地址栏的url前面一定带有/faces/,比如faces-config.xml中定义的
<navigation-rule>
<from-view-id>/index</from-view-id>
<navigation-case>
<from-outcome></from-outcome>
<to-view-id>/login.xhtml</to-view-id>
<redirect/>
<navigation-case>
</navigation-rule>
重定向至/login,而JSF拦截的URL是/faces/这种形式的,那么浏览器地址栏显示的则是/faces/login.xhtml
,且一定会被JSF拦截
2、JSF的请求转发也和一般的请求转发不同
导航文件中的<from-view-id>
元素所指示的文件ID一定是文件的真实路径,无论URL是什么样的,即是/webapps/下的文件;<to-view-id>
中所指示的文件ID如果JSF拦截URL为/faces/*这种,则可以为文件的真实路径,也可以为/faces/+文件的真实路径,且无论前缀有无JSF拦截URL标识,都会被JSF拦截,属于请求转发的范畴,但JSF中的请求转发一定会被JSF拦截,上述的重定向也是,一定会被JSF拦截,主要是无论是重定向还是请求转发JSF默认都会加上JSF的拦截前缀,这和一般的请求转发完全不同,一般的请求转发就只是按照请求转发的URL寻找文件,不会强制经过拦截URL
3、JSF隐式导航的一些规则
隐式导航默认在页面文件所在文件夹下寻找隐式导航的文件,且若无后缀,则寻找与页面文件后缀相同的文件
4、JSF获取HttpServletContext域对象
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
5、JSF中managedBean中方法的引用
在视图文件中使用托管Bean中的方法时有两种情况
- 在标签元素属性中使用,如
action = "#{userBean.login}"
,此时不需要再方法名后加括号,即不能传递参数 - 在标签元素中作为其值使用,如
<p>#{userBean.login()}</p>
,此时必须在方法名后加括号,此时可以传递参数
6、JSF托管Bean
- 设置JSF Servlet在服务器启动的时候就初始化
<servlet>
<servlet-name>JSFServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这样在服务器启动的时候就会初始化托管Bean,而且托管Bean在作用域内是单实例的,即RequestScoped作用域的托管Bean在单次浏览器请求范围内是单实例的,请求转发和ajax都不是一次浏览器请求