页面加载时JSF 2.0调用服务器端方法

时间:2012-04-23 07:06:39

标签: java jsf-2

让我告诉你系统如何运作。

我正在使用JAAS登录模块进行登录和角色管理。我可以根据自己的角色访问特定页面。

我在地址栏中输入我的网址,点击回车。

出现登录页面,正确登录后,它会将我重定向到正确的页面(现在我们称之为page1.jsf)。

我想在页面加载时调用服务器端方法。

你能帮我吗?

**编辑**

假设我必须访问只能由role1访问的page1.jsf。

在地址栏中,我输入http://localhost:8080/myapp/page1.jsf

JAAS显示登录页面,在正确输入凭据后,我被重定向到page1.jsf

一旦请求page1.jsf或页面加载,我想从我的类调用服务器端方法重新加载page1.jsf

2 个答案:

答案 0 :(得分:2)

如果您使用的是JSF 2,则可以使用上面的页面代码段:

<html xmlns="http://www.w3.org/1999/xhtml"
  ... >
 <f:view contentType="text/html">
    <f:event type="preRenderView" listener="#{permissionManager.checkRoles}" />
    <f:attribute name="roles" value="ROLE" />

  ...
  </f:view>
</html>

您可以添加包含该角色的属性,并在PermissionManager.checkRoles()执行重定向到相关页面。

@Named
@ApplicationScoped
class PermissionManager { 
  ...
  public void checkRoles(ComponentSystemEvent event) {

       String acl = "" + event.getComponent().getAttributes().get("roles");
       //Check user role
       ...
       //Redirect if required
       try {

        ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context
                .getApplication().getNavigationHandler();
        handler.performNavigation("access-denied");
    } catch (Exception e) {
        ...
    }

   }

}

查看此example 并看看这个related question

答案 1 :(得分:0)

是的,这有效。您也可以访问Servlet,而不是访问jsp或jsf页面。所以创建一个新的servlet。 E.g:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    public static void yourMethod() {
         // do something useful
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        yourMethod();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

然后在web.xml文件中创建一个新条目,以便将Servlet映射到/.

<servlet>
    <display-name>TestServlet</display-name>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>your.packages.TestServlet</servlet-class>
  </servlet>  
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>

在此之后,您应该可以致电localhost:8080/TestServlet然后调用您的方法。