在一个简单的Web应用程序中,我必须将jsp与jsf(用于学校作业)相结合。我使用的是NetBeans 6.7.1。在我的登录页面中,我有以下代码:
<html>
<body>
<form name="form" method="post" action="processuserinfo.jsp" >
UserName: <input type="text" name = "username" value=""><br>
Password: <input type="password" name="userpassword" value=""><br>
<input type="submit" name="submit" value="Login">
</form>
</body>
</html>
</body>
processuserinfo.jsp:
<%@page import="java.util.*" %>
<jsp:useBean id="idhandler" class="dsassignment1java.LoginManager" scope="session">
<jsp:setProperty name="idhandler" property="*"/>
</jsp:useBean>
<% idhandler.validateUser(session, pageContext); %>
但是,方法validateUser
永远不会被调用。我假设它与faces-config.xml中定义的导航规则有关,但我不知道如何正确设置规则。我试图定义这样的规则:
<navigation-case>
<from-outcome>goProcessUserInfo</from-outcome>
<to-view-id>/processuserinfo.jsp</to-view-id>
</navigation-case>
并指定goProcessUserInfo
作为我的表单的操作,但它不起作用。
答案 0 :(得分:4)
您没有以任何方式使用JSF - 这是一个调用JSP(不包含任何JSF标记)的纯HTML页面。
要将登录页面重新构造为JSF JSP,您可以这样编写:
<?xml version="1.0" encoding="UTF-8" ?><jsp:root
xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"><jsp:directive.page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" /><jsp:text><![CDATA[<?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"> ]]>
</jsp:text>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<f:view>
<h:form>
user: <h:inputText value="#{idhandler.username}" /><br />
pw: <h:inputText value="#{idhandler.password}" /><br />
<h:commandButton value="login" action="#{idhandler.validateUser}" />
</h:form>
</f:view>
</body>
</html>
</jsp:root>
这定义了一个带有表单控件的JSF视图,该控件包含两个文本输入控件和一个按钮。输入和按钮绑定到托管bean。托管bean可能如下所示:
public class LoginManager {
private String username;
private String password;
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String validateUser() {
// TODO: check login details
boolean authenticated = true;
return authenticated ? "goProcessUserInfo" : "errorPage";
}
}
validateUser
方法的返回值用于匹配导航案例的<from-outcome>
。托管bean将在您的faces-config.xml
:
<managed-bean>
<managed-bean-name>idhandler</managed-bean-name>
<managed-bean-class>dsassignment1java.LoginManager</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
FYI:在编写JSF应用程序时,您最小化了jsp:...
命名空间中任何标准操作(http://java.sun.com/JSP/Page
标记)的使用,通常避免使用JSTL标记(<c:...
标记http://java.sun.com/jsp/jstl/...
命名空间)并且从不使用scriptlet(<% ... %>
视图嵌入代码)。
请参阅JavaServer Faces section的JEE5 tutorial了解更多信息。