Java JSF2.0在页面加载时调用服务器端方法

Java JSF2.0在页面加载时调用服务器端方法,java,jsf-2,Java,Jsf 2,让我来告诉你这个系统是如何工作的 我使用JAAS登录模块进行登录和角色管理。根据我的角色,我可以访问特定页面 我在地址栏中键入我的url,然后按enter键 登录页面出现,在正确登录之后,它会将我重定向到正确的页面(现在我们称之为page1.jsf) 我想在页面加载时调用服务器端方法 你能帮我吗 **编辑** 假设我必须访问page1.jsf,它只能访问role1 在地址栏中,我键入 JAAS显示登录页面,正确输入凭证后,我被重定向到page1.jsf 一旦请求page1.jsf或页面加载,我想

让我来告诉你这个系统是如何工作的

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

我在地址栏中键入我的url,然后按enter键

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

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

你能帮我吗

**编辑**

假设我必须访问page1.jsf,它只能访问role1

在地址栏中,我键入

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


一旦请求page1.jsf或页面加载,我想从我的类中调用一个服务器端方法来重新加载page1.jsf。您还可以访问servlet,而不是访问jsp或jsf页面。因此,创建一个新的servlet。例如:

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>

TestServlet
TestServlet
您的.packages.TestServlet
TestServlet
/TestServlet

在此之后,您应该能够调用
localhost:8080/TestServlet
,然后调用您的方法。

如果您使用的是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>
看看这个
看看这个

不使用servlet。我只想在页面被请求/加载时立即调用我的服务器端方法。请参阅此@mattchandy。您能提供有关AjaxBehaviorEvent的更多信息吗?我必须重新加载我的页面几种类型,才能看到所有应该显示的内容。这里不需要这些。也许您需要使用属性
update=“@all”
@MattHandy update attribute not found抱歉,普通的jsf ajax属性正确命名为
render
,而不是
update
@sameer。您到底遇到了什么问题?是的,但它不起作用。。它没有调用预渲染视图。您可以尝试在`没有任何内容时,在viewparam中放置什么?@sameer,因为您已经对资源进行了保护和正确身份验证。无需再次检查角色。只需简单地添加并在managedBean中尝试这个公共void someMethod(ComponentSystemEvent){System.out.println(“调用的preRenderView”);}
@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) {
        ...
    }

   }

}