简单JSF举例来介绍JSF应用及此MVC框架的一点好处

本文简单介绍了下JSF,同时利用一个小例子介绍了JSF项目开发过程,从中体会着此MVC框架给开发带来的好处。期间也简单说明了下与struts的一点点区别。

 

JSFjavaServer Faces)是符合J2EE5标准的web端框架。JSF提供标准的编程接口、事件驱动模型、丰富的可扩展的组件库:包括一个核心的JSP标记库用来处理事件、执行验证及其他非UI相关的操作,即core标签库;和一个标准的HTML标记库来表示UI组件,即html标签库。

 

JSF体系结构如下图所示:

由上图可以清晰了解到JSF是一个符合MVC设计规范的web框架,同时所有的请求交由FacesSerletjavax.faces.webapp.FacesServlet)类来处理。我们只需要将这个servlet配置到web.xml,告知服务器那些请求交由此servlet处理就可以。下面进行简单应用。

 

项目结构如下图所示:

 

JSF项目入口:

 

配置web.xml,告诉服务器所有以.faces结尾的请求都交由JSF来处理,web.xml配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>JSFTEST</display-name>
  
  <servlet>
  	<servlet-name>FacesServlet</servlet-name>
  	<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>FacesServlet</servlet-name>
  	<url-pattern>*.faces</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
  	<welcome-file>index.faces</welcome-file>
  </welcome-file-list>
</web-app>


 

接下编写应用:用户输入名称经后台登陆处理后返回欢迎界面。在编写之前,我们看上文web.xml<welcome-file-list>中配置的应用首页是index.faces,这样做一是方便演示,另一很重要一点是想说,如果我们在应用首页中直接使用JSF标签,此时如果以简单java web的形式请求该页面,则会出现javax.servlet.jsp.JspException: Cannot find FacesContext等问题,此时我们可以编写两个页面一个index.jsp(这正的首页,包含JSF标签),一个index.faces(不做任何操作),也有其他方法,此处只为演示做个简短说明,详情后续会深入。

 

Index.faces页面代码:

 

<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>first JSF application</title>
</head>
<body>
</body>
</html>
 

Index.jsp页面代码:

 

<%@taglib uri="http://java.sun.com/jsf/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>first JSF application</title>
</head>
<body>
	<c:view>
		<h:form>
			<h3>请输入您的姓名</h3>
			姓名:
			<h:inputText value="#{user.userName}" />
			<h:commandButton value="登录" action="#{user.login}" />
		</h:form>
	</c:view>
</body>
</html>

 

看到上面的代码,我们发现输入框和登录按钮都是绑定到了一个User上了,这一点也是JSFStruts2在推送数据上所不同的地方。上文中的user是什么呢,这涉及的JSF很关键的知识点Managed Beans,其作用相当于struts2Action,但有所不同。这个user实际对应着javaUserBean,其代码所下所示。

UserBean代码:

package com.test;

public class UserBean {
	
//该属性用于与JSF标签绑定
	private String userName;
	
//该方法被绑定到UI组件(按钮)的action属性
	public String login(){
		
		System.out.println("====login======");
		
		this.userName += " 后台login方法处理了";
		
		return "login";
	}
	

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}
}

 

 Bean之所以能够在上文中的Index.jsp中作为user使用,原因是它配置在JSF核心的配置文件faces-config.xml中作为Managed Beans而存在使用了。

 

faces-config.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>
	
	<managed-bean>
		<managed-bean-name>user</managed-bean-name>
		<managed-bean-class>com.test.UserBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	
	<navigation-rule>
		<from-view-id>/index.jsp</from-view-id>
		<navigation-case>
			<from-outcome>login</from-outcome>
			<to-view-id>/welcome.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
</faces-config>

 

 前段输入用户名进行登录,会调用到UserBeanlogin方法上,其返还的login标识会被JSF捕捉依次判断其跳转的界面,在上文的faces-config.xml中发现其要跳转至/welcome.jsp页面。而要输出的内容不需要我们去关系,原因是我们已发现managed Beans能够同对应的界面标签组件进行绑定。

 

welcome.jsp页面代码:

 

<%@taglib uri="http://java.sun.com/jsf/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>first JSF application</title>
</head>
<body>
	<c:view>
		<h:form>
			<h3>当前登录人</h3>
			<h:outputText value="#{user.userName }" />
		</h:form>
	</c:view>
</body>
</html>


 

程序运行效果:

 

首先用户看到如下输入界面:

 

而后点击登录,会在welcome.jsp中收到后台login方法处理结果:

整个运行过程,我们真正关心的是什么呢,是页面(业务流程)的跳转和登录过程的后台处理(业务逻辑),至于如何达到前端和后端的交互我们没有过多关心,让开发人员将更多精力关注在业务上。

 

从作用上看托管Bean类似struts2Action,但作用模式不同。对于struts2Action而言,应用通过表单提交方式把请求提交到struts2Action;但JSF的托管Bean,系统直接将JSF中的UI组件的行为绑定到托管Bean的属性或方法。

 

总之ManagedBeans用于同JSF标签绑定,这些Beans都是在faces-config.xml配置的,同时此文件也决定着界面的跳转过程。此MVC框架允许我们在配置好Controller后,之关系业务流程及业务逻辑,而不必过多关系复杂的数据交互。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值