`
output
  • 浏览: 16448 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics