单击按钮后无重定向
No redirection after button click
我是 jsf 的新手,正在尝试构建应用程序。问题是当我单击登录命令按钮时没有任何反应。所以我输入了一些打印行,它告诉我与数据库的连接存在并且参数有效但它不会重定向。
这里是index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Dezurstvo</title>
</h:head>
<h:body>
Login
<br />
<h:form>
<p:growl id="msgs" showDetail="true"/>
<h:panelGrid columns="2" cellpadding="5">
<h:outputText value="Username"/>
<p:inputText value="#{logIn.username}" required="true"/>
<h:outputText value="Password"/>
<p:password id="pass" value="#{logIn.password}" feedback="false" required="true"/>
</h:panelGrid>
<p:commandButton value="Login" action="#{logIn.loadUser()}" update="msgs" />
<p:commandButton value="Regisracija" />
</h:form>
<h:link outcome="adminMain" value="Primefaces welcome page" />
</h:body>
</html>
NavigationBean class
package beans;
import dataBeans.Korisnik;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
@ManagedBean(name = "navigation")
@RequestScoped
class NavigationBean {
public String getHomepage(){
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
Korisnik kor = (Korisnik)session.getAttribute("username");
if(!"A".equals(kor.getStatus()) || !"D".equals(kor.getStatus()) || !"N".equals(kor.getStatus()))
return "index";
else if("A".equals(kor.getStatus()))
return "adminMain";
else if("D".equals(kor.getStatus()))
return "demonstratorMain";
else if("N".equals(kor.getStatus()))
return "nastavnikMain";
return "";
}
public static String redirect(String status){
if(!"A".equals(status) || !"D".equals(status) || !"N".equals(status))
return "index";
else if("A".equals(status))
return "adminMain";
else if("D".equals(status))
return "demonstratorMain";
else if("N".equals(status))
return "nastavnikMain";
return "error";
}
}
登录 Bean
package beans;
import dataBeans.Korisnik;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
@ManagedBean(name="logIn")
@RequestScoped
public class LoginBean {
private String user;
private String pass;
private UIComponent component;
public UIComponent getComponent() {
return component;
}
public void setComponent(UIComponent component) {
this.component = component;
}
public LoginBean() {}
/**
* @return the user
*/
public String getUsername() {
return user;
}
/**
* @param username the user to set
*/
public void setUsername(String username) {
this.user = username;
}
/**
* @return the pass
*/
public String getPassword() {
return pass;
}
/**
* @param password the pass to set
*/
public void setPassword(String password) {
this.pass = password;
}
//Loading user into session
public String loadUser() {
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
FacesMessage msg;
Korisnik kor = Korisnik.getUser(user);
if (user.equals(kor.getUsername())) {
System.out.println( "user je = " + kor.getUsername());
//User exists in database
if (pass.equals(kor.getPassword())) {
System.out.println( "Sifra je = " + kor.getPassword());
System.out.println( "Status = " + kor.getStatus());
//Pasword is OK
session.setAttribute(user, kor);
return NavigationBean.redirect(kor.getStatus());
} else {
//Wrong pass
// System.out.println( "Sifra je = " + kor.getPassword());
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Pogrešna šifra.");
return msg.toString();
}
} else {
//Wrog user
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Korisnik sa datim korisničkim imenom ne postoji.");
return msg.toString();
}
}
public String signOut(){
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
session.invalidate();
return "logIn";
}
}
人脸配置
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>adminMain</from-outcome>
<to-view-id>admin/adminMain.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>demonstratorMain</from-outcome>
<to-view-id>demonstrator/demonstratorMain.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>nastavnikMain</from-outcome>
<to-view-id>nastavnik/nastavnikMain.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>error</from-outcome>
<to-view-id>error.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
和网络
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
</web-app>
当单击按钮时,它从 LoginBean 调用函数 loadUser,他从 NavigationBean 调用重定向,应该根据用户的状态将我重定向到特定页面,但没有任何反应。另外,当我输入错误的数据时,它会显示
Warning: JSF1091: No mime type could be found for file /javax.faces.application.FacesMessage@67cc4160. To resolve this, add a mime-type mapping to the applications web.xml.
Warning: JSF1064: Unable to find or serve resource, /javax.faces.application.FacesMessage@67cc4160.
不知道这是否与此有关。
我正在使用 glassfish server 4.1、primefaces 5.0、wamp、netbeans 8.0.2、jsf 2.2
如果需要,这里是树视图
来自 JSF 操作方法的字符串 return 必须代表 JSF 视图 ID,如下所示:
public String submit() {
// ...
return "/some.xhtml";
}
或真正的重定向(您所有的情况都是 simple forwards, not redirects,也正确使用此术语):
public String submit() {
// ...
return "/some.xhtml?faces-redirect=true";
}
或 null
与 "return to current page":
相同
public String submit() {
// ...
return null;
}
如果您在 faces-config.xml
旧 JSF 1.x 样式中使用导航案例,那么 returned 字符串也可以表示导航案例结果。
关于您的具体问题,您在服务器日志中收到以下警告:
Warning: JSF1064: Unable to find or serve resource, /javax.faces.application.FacesMessage@67cc4160.
这意味着 JSF 没有将字符串值 /javax.faces.application.FacesMessage@67cc4160
识别为有效的 JSF 视图 ID。这基本上意味着您在操作方法中确实喜欢以下操作:
public String submit() {
// ...
return "/javax.faces.application.FacesMessage@67cc4160";
}
事实上,您在下面几行中正是这样做的!
} else {
//Wrong pass
// System.out.println( "Sifra je = " + kor.getPassword());
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Pogrešna šifra.");
return msg.toString();
}
} else {
//Wrog user
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Korisnik sa datim korisničkim imenom ne postoji.");
return msg.toString();
}
这不是 return 到当前视图的正确方法,并在上下文中添加了面孔消息。替换 return 行如下:
context.addMessage(null, msg);
return null;
另请参阅:
- How to navigate in JSF? How to make URL reflect current page (and not previous one)
- Creating FacesMessage in action method outside JSF conversion/validation mechanism?
我是 jsf 的新手,正在尝试构建应用程序。问题是当我单击登录命令按钮时没有任何反应。所以我输入了一些打印行,它告诉我与数据库的连接存在并且参数有效但它不会重定向。
这里是index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Dezurstvo</title>
</h:head>
<h:body>
Login
<br />
<h:form>
<p:growl id="msgs" showDetail="true"/>
<h:panelGrid columns="2" cellpadding="5">
<h:outputText value="Username"/>
<p:inputText value="#{logIn.username}" required="true"/>
<h:outputText value="Password"/>
<p:password id="pass" value="#{logIn.password}" feedback="false" required="true"/>
</h:panelGrid>
<p:commandButton value="Login" action="#{logIn.loadUser()}" update="msgs" />
<p:commandButton value="Regisracija" />
</h:form>
<h:link outcome="adminMain" value="Primefaces welcome page" />
</h:body>
</html>
NavigationBean class
package beans;
import dataBeans.Korisnik;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
@ManagedBean(name = "navigation")
@RequestScoped
class NavigationBean {
public String getHomepage(){
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
Korisnik kor = (Korisnik)session.getAttribute("username");
if(!"A".equals(kor.getStatus()) || !"D".equals(kor.getStatus()) || !"N".equals(kor.getStatus()))
return "index";
else if("A".equals(kor.getStatus()))
return "adminMain";
else if("D".equals(kor.getStatus()))
return "demonstratorMain";
else if("N".equals(kor.getStatus()))
return "nastavnikMain";
return "";
}
public static String redirect(String status){
if(!"A".equals(status) || !"D".equals(status) || !"N".equals(status))
return "index";
else if("A".equals(status))
return "adminMain";
else if("D".equals(status))
return "demonstratorMain";
else if("N".equals(status))
return "nastavnikMain";
return "error";
}
}
登录 Bean
package beans;
import dataBeans.Korisnik;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
@ManagedBean(name="logIn")
@RequestScoped
public class LoginBean {
private String user;
private String pass;
private UIComponent component;
public UIComponent getComponent() {
return component;
}
public void setComponent(UIComponent component) {
this.component = component;
}
public LoginBean() {}
/**
* @return the user
*/
public String getUsername() {
return user;
}
/**
* @param username the user to set
*/
public void setUsername(String username) {
this.user = username;
}
/**
* @return the pass
*/
public String getPassword() {
return pass;
}
/**
* @param password the pass to set
*/
public void setPassword(String password) {
this.pass = password;
}
//Loading user into session
public String loadUser() {
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
FacesMessage msg;
Korisnik kor = Korisnik.getUser(user);
if (user.equals(kor.getUsername())) {
System.out.println( "user je = " + kor.getUsername());
//User exists in database
if (pass.equals(kor.getPassword())) {
System.out.println( "Sifra je = " + kor.getPassword());
System.out.println( "Status = " + kor.getStatus());
//Pasword is OK
session.setAttribute(user, kor);
return NavigationBean.redirect(kor.getStatus());
} else {
//Wrong pass
// System.out.println( "Sifra je = " + kor.getPassword());
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Pogrešna šifra.");
return msg.toString();
}
} else {
//Wrog user
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Korisnik sa datim korisničkim imenom ne postoji.");
return msg.toString();
}
}
public String signOut(){
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
session.invalidate();
return "logIn";
}
}
人脸配置
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>adminMain</from-outcome>
<to-view-id>admin/adminMain.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>demonstratorMain</from-outcome>
<to-view-id>demonstrator/demonstratorMain.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>nastavnikMain</from-outcome>
<to-view-id>nastavnik/nastavnikMain.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>error</from-outcome>
<to-view-id>error.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
和网络
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
</web-app>
当单击按钮时,它从 LoginBean 调用函数 loadUser,他从 NavigationBean 调用重定向,应该根据用户的状态将我重定向到特定页面,但没有任何反应。另外,当我输入错误的数据时,它会显示
Warning: JSF1091: No mime type could be found for file /javax.faces.application.FacesMessage@67cc4160. To resolve this, add a mime-type mapping to the applications web.xml.
Warning: JSF1064: Unable to find or serve resource, /javax.faces.application.FacesMessage@67cc4160.
不知道这是否与此有关。
我正在使用 glassfish server 4.1、primefaces 5.0、wamp、netbeans 8.0.2、jsf 2.2
如果需要,这里是树视图
来自 JSF 操作方法的字符串 return 必须代表 JSF 视图 ID,如下所示:
public String submit() {
// ...
return "/some.xhtml";
}
或真正的重定向(您所有的情况都是 simple forwards, not redirects,也正确使用此术语):
public String submit() {
// ...
return "/some.xhtml?faces-redirect=true";
}
或 null
与 "return to current page":
public String submit() {
// ...
return null;
}
如果您在 faces-config.xml
旧 JSF 1.x 样式中使用导航案例,那么 returned 字符串也可以表示导航案例结果。
关于您的具体问题,您在服务器日志中收到以下警告:
Warning: JSF1064: Unable to find or serve resource, /javax.faces.application.FacesMessage@67cc4160.
这意味着 JSF 没有将字符串值 /javax.faces.application.FacesMessage@67cc4160
识别为有效的 JSF 视图 ID。这基本上意味着您在操作方法中确实喜欢以下操作:
public String submit() {
// ...
return "/javax.faces.application.FacesMessage@67cc4160";
}
事实上,您在下面几行中正是这样做的!
} else {
//Wrong pass
// System.out.println( "Sifra je = " + kor.getPassword());
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Pogrešna šifra.");
return msg.toString();
}
} else {
//Wrog user
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Korisnik sa datim korisničkim imenom ne postoji.");
return msg.toString();
}
这不是 return 到当前视图的正确方法,并在上下文中添加了面孔消息。替换 return 行如下:
context.addMessage(null, msg);
return null;
另请参阅:
- How to navigate in JSF? How to make URL reflect current page (and not previous one)
- Creating FacesMessage in action method outside JSF conversion/validation mechanism?