您的位置:首页 > Web前端 > JavaScript

What and How to use JSF

2010-12-07 13:49 405 查看
JSF的简介

JavaServerFaces

是2004年SUN推出的一个规范,也是基于MVC的一种架构

Struts2是基于标准的HTTP请求响应

的模式,而JSF是基于事件

的一种编程模型

JSF中页面表单的每一个输入域都绑定到后台backingbean

中对应的属性上

JSF也是基于Web的

,属于JSP跟Servlet层次,所以使用Tomcat即可运行

而无需借助类似于WebLogic、JBoss、GlassFish

之类的应用服务器



JSF的实现

比较有名的是Apache的MyFaces

,它提供了更多的组件,也是比较成熟的

使用MyFaces

可以满足日常所需的绝大多数功能的需求,比较全面



JSF与ASP.NET

SUN之所以推出JSF

,其实很大程度上是模仿了微软的ASP.NET

编写JSF时也是通过标签来引入相应元素

,例如填写完表单内容后点击提交按钮

它就会执行与提交按钮所绑定的事件所对应的方法

因此从这点来说,JSF跟ASP.NET是异曲同工的

它们都是将期望的原始的Web开发方式转化成接近于桌面应用的开发方式



下面是JSF应用的简单示例

首先是web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 	<!-- 也可以不指定JSF配置文件,默认即/WEB-INF/faces-config.xml -->
	<!-- 类比于Spring的applicationContext.xml -->
	<!-- 
	<context-param>
		<param-name>javax.faces.CONFIG_FILES</param-name>
		<param-value>/WEB-INF/faces-config.xml</param-value>
	</context-param>
	 -->
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>0</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.faces</url-pattern>
	</servlet-mapping>
</web-app>




然后是faces-config.xml文件
<?xml version='1.0' encoding='UTF-8'?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"     version="1.2">
    <!-- ******【使用<managed-bean>标签注册backingbean的信息】****** -->
    <managed-bean>
    	<!-- 在JSF术语中称UserBean叫做ManagedBean,即受JSF框架管理的bean -->
    	<!-- 这里<managed-bean-name>对应页面中#{userBean.username}的值 -->
		<managed-bean-name>userBean</managed-bean-name>
		<managed-bean-class>com.langsin.backingbean.UserBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
	</managed-bean>
	<!-- ******【使用<navigation-rule>标签注册导航规则的信息】****** -->
	<navigation-rule>
		<!-- 指定导航规则来自于某一个视图 -->
		<from-view-id>/login.jsp</from-view-id>
		<!-- 接下来使用<navigation-case>指定导航情况 -->
		<navigation-case>
			<from-outcome>success</from-outcome>
			<to-view-id>/success.jsp</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>failure</from-outcome>
			<to-view-id>/login.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
</faces-config>
<!-- 该文件与web.xml一样,均位于项目的WEB-INF目录下 -->
<!-- 我们可以在MyEclipse中创建完WebProject后,右键项目—→MyEclipse—→Add JSF Capabilities—→依次配置即可 -->




接着是index.jsp页面
<%@ page pageEncoding="UTF-8"%>
<%--
运行时应该直接访问http://127.0.0.1:8088/JSF/login.faces
由于匹配了web.xml中配置的*.faces路径,于是会经过FacesServlet
FacesServlet会直接查找当前工程的login.jsp文件,并加入JSF标签库的支持
若直接访问http://127.0.0.1:8088/JSF/login.jsp,会由于不认识JSF标签导致页面出错
--%>
<%response.sendRedirect(request.getContextPath() + "/login.faces");%>




接着是login.jsp页面
<%@ page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
	<h1>Login Page</h1>
	<h3><font color="red">提示:</font>程序设定的用户名和密码分别为<font color="blue"><strong>admin</strong></font>和<font color="blue"><strong>jadyer</strong></font></h3>
	<br><br>
	
	<B><h:outputText value="#{userBean.message}" /></B>
	
	<h:form>
		<h:outputText value="username: " />
		<h:inputText value="#{userBean.username}" /><BR>
		<%-- 这里#{}表示一种绑定,这里是与userBean对象的username属性进行绑定 --%>
		<h:outputText value="password: " />
		<h:inputSecret value="#{userBean.password}" /><BR>
		<%-- action属性表示:点击该按钮时就会触发userBean对象的validateUser()方法 --%>
		<%-- 但是注意,页面中不要写成action="#{userBean.validateUser()}"的形式 --%>
		<h:commandButton value="Login" action="#{userBean.validateUser}" />
	</h:form>
</f:view>




接着是success.jsp页面
<%@ page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%--
从HTTP角度来说,其实login.jsp和success.jsp是在一个请求里面的
当我们在login.jsp中点提交时进入到服务器端,服务器端是一个请求转发的过程,然后回到了success.jsp页面
因为整个过程是在一个请求里面,而在faces-config.xml中注册的<managed-bean-scope>也是在一个request里面
因此login.jsp和success.jsp共享同一个UserBean的实例,于是在login.jsp中将属性值绑定到userBean对象的属性中
然后在success.jsp中就可以通过<h:outputText value="#{userBean.username}" />取得所绑定的userBean对象的属性值
--%>
<f:view>
	<h:outputText value="username: " />
	<h:outputText value="#{userBean.username}" /><BR>
	<h:outputText value="password: " />
	<h:outputText value="#{userBean.password}" />
</f:view>




最后是ManagedBean
package com.langsin.backingbean;
/**
 * backingbean表示后台bean,这是JSF的一个术语
 * @see 页面上绑定的对象都叫做backingbean
 */
public class UserBean {
	private String username;
	private String password;
	private String message;
	
	/*--三个属性对应的getter和setter略--*/

	//如果该方法最后return null的话,那么该请求就会返回到原页面,即login.jsp页面
	public String validateUser() {
		if ("admin".equals(username) && "jadyer".equals(password)) {
			return "success"; //并不是一定要写成success,也可以使用其它有意义的字符串
		}
		this.setMessage("username or password error!");
		return "failure";
	}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: