JSF的简介
JavaServerFaces是2004年SUN推出的一个规范,也是基于MVC的一种架构Struts2是基于标准的HTTP请求响应的模式,而JSF是基于事件的一种编程模型JSF中页面表单的每一个输入域都绑定到后台backingbean中对应的属性上JSF也是基于Web的,属于JSP跟Servlet层次,所以使用Tomcat即可运行而无需借助类似于WebLogic、JBoss、GlassFish之类的应用服务器JSF的实现比较有名的是Apache的MyFaces,它提供了更多的组件,也是比较成熟的使用MyFaces可以满足日常所需的绝大多数功能的需求,比较全面
JSF与ASP.NETSUN之所以推出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文件
接着是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