在搭建之前.. 首先,需要准备struts2.0框架的5个核心包, 以及jsonplugin-0.32.jar
以及json-lib-2.2.2-jdk15.jar ,用来转换JSON对象的.,ojdbc14.jar oracle驱动包. jquery-1.2.6.js文件。
开始建立WebProject ,取名为Struts2AjaxDemo
把包分别复制到WEB-INF/lib包下面。
建立struts.xml文件 和 web.xml文件。 这个功能,还对数据库进行了操作..数据库代码,贴出来见表的sql语句:
建立表的SQL语句如下:
后台DAO连接Oracle数据库代码:
package pack.java.basedao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import pack.java.vo.User;
public class BaseConnection {
private static final String USERNAME ="scott";
private static final String PASSWORD ="tiger";
private static final String DRIVER ="oracle.jdbc.driver.OracleDriver";
private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
private Connection connection = null;
private PreparedStatement preparedStatement= null;
private ResultSet resultSet = null;
private Connection getConnection(){
try {
Class.forName(DRIVER);
try {
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
connection.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("连接失败!");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("驱动没有找到!");
}
return connection;
}
private PreparedStatement getPreparedStatement(String sql){
getConnection();
try {
preparedStatement = connection.prepareStatement(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return preparedStatement;
}
public User getUserByName(String name){
User user = null;
String sql = "select userId,username,password,faicount,to_char(lastlogintime,'yyyy-MM-dd hh:mi:ss')tdate from user_info U where U.username = '"+name+"'";
try {
resultSet = getPreparedStatement(sql).executeQuery();
while (resultSet.next()) {
user = new User();
user.setId(resultSet.getInt("USERID"));
user.setName(resultSet.getString("USERNAME"));
user.setPassword(resultSet.getString("PASSWORD"));
user.setFaiCount(resultSet.getInt("FAICOUNT"));
try {
user.setLastLoginDate(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(resultSet.getString("tdate")));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
closeConnection();
}
return user;
}
public Date getDBCurrentTime(){
String sql = "select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')as tdate from dual";
Date date = null;
try {
resultSet = getPreparedStatement(sql).executeQuery();
try {
while (resultSet.next()) {
date =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(resultSet.getString("tdate"));
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
closeConnection();
}
return date;
}
public boolean updateFailureCountToUserInfo(int totalNumber,String username){
String sql = "update User_Info set FAICOUNT="+totalNumber +" where User_INFO.username = '"+username+"'";
System.out.println(sql);
try {
int i = getPreparedStatement(sql).executeUpdate();
connection.commit();
return i>0;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}finally{
closeConnection();
}
}
public boolean updateLastLoginTimeToUserInfo(Date lastLogindate,String username){
String sql = "update USER_INFO set LASTLOGINTIME = to_date('"+new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(lastLogindate)+"','yyyy-MM-dd hh:mi:ss') where username = '"+username+"'";
System.out.println(sql);
try {
int i = getPreparedStatement(sql).executeUpdate();
return i>0;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}finally{
closeConnection();
}
}
private void closeConnection(){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
if(connection!=null && !connection.isClosed()){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
struts.xml配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "//struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
<!-- 配置Ajax請求的包; -->
<package name="pack.java.struts2" extends="json-default">
<action name="ajaxRequest" class="pack.java.struts2.UserAction">
<result type="json" name="ajaxSuccess">
<param name="root">result</param>
</result>
<result type="dispatcher" name="success">/main.jsp</result>
<result type="dispatcher" name="failure">/login.jsp</result>
</action>
</package>
</struts>
web.xml配置文件如下:建立strtus2的过滤器。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Struts2AjaxDemo</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>login.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
建立UserAction文件.与Jquery中的Ajax交互..以及判断用户名和密码, 登陆的方法.等等..
具体代码如下:
改Action中,还具备,输入三次错误.锁定2分钟..功能。
package pack.java.struts2;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONObject;
import pack.java.service.UserService;
import pack.java.service.UserServiceImpl;
import pack.java.vo.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
*
* @author ZhouHaiTao;
*
*/
public class UserAction extends ActionSupport {
private static final long serialVersionUID = 5088292503353625986L;
private UserService userService = new UserServiceImpl();
private static final int FAILOGINCOUNT = 3;
private String result;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
//注入User VO实体;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
/**
* 检查用户名是否存在!
* @return
*/
public String checkUserName(){
User userInfo = userService.checkUserNameExists(user.getName());
//判断用户名是否存在!
if(userInfo!=null){
result ="User Name okay!";
}else{
result = "User Name Not exists!";
}
return "ajaxSuccess";
}
/**
* User Login
* @return string;
*/
@SuppressWarnings("unchecked")
public String userLogin(){
Map map =new HashMap();
map.put("name", user.getName());
map.put("password", user.getPassword());
boolean bol = true;
//把map转成json对象;
JSONObject object = JSONObject.fromObject(map);
result = object.toString();
User userObj = userService.checkUserNameExists(user.getName());
if(userObj!=null){
System.out.println("最后登陆日期:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(userObj.getLastLoginDate()));
System.out.println("当前数据日期:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(userService.getDBCurrentTime()));
long mi = countTime(userObj.getLastLoginDate(),userService.getDBCurrentTime());
System.out.println("时间差分钟:"+mi);
long i = (2-mi);
if(i>0){
ActionContext.getContext().put("timeInfo", "你还需要等待:"+i+"分钟,才能登陆!");
}
if(userObj.getFaiCount()>=2 && mi<2){
System.out.println("登陆失败!");
ActionContext.getContext().put("invaliPassworError", "对不起,你的账户已被系统锁定2分钟,请稍后登陆!");
return "failure";
}else{
if(mi>=2 && userObj.getFaiCount()>=3){
System.out.println("统一都恢复成0!");
if(userService.updateFailureCountToUserInfo(0, user.getName())){
System.out.println("失败总数恢复为0,成功!");
}else{
System.out.println("失败总数恢复为0,失败!");
}
userService.updateLastLoginTimeToUserInfo(userService.getDBCurrentTime(),user.getName());
bol = false;
}
}
if(user.getPassword().equals(userObj.getPassword())&& user.getFaiCount()< FAILOGINCOUNT){
ActionContext.getContext().getSession().put("user", userObj);
result ="User Name okay!";
System.out.println("登陆成功!");
userService.updateFailureCountToUserInfo(0, user.getName());
if(userService.updateLastLoginTimeToUserInfo(userService.getDBCurrentTime(),user.getName())){
System.out.println("成功修改数据库最后登陆时间!");
}else{
System.out.println("失败修改数据库最后登陆时间!");
}
return "success";
}else{
System.out.println("登陆失败!");
if(bol){
userService.updateFailureCountToUserInfo(userObj.getFaiCount()+1, user.getName());
ActionContext.getContext().put("invaliPassworError", "Invalid login or password!");
}
return "failure";
}
}else{
ActionContext.getContext().put("invaliPassworError", "Invalid login or password!");
return "failure";
}
}
/**
* 计算时间差
*
* @param begin
* @param end
* @return
*/
public static long countTime(Date begin,Date end){
int hour = 0;
int minute = 0;
long total_minute = 0;
StringBuffer sb = new StringBuffer();
Date begin_date = begin;
Date end_date = end;
total_minute = (end_date.getTime() - begin_date.getTime())/(1000*60);
hour = (int) total_minute/60;
minute = (int) total_minute%60;
//sb.append("工作时间为:").append(hour).append("小时").append(minute).append("分钟");
return minute;
}
public static void main(String[] args) {
System.out.println(countTime(new Date(),new Date()));
}
}
JSP页面Login登陆的代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript" src="scripts/jquery-1.2.6.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ajax效果</title>
<script type="text/javascript">
//检查用户名是否存在!
function onCheckUserName(){
var url = "ajaxRequest!checkUserName.action";
var params = {
"user.name":jQuery("#name").attr("value"),
"user.password":jQuery("#password").attr("value")
};
jQuery.getJSON(url,params,function callback(data){
jQuery("#divUserName").css("color","red");
jQuery("#divUserName").html(data);
});
}
</script>
</head>
<body>
<center>
<form method="post" action="ajaxRequest!userLogin.action" name="myform" id="myform">
<table cellpadding="1" width="40%" cellspacing="0" bordercolor="00FFFF"
style="text-align: left" border="1px">
<tr>
<td width="10%">用户名:</td>
<td width="10%"><input id="name" name="user.name" type="text" οnkeyup="onCheckUserName()"></td>
<td width="20%">
<div id="divUserName" style="height: 10px">请输入用户名!</div>
</td>
</tr>
<tr>
<td width="10%">密码:</td>
<td width="10%"><input id="password" name="user.password"
type="password"></td>
<td>请输入密码![密码必须大于6位]</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="reset" value="重置">
<input type="submit" value="登陆"></td>
</tr>
<tr>
<Td colspan="3"><div id="loginResultId" style="color:red">${invaliPassworError==null?"":invaliPassworError}</div></Td>
</tr>
<tr>
<Td colspan="3"><div id="timeInfo" style="color:red">${timeInfo==null?"":timeInfo}</div></Td>
</tr>
</table>
<div id="result">
</div>
</form>
</center>
</body>
</html>