发生了一个非常奇怪的问题: 在Tomcat 7.0服务器上第一次启动我的JSF项目时,用户名的验证器不工作。如果我重新加载项目,一切突然就像魅力一样。奇怪的是,registerUser方法总是工作。验证器在第一次启动服务器时不起作用,在项目重新加载后工作
这里是我的代码片段:
<h:outputLabel value="Username:" for="username"></h:outputLabel>
<h:inputText id="username" value="#{register.name}" validator="# {register.validateName}" validatorMessage="Suggestion: Try another name">
<h:message for="username"></h:message></h:inputText>
下一页我register.java豆:
package fileserver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
@ManagedBean
@SessionScoped
public class Register {
public String name;
public String passWord;
public String queryString;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String registerUser() throws SQLException{
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e1) {
System.out.println("Damn");
e1.printStackTrace();
}
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/JavaServerFaces", "postgres",
"123456");
System.out.println("Connection success");
} catch (SQLException e) {
System.out.println("Connection Failed! Check output console");
e.printStackTrace();
return null;
}
queryString= "INSERT INTO tbl_benutzer"
+ "(username, password)"
+ "VALUES ('"+ name+"', '"+ passWord+"')";
Statement sql = connection.createStatement();
if (connection != null) {
sql.execute(queryString);
System.out.println("Successfully added:VALUES ('"+name+"', '"+ passWord+"')");
sql.close();
connection.close();
return "/index.xhtml";
}
//is here because the method requires a return value
return null;
}
public void validateName(FacesContext context, UIComponent component, Object value)
throws ValidatorException, SQLException {
System.out.println(context.toString());
queryString = "SELECT username FROM tbl_benutzer WHERE username='"+ name +"'";
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e1) {
System.out.println("Shit");
e1.printStackTrace();
}
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/JavaServerFaces", "postgres",
"123456");
System.out.println("Connection success");
} catch (SQLException e) {
System.out.println("Connection Failed! Check output console");
e.printStackTrace();
}
Statement names=connection.createStatement();
ResultSet Nameset=names.executeQuery(queryString);
if(Nameset.next()){
FacesMessage message = new FacesMessage();
message.setSeverity(FacesMessage.SEVERITY_ERROR);
message.setSummary("Name is already used.");
message.setDetail("Name is already used.");
context.addMessage("userForm:register", message);
throw new ValidatorException(message);
}
}
}
经过一番研究,我发现,这串名字是在验证空一些未知的原因并且我无法获取它,即使我直接在此方法中调用getName()。 有没有人有解决方案?
'validator =“#{register.validateName}”'从您的代码中确切复制了一份副本吗?在'#'和'{'之间加上空格?在这个代码中,有一个严重的SQL注入漏洞。 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html – BalusC 2014-09-05 14:37:25
这只是大学的一个项目。主要关注的是服务器,而不是数据库,我知道这个漏洞,但我访问数据库的方式并不那么重要。此外,#和{之间的空白是一个复制/粘贴错误 – CookieMadness 2014-09-05 16:06:04
另外我只是发现主要问题似乎是名称为null时,验证程序被调用。在验证者被调用的时候,似乎有一个问题。我能以某种方式延迟这一点吗? – CookieMadness 2014-09-05 16:26:44