这是我的登录页面
<h:outputText value="ENTER USERNAME" ></h:outputText>
<p:inputText value="#{treeBean.username}" id="user"></p:inputText>
<h:outputText value="ENTER PASSWORD" ></h:outputText>
<p:inputText value="#{treeBean.userpass}" id="pass"></p:inputText>
<p:commandButton value="GO" action="#{treeBean.checkuser}" onclick="redirect()"></p:commandButton>
<script type="text/javascript">
function redirect()
{
window.location="/arcpage/arc.jsf";
}
</script>
这是我的treeBean.checkuser函数
public void checkuser()
{
Connection con=null;
try
{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "root");
try
{
st.executeUpdate("USE ARCPAGE");
String update="SELECT * FROM USER WHERE USER_NAME=? AND USER_PASS=?";
PreparedStatement prest=con.prepareStatement(update);
prest.setString(1,username);
prest.setString(2,userpass);
ResultSet rs=prest.executeQuery();
if(rs.next()==false)
{
check="false";
}
else
{
check="true";
}
}}}
这是我的主页:
<script type="text/javascript">
if(check!="true")
{
window.location="/arcpage/login.jsf";
}
</script>
<Main Page Content>
如果我输入正确的用户名 - 密码组合,我将被重定向到登录页面而不是主页面。如果我再次输入正确的组合,我将被重定向到主页面。即使我输入了错误的组合,第二次我被重定向到主页面。我认为首先执行主页面然后执行checkuser(),因此在显示主页面之前不会更新check的值。 为什么会这样?
答案 0 :(得分:3)
那是因为您向执行重定向的onclick
添加了一些JavaScript函数。当用户单击按钮时调用此方法。这反过来导致JSF操作被完全跳过。您似乎也认为JSF和JavaScript以某种方式同步运行。这是不真实的。它是两种完全不同的语言。 JSF仅在webserver中运行,生成HTML / CSS / JS代码并将其发送到webbrowser。 JS在webbrowser中运行,仅拦截HTML DOM树。
要解决此问题,只需删除 onclick
并在JSF操作方法中执行导航。所以:
<p:commandButton value="GO" action="#{treeBean.checkuser}" />
与
public String checkuser() {
User user = userService.find(username, password);
if (user == null) {
return "login";
} else {
return "arc";
}
}