天天看点

JSF Struts Spring Hibernate 整合

JSF1.1+Struts2.1+Spring2.0+Hibernate3.1

 图示:

<a target="_blank" href="http://blog.51cto.com/attachment/201012/161935629.jpg"></a>

 JSF1.1 Jar包:

<a target="_blank" href="http://blog.51cto.com/attachment/201012/154254361.jpg"></a>

 MyFaces1.1 Jar包:

<a target="_blank" href="http://blog.51cto.com/attachment/201012/154536777.jpg"></a>

 Struts2.1 Jar包:

<a target="_blank" href="http://img1.51cto.com/attachment/201012/144615926.jpg"></a>

 Spring2.0 Jar包:

<a target="_blank" href="http://img1.51cto.com/attachment/201012/040505662.jpg"></a>

 Hibernate3.1 Jar包:

     官方下载的Hibernate3.1文件夹lib下的全部Jar包

 其他必须包:

<a target="_blank" href="http://blog.51cto.com/attachment/201012/162248618.jpg"></a>

web.xml 配置:

&lt;!-- JSF Configuration --&gt; 

    &lt;servlet&gt; 

        &lt;servlet-name&gt;FacesServlet&lt;/servlet-name&gt; 

        &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt; 

        &lt;load-on-startup&gt;0&lt;/load-on-startup&gt; 

    &lt;/servlet&gt; 

    &lt;servlet-mapping&gt; 

        &lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt; 

    &lt;/servlet-mapping&gt; 

    &lt;!-- Struts2 Configuration --&gt; 

    &lt;filter&gt; 

        &lt;filter-name&gt;struts2&lt;/filter-name&gt; 

        &lt;filter-class&gt; 

            org.apache.struts2.dispatcher.FilterDispatcher  

        &lt;/filter-class&gt; 

    &lt;/filter&gt; 

    &lt;filter-mapping&gt; 

        &lt;url-pattern&gt;/*&lt;/url-pattern&gt; 

    &lt;/filter-mapping&gt; 

        &lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt; 

            org.apache.struts2.dispatcher.ActionContextCleanUp  

    &lt;context-param&gt; 

        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; 

        &lt;param-value&gt;/WEB-INF/applicationContext.xml&lt;/param-value&gt; 

    &lt;/context-param&gt; 

    &lt;!-- Spring Configuration --&gt; 

    &lt;listener&gt; 

        &lt;listener-class&gt; 

            org.springframework.web.context.ContextLoaderListener  

        &lt;/listener-class&gt; 

    &lt;/listener&gt; 

        &lt;filter-name&gt;CharacterEncoding&lt;/filter-name&gt; 

            org.springframework.web.filter.CharacterEncodingFilter  

        &lt;init-param&gt; 

            &lt;param-name&gt;encoding&lt;/param-name&gt; 

            &lt;param-value&gt;gb2312&lt;/param-value&gt; 

        &lt;/init-param&gt; 

    &lt;!-- Sun for JSF Listener --&gt; 

            com.sun.faces.config.ConfigureListener  

    &lt;!-- MyFaces for JSF Listener --&gt; 

            org.apache.myfaces.webapp.StartupServletContextListener  

        &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt; 

        &lt;param-value&gt;client&lt;/param-value&gt; 

faces-config.xml

        这里必须要配置Delegation Configuration

&lt;!-- Delegation Configuration --&gt; 

    &lt;application&gt; 

        &lt;variable-resolver&gt;org.springframework.web.jsf.DelegatingVariableResolver&lt;/variable-resolver&gt; 

    &lt;/application&gt; 

    &lt;!-- Bean Configuration --&gt; 

    &lt;managed-bean&gt; 

        &lt;managed-bean-name&gt;userBean&lt;/managed-bean-name&gt; 

        &lt;managed-bean-class&gt;com.jsf.beans.User&lt;/managed-bean-class&gt; 

        &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;

&lt;!-- 注入Service,userService已在Spring中配置 --&gt; 

        &lt;managed-property&gt; 

            &lt;property-name&gt;service&lt;/property-name&gt; 

            &lt;value&gt;#{userService}&lt;/value&gt; 

        &lt;/managed-property&gt; 

    &lt;/managed-bean&gt; 

    &lt;!-- Navigation Configuration --&gt; 

    &lt;navigation-rule&gt; 

        &lt;from-view-id&gt;/input.jsp&lt;/from-view-id&gt; 

        &lt;navigation-case&gt; 

            &lt;from-outcome&gt;success&lt;/from-outcome&gt; 

            &lt;to-view-id&gt;/success.jsp&lt;/to-view-id&gt; 

        &lt;/navigation-case&gt; 

            &lt;from-outcome&gt;error&lt;/from-outcome&gt; 

            &lt;to-view-id&gt;/error.jsp&lt;/to-view-id&gt; 

    &lt;/navigation-rule&gt; 

struts.xml

&lt;!-- JSF Interceptors --&gt; 

    &lt;package name="jsf" extends="jsf-default"&gt; 

        &lt;interceptors&gt; 

            &lt;interceptor-stack name="jsfFullStack"&gt; 

                &lt;interceptor-ref name="params" /&gt; 

                &lt;interceptor-ref name="basicStack" /&gt; 

                &lt;interceptor-ref name="jsfStack" /&gt; 

            &lt;/interceptor-stack&gt; 

        &lt;/interceptors&gt; 

        &lt;default-interceptor-ref name="jsfFullStack" /&gt; 

    &lt;/package&gt; 

    &lt;!-- Struts Configuration --&gt; 

    &lt;package name="main" namespace="/" extends="struts-default"&gt; 

        &lt;action name="login" class="loginAction" method="login"&gt; 

            &lt;result name="input"&gt;/input2.jsp&lt;/result&gt; 

            &lt;result name="error"&gt;/error.jsp&lt;/result&gt; 

            &lt;result name="success"&gt;/success.jsp&lt;/result&gt; 

        &lt;/action&gt; 

applicationContext.xml

      这里的Service和Action切记将scope设置为prototype类型,该类型持有状态对象

&lt;!-- Service Configuration --&gt; 

    &lt;bean name="userService" id="userService" class="com.jsf.service.UserService" 

        factory-method="getInstance" lazy-init="false" scope="prototype"/&gt; 

    &lt;!-- Action Configuration --&gt; 

    &lt;bean id="loginAction" class="com.jsf.beans.User" scope="prototype"&gt; 

        &lt;property name="service"&gt;&lt;ref local="userService"/&gt;&lt;/property&gt; 

    &lt;/bean&gt; 

User.java 

      UserService与SSH1中的一致。 

package com.jsf.beans;  

import java.io.Serializable;  

import com.jsf.service.UserService;  

import com.opensymphony.xwork2.ActionContext;  

import com.opensymphony.xwork2.ActionSupport;  

public class User extends ActionSupport implements Serializable{  

    private String id;  

    private String name;  

    private String password;  

    private Integer age;  

    public User() {  

        super();  

    }  

    public String getId() {  

        return id;  

    public void setId(String id) {  

        this.id = id;  

    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 Integer getAge() {  

        return age;  

    public void setAge(Integer age) {  

        this.age = age;  

    private UserService service;  

    public UserService getService() {  

        return service;  

    public void setService(UserService service) {  

        this.service = service;  

         //jsf的执行方法  

    public String execute() {  

        if(service.validate(this.id, this.password)) {  

            User user = service.getUser(this.id);  

            this.setAge(user.getAge());  

            this.setName(user.getName());  

            return "success";  

        }  

        return "error";  

         //struts执行方法  

    public String login() throws Exception {  

            ActionContext.getContext().put("userBean", user);  

}  

input.jsp

    纯JSF方式创建页面,如果以JSF方式提交表单,系统抛出异常

      &gt;&gt; javax.servlet.ServletException

&lt;%@ page language="java" pageEncoding="gb2312"%&gt; 

&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%&gt; 

&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%&gt; 

&lt;html&gt; 

    &lt;head&gt; 

        &lt;title&gt;JSSH JSF&lt;/title&gt; 

    &lt;/head&gt; 

    &lt;body&gt; 

        &lt;f:view&gt; 

            &lt;h:form&gt; 

                用户名:&lt;h:inputText value="#{userBean.id}" /&gt; 

                密码:&lt;h:inputSecret value="#{userBean.password}" /&gt; 

                &lt;h:commandButton value="登录" action="#{userBean.execute}"&gt;&lt;/h:commandButton&gt; 

            &lt;/h:form&gt; 

        &lt;/f:view&gt; 

    &lt;/body&gt; 

&lt;/html&gt; 

input2.jsp

      使用JSF与Struts混合标签创建页面,以Struts方式提交表单,系统正确运转

&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt; 

        &lt;title&gt;JSSH Struts&lt;/title&gt; 

    &lt;f:view&gt; 

            &lt;s:form action="login" namespace="/"&gt; 

                &lt;s:textfield name="id" label="用户名"/&gt; 

                &lt;s:password name="password" label="密码"/&gt; 

                &lt;s:submit value="登录" /&gt; 

            &lt;/s:form&gt; 

    &lt;/f:view&gt; 

 总结:

在web.xml中使用Sun和MyFaces对JSF的监听

配置faces-config.xml中要托管的解析器DelegatingVariableResolver

在struts.xml中建立JSF的拦截器,之后的package应该继承该配置

在页面中可以实现JSF与Struts混编,但是只能以struts方式进行表单提交,如果以JSF方式进行表单提交,将会抛出异常

本文转自 sundunjam 51CTO博客,原文链接:http://blog.51cto.com/sunspot/469073,如需转载请自行联系原作者