`
output
  • 浏览: 16810 次
  • 性别: Icon_minigender_1
  • 来自: 海口
社区版块
存档分类
最新评论

CVSPROTO_JSF_MyBatis_项目总结

阅读更多

 

公司的项目已接近尾声,时间长了,很多东西都忘了……
我脑子不好使,在此重新搭建一个项目作为复习,顺便边学习JQuery Mobile
本项目使用JSF+ibatis搭建,不同的设备使用不同的css……其他的忘了,郁闷中

我是先在QQ邮箱记事本写,再拷过来的,图片显示不了,懒得搞了.....

一、环境搭建
 新建项目
导入相关Jar包
commons-beanutils-1.7.0.jar
commons-collections-3.1.jar
commons-logging-1.1.1.jar
javax.faces-2.1.6.jar
jstl-api-1.2.jar
jstl-impl-1.2.jar
log4j-1.2.16.jar
mybatis-2.3.5.jar
servlet-api.jar

二、划分页面模块和编辑页面
1. 各模块组成为:

1. 制作HTML页面
其中INTR模块(文件夹)中的PINTR001.jsp是网站首页
2. 转化成相应的JSF标签:
导入
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri ="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib tagdir="/WEB-INF/tags/jsfx" prefix="jsfx" %>

PINTR001.jsp页面代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri ="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib tagdir="/WEB-INF/tags/jsfx" prefix="jsfx" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
  <!-- 公共JavaScript文件 -->
  <script type="text/javascript" src="../script/common/jquery-1.7.1.min.js"></script>
  <script type="text/javascript" src="../script/common/jquery.alerts.js"></script>
  <!-- 公共CSS文件 -->
  <link rel="stylesheet" href="../css/common/jquery.alerts.css" type="text/css" />
</head>
<body>
<f:view> <%-- JSF的标签要写在<f:view>里面 --%>
<h:form id="pintr001Form" >
账号:
<h:inputText id="username" styleClass="" accesskey="u" value="请输入账号" ></h:inputText>
<br/>
密码:
<h:inputSecret id="password" styleClass="" accesskey="p" value="" ></h:inputSecret>
<br/>
<h:commandButton id="submit" value="提交" ></h:commandButton>
</h:form>
</f:view>
</body>
</html>
 
页面效果:

三、Java集成
1. 编写Form JavaBean
Form JavaBean是跟html页面的中Form表单绑定的,页面中用到了账号username和密码password,所以在 PINTR001Form.java应该有:

// PINTR001Form.java
package li.kang.wang.badan.intr.pintr001.pr.form;

/** PINTR001Form用于存储表单信息 */
public class PINTR001Form {
    
    /** 账号 */
    private String username;
    
    /** 密码 */
    private String password;

    /**
     * @return the username
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }    
}
 
2. 在faces-config.xml中注册,JSF才能识别是“自己人”:
<?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_2_0.xsd"
  version="2.0">

<!-- Home -->
  <managed-bean>
    <managed-bean-name>PINTR001Form</managed-bean-name>
    <managed-bean-class>li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>

</faces-config>
 

3. 这样, <h:inputText> 标签就可以识别出了, 接下来绑定Form Bean

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri ="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib tagdir="/WEB-INF/tags/jsfx" prefix="jsfx" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
  <!-- 公共JavaScript文件 -->
  <script type="text/javascript" src="../script/common/jquery-1.7.1.min.js"></script>
  <script type="text/javascript" src="../script/common/jquery.alerts.js"></script>
  <!-- 公共CSS文件 -->
  <link rel="stylesheet" href="../css/common/jquery.alerts.css" type="text/css" />
</head>
<body>
<f:view> <%-- JSF的标签要写在<f:view>里面 --%>
<h:form id="pintr001Form" >
账号:
<h:inputText id="username" styleClass="" accesskey="u" value="#{PINTR001Form.username }" ></h:inputText>
<br/>
密码:
<h:inputSecret id="password" styleClass="" accesskey="p" value="#{PINTR001Form.password }" ></h:inputSecret>
<br/>
<h:commandButton id="submit" value="提交" ></h:commandButton>
</h:form>
</f:view>
</body>
</html>
 
页面效果:
现在点击"提交",页面只是刷新了一下,因为还没给form指定action,它不知道做啥反应……
4. 添加事件
这里把事件放在一个独立的Bean中, 
package li.kang.wang.badan.intr.pintr001.pr.event;

import li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form;

/** PINTR001页面Event */
public class PINTR001Event {
    /* 用来保存表单数据 */
    private PINTR001Form pintr001Form;

    /**
     * @return the pintr001Form
     */
    public PINTR001Form getPintr001Form() {
        return pintr001Form;
    }

    /**
     * @param pintr001Form the pintr001Form to set
     */
    public void setPintr001Form(PINTR001Form pintr001Form) {
        this.pintr001Form = pintr001Form;
    }
    
    /**
     * 登录验证
     * @return
     */
    public String checkUser() {
        
        System.out.println("checkUser:\n "
        + "username: " + pintr001Form.getUsername() + "\n" 
        + "password: " + pintr001Form.getPassword());
        
        if (pintr001Form.getUsername().equals("wkl") && pintr001Form.getPassword().equals("wkl")) {
            return "loginSuccess";
        }
        
        return "loginError";
    }
}
 

5. 在faces-config.xml注册事件Bean
<?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_2_0.xsd"
  version="2.0">

<!-- Home -->
  <managed-bean>
    <managed-bean-name>PINTR001Form</managed-bean-name>
    <managed-bean-class>li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>

  <managed-bean>
    <managed-bean-name>PINtr001Event</managed-bean-name>
    <managed-bean-class>li.kang.wang.badan.intr.pintr001.pr.event.PINTR001Event</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
      <property-name>pintr001Form</property-name>   <!-- 这是PINTR001Event.java中的属性 -->
      <property-class>li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form</property-class>
      <value>#{PINTR001Form}</value>                       <!-- 绑定了PINTR001Form的值,才能取得表单数据 -->
    </managed-property>  
  </managed-bean>

</faces-config>
 
6. jsp页面绑定action事件
action事件是一个public型返回值为Object(一般为String)的无参函数
actionListener:其响应方法可以有返回值,也可以无返回值,有返回值时,不能通过返回值控制页面的跳转,页面始终在当前视图。其响应方法的参数必须为 javax.faces.event.ActionEvent 类型,否者报错(响应方法找不到)。

详细说明:(引用自: http://hintcnuie.iteye.com/blog/135593)
        action()处理的是业务逻辑.实际上JSF会自动产生一个"预设的ActionListener"来处理事件,并根据其返回值决定页面跳转.第五阶段:调用应用执行,    会影响到页面间的导航(navigation)。主要处理一些业务逻辑并返回几个业务逻辑结果(String类型),JSF的导航系统将会根据这个来选择恰当的下一个页面. 会提交表单.
       actionListener(ActionEvent e)处理页面上组件的"监听事件".第五阶段:调用应用执行,  不会影响到导航.主要操作当前页面内的组件,或者是进行一些业务模型上的改变,或者是修改backing bean(托管Bean)的属性等,并不会出现在页面间的跳转。会提交表单. 
         valueChangeListener(ValueChangeEvent event)处理页面上组件值变化的"监听事件","第三阶段:验证请求值"执行 
 注意:
      ActionListener (事件监听器)是用于解决只影响用户界面的事件 ,    特别地,在beans的form数据被加载和触发验证前被调用 , 用immediate=“true”指明这个行为不触发验证 , 在监听器调用后,会重新显示表单 , 不应用导航规则,不重定向页面 
   Action   隶属于按钮、超链接和图形映射控件,自动提交对应表单 。
   ValueChangeListener    隶属于单选框、组合框、列表框、复选框、文本框等控件,需要用onclick=“submit()”或onchange=“submit()”的方式提交表单

此处,我用action,绑定checkUser()函数
7. 编辑页面跳转规则
checkUser()中,我定义如果用户名和密码符合要求,就返回"loginSuccess",跳转PINTR002.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>成功登录</title>
</head>
<body>
rigth!
</body>
</html>
 
否则返回"loginError",跳转PINTR003.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录失败</title>
</head>
<body>
error!
</body>
</html>
 
JSF会根据Action事件的函数返回值,在faces-config.xml寻找匹配的配置来决定跳转方向:
在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_2_0.xsd"
  version="2.0">

<!-- Home -->
  <managed-bean>
    <managed-bean-name>PINTR001Form</managed-bean-name>
    <managed-bean-class>li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>

  <managed-bean>
    <managed-bean-name>PINtr001Event</managed-bean-name>
    <managed-bean-class>li.kang.wang.badan.intr.pintr001.pr.event.PINTR001Event</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
      <property-name>pintr001Form</property-name>  <!-- 这是PINTR001Event.java中的属性 -->
      <property-class>li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form</property-class>
      <value>#{PINTR001Form}</value>  <!-- 绑定了PINTR001Form的值,才能取得表单数据 -->
    </managed-property>  
  </managed-bean>
  
  <!-- Home -->
  <!-- 这里容易根据字面意思理解 -->
  <navigation-rule>
    <description>八丹Android应用主页</description>
    <display-name>八丹Android应用主页</display-name>
    <from-view-id>/INTR/PINTR001.jsp</from-view-id>    
    <navigation-case>
      <from-outcome>home</from-outcome>
      <to-view-id>/INTR/PINTR001.jsp</to-view-id>
      <redirect/> <!-- 重定向, 不填的话地址栏是上一个页面的地址 -->
    </navigation-case>
    <navigation-case>
      <from-outcome>loginSuccess</from-outcome>
      <to-view-id>/INTR/PINTR002.jsp</to-view-id>
      <redirect/>
    </navigation-case>
    <navigation-case>
      <from-outcome>loginError</from-outcome>
      <to-view-id>/INTR/PINTR003.jsp</to-view-id>
      <redirect/>
    </navigation-case>

</faces-config>
 
点击"提交"后, PINTR001Event先取得pintr001Form绑定好的表单
然后执行action指定的事件函数:
账号密码不符合, 跳转PINTR003.jsp
如果填的是:
则跳转PINTR002.jsp
四、log4j XML配置 (参考http://sun-cat.iteye.com/blog/38736)

log4j在初始化的时候 会先在classpath中寻找 log4j.porperties,当找不到该文件时,会接着寻找log4j.xml

研究了一下xml配置文件的书写方式,提供一个样例,具体的可以参考 log4j.dtd

通过<logger></logger>的定义可以将各个包中的类日志输出到不同的日志文件中

 以下是完整的log4j.xml :

 

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

	<!-- CONSOLE -->
	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern"
				value="%d{yyyy/MM/dd HH:mm:ss} %-5p [%c{1}] - %m%n" />
		</layout>
	</appender>

  <!-- INFO -->
	<appender name="INFO" class="org.apache.log4j.FileAppender">
	  <param name="File" value="f:/logs/badan/application.log" />
	  <layout class="org.apache.log4j.PatternLayout">
	    <param name="ConversionPattern"
	           value="%d{yyyy/mm/dd} %p:%r:%c:%m%n" />
	  </layout>
	</appender>

	<!-- ERROR -->
	<appender name="ERROR"
		class="org.apache.log4j.DailyRollingFileAppender">
		<param name="Threshold" value="error" />
		<param name="File" value="f:/logs/badan/error.log" />
		<param name="Append" value="true" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern"
				value="%d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n" />
		</layout>
	</appender>

	<!-- DEBUG -->
	<appender name="DEBUG"
		class="org.apache.log4j.DailyRollingFileAppender">
		<param name="Threshold" value="debug" />
		<param name="File" value="f:/logs/badan/debug.log" />
		<param name="Append" value="true" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern"
				value="%d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n" />
		</layout>
	</appender>

	<logger name="org.apache">
		<level value="warn" />
		<appender-ref ref="DEBUG" />
		<appender-ref ref="INFO" />
		<appender-ref ref="ERROR" />
	</logger>

	<logger name="java.sql">
		<level value="warn" />
 		<appender-ref ref="CONSOLE" />
 		<appender-ref ref="DEBUG" />
		<appender-ref ref="INFO" />
		<appender-ref ref="ERROR" />
	</logger>

	<logger name="li.kang.wang.badan">
		<level value="debug" />
 		<appender-ref ref="CONSOLE" />
 		<appender-ref ref="DEBUG" />
		<appender-ref ref="INFO" />
		<appender-ref ref="ERROR" />
	</logger>
</log4j:configuration>
 

 

最后要把log4j.xml的路径加项目的Java Build Path中,即classpath,
这个让我折腾了很久,一直说报警告郁闷啊!
log4j:WARN No appenders could be found for logger (li.kang.wang.badan.intr.pintr001.pr.event.PINTR001Event).
log4j:WARN Please initialize the log4j system properly.

 




接来下可以在java代码中使用log4j了
package li.kang.wang.badan.intr.pintr001.pr.event;

import li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form;

import org.apache.log4j.Logger;

/** PINTR001页面Event */
public class PINTR001Event {

    private static Logger log = Logger.getLogger(PINTR001Event.class.getName());

    private PINTR001Form pintr001Form;

    /**
     * @return the pintr001Form
     */
    public PINTR001Form getPintr001Form() {
        return pintr001Form;
    }

    /**
     * @param pintr001Form
     *            the pintr001Form to set
     */
    public void setPintr001Form(PINTR001Form pintr001Form) {
        this.pintr001Form = pintr001Form;
    }

    /**
     * 登录验证
     * 
     * @return
     */
    public String checkUser() {

        log.debug("checkUser:\n" + "username: " + pintr001Form.getUsername()
                + "\n" + "password: " + pintr001Form.getPassword());

        if (pintr001Form.getUsername().equals("wkl")
                && pintr001Form.getPassword().equals("wkl")) {
            return "loginSuccess";
        }

        return "loginError";
    }
}
 
运行效果:
控制台输出:
日志文件输出

五、Ibatis集成
1. 导入mybatis-2.3.5.jar
2. 编辑ibatis配置文件
3. SqlMapConfig.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<!-- Always ensure to use the correct XML header as above! -->
<sqlMapConfig>

  <!--
    The properties (name=value) in the file specified here can be used
    placeholders in this config file (e.g. “${driver}”. The file is usually relative
    to the classpath and is optional.
  -->

  <properties resource="ibatis/resources/SqlMapConfig.properties" />

  <!--
    These settings control SqlMap configuration details, primarily to do
    with transaction management. They are all optional (see the Developer Guide
    for more).
  -->

  <settings
    cacheModelsEnabled="true"    enhancementEnabled="true"    lazyLoadingEnabled="true"    
    maxRequests="32"    maxSessions="10"    maxTransactions="5"    useStatementNamespaces="true" />

  <!--
    Configure a datasource to use with this SQL Map using SimpleDataSource.
    Notice the use of the properties from the above resource
  -->

  <transactionManager type="JDBC" >
    <dataSource type="SIMPLE" >
      <property        name="JDBC.Driver"             value="${driver}" />
      <property        name="JDBC.ConnectionURL"      value="${url}" />
      <property        name="JDBC.Username"           value="${username}" />
      <property        name="JDBC.Password"           value="${password}" />
      <property        name="JDBC.DefaultAutoCommit"  value="#{defaultautocommit}" />
    </dataSource>
  </transactionManager>

  <!--
    Identify all SQL Map XML files to be loaded by this SQL map. Notice
    the paths are relative to the classpath. 
  -->
  <!-- 稍后添加 -->
  <sqlMap resource="/li/kang/wang/badan/intr/pintr001/db/sql/PINTR001SqlMap.xml" />

</sqlMapConfig>
 
SqlMapConfig.xml引用的配置SqlMapConfig.properties:
# This is just a simple properties file that simplifies automated configuration
# of the SQL Maps configuration file (e.g. by Ant builds or continuous
# integration tools for different environments\u2026 etc.)
# These values can be used in any property value in the file above (e.g. \u201c${driver}\u201d)
# Using a properties file such as this is completely optional.
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.1.116:3306/badan
username=wkl
password=wkl
defaultautocommit=false
 
4. 编写数据库公共实例类

// SqlConfig.java
package li.kang.wang.badan.common;

import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;

import org.apache.log4j.Logger;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

/**
 * 系统公共SqlMap配置
 */
public class SqlConfig {
    /** sqlMap instance */
    private static SqlMapClient sqlMap;

    /** Log */
    private static Logger log = Logger.getLogger(SqlConfig.class.getName());

    /** 静态代码块优先执行 */
    static {

        Reader reader = null;

        try {
            String resource = "ibatis/resources/SqlMapConfig.xml";
            Resources.setCharset(Charset.forName("UTF-8"));
            reader = Resources.getResourceAsReader(resource);
            sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
        } catch (Exception e) {
            log.error("SqlMapConfig.xml连接异常");
            log.error(e);
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    log.error("SqlMapConfig.xml连接异常");
                    log.error(e);
                }
            }
        }
    }

    /**
     * SqlMap实例取得
     * @return SqlMapClient
     */
    public static SqlMapClient getSqlMapInstance() {
        return sqlMap;
    }
}
 
5. 准备数据库表
创建数据库badan
再创建表user
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(20) NOT NULL auto_increment,
  `username` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'wkl', 'wkl');
INSERT INTO `user` VALUES ('2', 'ok', 'ok');
 
6. 编写DB层Java代码
6.1 编写DTO JavaBean 
DTO是Data Transfer Object(数据传输对象), 用来"缓存"数据库数据

package li.kang.wang.badan.intr.pintr001.db.dto;

import java.io.Serializable;

/** 数据库表绑定Java Bean */
public class UserInfo implements Serializable{

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 1646885493639314417L;

    /** 账号 */
    private String username;
    
    /** 密码 */
    private String password;

    /**
     * @return the username
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }
}
 
6.2 配置INTR模块的SqlMap
// PINTR001SqlMap.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="PINTR001" >
  <resultMap
    id="ResultMap01"
    class="li.kang.wang.badan.intr.pintr001.db.dto.UserInfo" > <!-- 绑定DTO JavaBean -->
    <result
      column="username"      javaType="string"      jdbcType="VARCHAR"      property="username" />
    <result
      column="password"      javaType="string"      jdbcType="VARCHAR"      property="password" />
  </resultMap>

  <!-- 选择用户信息 -->
  <select
    id="getUserInfo"
    parameterClass="li.kang.wang.badan.intr.pintr001.db.dto.UserInfo"
    resultMap="ResultMap01" >
        SELECT
              username, password
        FROM
              user
       WHERE username = #username:VARCHAR#
       AND password = #password:VARCHAR#
  </select>
</sqlMap>
 
在ibatis.resources.SqlMapConfig.xml中引用PINTR001SqlMap.xml
添加   <sqlMap resource="/li/kang/wang/badan/intr/pintr001/db/sql/PINTR001SqlMap.xml" />
至此,DB层配置完了

7. 编写AP层
7.1 Event函数通过LogicBean操作数据库
在中:
package li.kang.wang.badan.intr.pintr001.pr.event;

import li.kang.wang.badan.intr.pintr001.ap.data.ContextData;
import li.kang.wang.badan.intr.pintr001.ap.logicbean.ISelectLogicBean;
import li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form;

import org.apache.log4j.Logger;

/** PINTR001页面Event */
public class PINTR001Event {

    private static Logger log = Logger.getLogger(PINTR001Event.class.getName());

    private PINTR001Form pintr001Form;
    
   // 通过接口, 可以从faces-config.xml指定pintr001SelectLogicBean对应某个实际的值(实现类)
    private ISelectLogicBean pintr001SelectLogicBean; 

    /**
     * @return the pintr001Form
     */
    public PINTR001Form getPintr001Form() {
        return pintr001Form;
    }

    /**
     * @param pintr001Form
     *            the pintr001Form to set
     */
    public void setPintr001Form(PINTR001Form pintr001Form) {
        this.pintr001Form = pintr001Form;
    }

    /**
     * @return the pintr001SelectLogicBean
     */
    public ISelectLogicBean getPintr001SelectLogicBean() {
        return pintr001SelectLogicBean;
    }

    /**
     * @param pintr001SelectLogicBean the pintr001SelectLogicBean to set
     */
    public void setPintr001SelectLogicBean(ISelectLogicBean pintr001SelectLogicBean) {
        this.pintr001SelectLogicBean = pintr001SelectLogicBean;
    }
    
    /**
     * 登录验证
     * 
     * @return
     */
    public String checkUser() {
        
        ContextData contextData = new ContextData();        

        log.debug("checkUser:\n" 
                + "username: " + pintr001Form.getUsername()
                + "\n" + "password: " + pintr001Form.getPassword());
        
        // 通过LogicBean查询数据库
        contextData.setUsername(pintr001Form.getUsername());
        contextData.setPassword(pintr001Form.getPassword());
        
        if(pintr001SelectLogicBean.checkUserInfo(contextData)){
            return "loginSuccess";
        }

        return "loginError";
    }
}
 
7.2 编写查询条件JavaBean和查询结果JavaBean
ContextData.java用来保存各个页面之间传递的参数和SQL查询条件

SelectResultData.java用来保存查询结果
package li.kang.wang.badan.intr.pintr001.ap.data;

import java.util.List;

/** 保存数据库查询结果 */
public class SelectResultData {
    
    /** 查询结果List */
    private List<ListContextData> list;

    /**
     * @return the list
     */
    public List<ListContextData> getList() {
        return list;
    }

    /**
     * @param list the list to set
     */
    public void setList(List<ListContextData> list) {
        this.list = list;
    }
}
 
ListContextData.java 用于存储多条记录常用表格显示,如XX产品一览 
package li.kang.wang.badan.intr.pintr001.ap.data;

/** 用于存储多条记录常用表格显示,如用户一览 */
public class ListContextData {
    /** ID */
    private int userId;
    
    /** 账号 */
    private String username;
    
    /** 密码 */
    private String password;

    /**
     * @return the userId
     */
    public int getUserId() {
        return userId;
    }

    /**
     * @param userId the userId to set
     */
    public void setUserId(int userId) {
        this.userId = userId;
    }

    /**
     * @return the username
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }
}
 
7.3 编写LogicBean

// ISelectLogicBean.java
package li.kang.wang.badan.intr.pintr001.ap.logicbean;

import li.kang.wang.badan.intr.pintr001.ap.data.ContextData;
import li.kang.wang.badan.intr.pintr001.ap.data.SelectResultData;

/** ISelectLogicBean接口 */
public interface ISelectLogicBean {

    /** 
     * 查询用户信息 
     */
    public SelectResultData getUserList();

    /**
     * 验证用户信息
     */
    public boolean checkUserInfo(ContextData contextData);
}

// SelectLogicBean.java
package li.kang.wang.badan.intr.pintr001.ap.logicbean;

import li.kang.wang.badan.common.SqlConfig;
import li.kang.wang.badan.intr.pintr001.ap.data.ContextData;
import li.kang.wang.badan.intr.pintr001.ap.data.SelectResultData;
import li.kang.wang.badan.intr.pintr001.db.dto.UserInfo;

import org.apache.log4j.Logger;

import com.ibatis.sqlmap.client.SqlMapClient;

/** SelectLogicBean实现类 */
public class SelectLogicBean implements ISelectLogicBean {

    private static Logger log = Logger.getLogger(SelectLogicBean.class
            .getName());

    @Override
    /**
     * 查询用户信息 
     */
    public SelectResultData getUserList() {
        
        return null;
    }

    @Override
    /**
     * 验证用户信息
     */
    public boolean checkUserInfo(ContextData contextData) {
        
        /** 取得sqlMap实例 */
        SqlMapClient sqlMap = SqlConfig.getSqlMapInstance();
        
        try {
            // 事务开始
            sqlMap.startTransaction();
            // 
            UserInfo userInfo = new UserInfo();
            userInfo.setUsername(contextData.getUsername());
            userInfo.setPassword(contextData.getPassword());
            
            Object queryResult = sqlMap.queryForObject("PINTR001.getUserInfo", userInfo);
            
            sqlMap.commitTransaction();
            
            if (queryResult != null){
                return true;
            }
            
        } catch (Exception e) {
            log.error(e.getMessage());
        }finally{
            try {
                sqlMap.endTransaction();
            } catch (Exception e) {
                
            }
        }
        return false;
    }
}
 
7.4 注册LogicBean到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_2_0.xsd"
  version="2.0">

<!-- Home -->
  <managed-bean>
    <managed-bean-name>PINTR001Form</managed-bean-name>
    <managed-bean-class>li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
  <managed-bean>
    <managed-bean-name>PINTR001SelectLogicBean</managed-bean-name>
    <managed-bean-class>li.kang.wang.badan.intr.pintr001.ap.logicbean.SelectLogicBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean>
  <managed-bean>
    <managed-bean-name>PINtr001Event</managed-bean-name>
    <managed-bean-class>li.kang.wang.badan.intr.pintr001.pr.event.PINTR001Event</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
      <property-name>pintr001Form</property-name>  <!-- 这是PINTR001Event.java中的属性 -->
      <property-class>li.kang.wang.badan.intr.pintr001.pr.form.PINTR001Form</property-class>
      <value>#{PINTR001Form}</value>  <!-- 绑定了PINTR001Form的值,才能取得表单数据 -->
    </managed-property>
    <managed-property>
      <property-name>pintr001SelectLogicBean</property-name>
      <property-class>li.kang.wang.badan.intr.pintr001.ap.logicbean.ISelectLogicBean</property-class>
      <value>#{PINTR001SelectLogicBean}</value>
    </managed-property>
  </managed-bean>
  
  <!-- Home -->
  <navigation-rule>
    <description>八丹Android应用主页</description>
    <display-name>八丹Android应用主页</display-name>
    <from-view-id>/INTR/PINTR001.jsp</from-view-id>    
    <navigation-case>
      <from-outcome>home</from-outcome>
      <to-view-id>/INTR/PINTR001.jsp</to-view-id>
      <redirect/>
    </navigation-case>
    <navigation-case>
      <from-outcome>loginSuccess</from-outcome>
      <to-view-id>/INTR/PINTR002.jsp</to-view-id>
      <redirect/>
    </navigation-case>
    <navigation-case>
      <from-outcome>loginError</from-outcome>
      <to-view-id>/INTR/PINTR003.jsp</to-view-id>
      <redirect/>
    </navigation-case>
  </navigation-rule>

</faces-config>
 
8. 运行验证
首先给表增加一条记录

运行结果:
然后更改用户名为

运行结果:
运行记录Log:

去耍了,过几天再写了,(*^__^*) 嘻嘻……
0
2
分享到:
评论

相关推荐

    jsf_page.rar_ jsf_page_JSF_PAGE_java jsf_jsf glassfish_jsp page

    在这个名为"jsf_page.rar"的压缩包中,包含了一个关于JSF分页处理的示例,这对于理解和实现高效的数据展示非常有用。下面我们将详细探讨JSF分页、相关技术以及如何在实际项目中应用。 1. JSF分页基础: - 分页是...

    qt.rar_jsf example_jsf spring hibernate_jsf下拉菜单_spring jsf hiber

    "jsf_spring_hibernate" 明确了这个示例将JSF、Spring和Hibernate三者结合在一起,展示了它们在实际项目中的协同工作。"jsf下拉菜单" 和 "spring_jsf_hibernate" 进一步强调了下拉菜单的实现以及三大框架的集成。 ...

    Jsf.rar_JSF_JSF 增删改查_jsf的增删改查_增删_增删改查

    "Jsf.rar_JSF_JSF 增删改查_jsf的增删改查_增删_增删改查"这个标题暗示了我们关注的是JSF框架中用于数据库操作的基础功能,即增删改查(CRUD)。 在JSF中实现增删改查,通常涉及以下几个关键知识点: 1. **JSF组件...

    jsf-api-2.0.3.jar.zip_jsf api_jsf jar包_jsf-api-2.0.3.jar_jsf-api

    在实际开发中,为了确保项目顺利运行,开发者需要将`jsf-api-2.0.3.jar` 和其他必要的JSF库添加到项目的`WEB-INF/lib`目录下,或者使用构建工具(如Maven或Gradle)进行依赖管理。同时,还需要配置Tomcat服务器,使...

    jsf.rar_JSF_j2ee jsf_jsf j2

    JSF,全称为JavaServer Faces,是Oracle公司开发的一个用于构建用户界面的Java EE标准框架。这个名为"jsf.rar"的压缩包包含了关于JSF的详细技术文档,旨在为初学者提供一个全面且简洁的学习资源。让我们深入探讨JSF...

    jsf-spring-mybatis:使用 JSF、Spring 和 Mybatis 构建 JEE 应用程序的模板

    jsf-spring-mybatis 使用 JSF、Spring 和 Mybatis 构建 JEE 应用程序的模板 简单的模式 坚持 国际化 JSF 处理异常 构架 JDK 8 Tomcat 8 / 野蝇 8 / 码头 9 Spring IO 平台 1.1.2(JSF 2.2、Spring 4.1、Hibernate...

    JSF-AV-rules.rar_JSF AV rule_JSF-AV_JSF-AV-rules_航空C++编程规范

    JSF,全称为"Joint Strike Fighter"(联合攻击战斗机)项目,可能是指该编程规范是为了解决类似军事或航空航天领域的复杂软件问题而制定的。AV可能代表航空(Aviation)或者安全相关的术语(AV规则),表明这份文档是为...

    JAVA-EE.rar_EJB考试_java ee 编写html_jsf jpa 考试_jsf jsp ejb

    【JAVA-EE.rar_EJB考试_java ...通过这个压缩包,开发者可以学习如何在实际项目中集成和运用这些Java EE技术,以构建高效、稳定的Web应用程序。对于初学者,这是一个很好的实践案例,可以加深对JAVA-EE开发流程的理解。

    JSF-EJB3.rar_EJB3.rar_base.util.EJBUtil_ejb jsf_jsf ejb3_jsf mys

    在"JSF-EJB3.rar"这个压缩包中,我们找到了一个使用JSF和EJB3结合开发的示例项目。项目包含两个主要部分:"EJB3DemoEJB"和"EJB3DemoWeb"。前者代表了EJB3的实现,包含了业务逻辑组件(Session Beans),而后者则为...

    JSFLoginDemo.zip_JSF_JSFLoginDe_JSFLoginDemo.zip _jsf hibernate

    这个登录示例项目可以帮助开发者理解如何在实际应用中整合JSF、Hibernate和Spring,实现用户认证功能。通过学习和实践这样的项目,可以提升对这些框架的掌握程度,并了解如何在实际开发中解决类似问题。

    jsf-validation.zip_JSF_jsf validation_zip

    通过分析和学习这些源代码,开发者可以更好地掌握JSF验证机制的内部工作原理,从而在自己的项目中灵活运用和扩展验证功能。同时,它也能帮助我们理解如何结合JSF与Bean Validation框架,实现更强大的数据校验。对于...

    myfaces-example-tiles-1.1.6.rar_Tiles_jsf myfaces_jsf tiles exam

    `myfaces-example-tiles-1.1.6.rar` 是一个示例项目,它展示了如何在JavaServer Faces (JSF)环境中集成和使用Apache Tiles框架。这个例子特别关注MyFaces实现,一个流行的JSF实现库。 **JSF(MyFaces)介绍** Java...

    JSFLoginDemo.rar_DEMO_JSF_jsf struts

    **JSF(JavaServer Faces)**是Java平台上的一种用于构建用户界面的Web应用程序框架,它简化了开发人员创建交互式用户界面的过程。JSF提供了一种组件化的方式,允许开发者通过拖放组件来构建UI,并且它与后端业务...

    图书管理系统-BookM_JSF_Hibernate_Spring

    《图书管理系统-BookM_JSF_Hibernate_Spring》是一个基于Java技术栈的Web应用程序,它融合了多个核心技术,包括JavaServer Faces(JSF)、Hibernate、Spring框架以及ajax4jsf库,旨在提供一个高效、易用的图书管理...

    Spring_JPA_JSF2.0 示例

    综上所述,Spring_JPA_JSF2.0 示例演示了如何将Spring框架的依赖注入和事务管理能力,与JPA的ORM功能,以及JSF2.0的用户界面组件和处理机制结合,实现一个完整的CRUD应用。这样的组合为开发人员提供了一个高效且易于...

    核心_JSF_编程, 核心_JSF_编程

    **JSF(JavaServer Faces)概述** JSF是Java平台上的一个官方标准,全称为JavaServer Faces,由Sun Microsystems(现已被Oracle收购)开发并...同时,丰富的社区扩展库进一步丰富了JSF的功能,满足不同项目的需求。

    jsf1.2+Spring3.0.5+Mybatis

    本项目结合了三个核心的开源技术:JSF(JavaServer Faces)、Spring和Mybatis,形成一个强大的后端框架解决方案。 JSF是J2EE(Java 2 Platform, Enterprise Edition)规范的一部分,它是一种用于构建用户界面的MVC...

    facelet-xhtml.zip_JSF_facelet_jsf with ejb3

    在“Facelet with JSF and EJB3”项目中,Facelets被用来构建用户界面,这使得代码更加清晰,因为Facelets允许开发者将UI逻辑与业务逻辑分离。XHTML文件如`index.xhtml`、`login.xhtml`和`login_error.xhtml`就是用...

    JSF.rar_0 猜迷-jsf_JSF

    这篇教程——"JSF.rar_0 猜迷-jsf_JSF",显然旨在帮助初学者逐步掌握JSF的核心概念和技术。作为网络编程人员,了解和掌握JSF对于开发企业级Java Web应用至关重要。 首先,我们来了解一下JSF的基本架构。JSF的核心...

Global site tag (gtag.js) - Google Analytics