公司的项目已接近尾声,时间长了,很多东西都忘了……
我脑子不好使,在此重新搭建一个项目作为复习,顺便边学习JQuery Mobile
本项目使用JSF+ibatis搭建,不同的设备使用不同的css……其他的忘了,郁闷中
我是先在QQ邮箱记事本写,再拷过来的,图片显示不了,懒得搞了.....
一、环境搭建
新建项目

<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>
页面效果:

<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.iyunv.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.iyunv.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.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
接来下可以在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:
去耍了,过几天再写了,(*^__^*) 嘻嘻…… |