问题
I am new to jsf and trying to build app. Problem is when i click Login commandButton nothing happens. So i input some print lines and it show's me that connection with database exist and arguments are valid but it wont redirect.
Here is 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";
}
}
Login 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";
}
}
faces config
<?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>
and web
<?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>
when button is click it call function loadUser from LoginBean and he call redirect from NavigationBean and there should redirect me to specific page depending on status of user, but nothing happens. Also when i input wrong data it show me
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.
don't know is this somehow connected to this.
I'm using glassfish server 4.1, primefaces 5.0, wamp, netbeans 8.0.2, jsf 2.2
Here is tree view if needed
回答1:
The string returned from a JSF action method must represent a JSF view ID like so:
public String submit() {
// ...
return "/some.xhtml";
}
Or a real redirect (all your cases were simple forwards, not redirects, get this terminology right too):
public String submit() {
// ...
return "/some.xhtml?faces-redirect=true";
}
or just null
which means the same as "return to current page":
public String submit() {
// ...
return null;
}
If you're using navigation cases in faces-config.xml
the old JSF 1.x style, then the returned string can also represent a navigation case outcome.
As to your concrete problem, you got the below warning in server log:
Warning: JSF1064: Unable to find or serve resource, /javax.faces.application.FacesMessage@67cc4160.
This means that JSF didn't recognize a string value of /javax.faces.application.FacesMessage@67cc4160
as a valid JSF view ID. This basically means that you did like below in your action method:
public String submit() {
// ...
return "/javax.faces.application.FacesMessage@67cc4160";
}
And indeed, you're doing exactly this in the below lines!
} 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();
}
This is not the right way to return to the current view with a faces message added to the context. Replace the return lines as below:
context.addMessage(null, msg);
return null;
See also:
- 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?
来源:https://stackoverflow.com/questions/31230460/no-redirection-after-button-click