上节主要讲了stust2的相关配置,本节将讨论代码实现的原理
第二节:Stust2 登录验证实例代码详解
首先,我们先理清文件结构:
从java resources开始从上到下,有用的文件为:
src(源码)
hjc.action.LoginAction.java---获取网页(jsp form)中的username和password,然后通过sql语句进行数据库操作
hjc.dbr.DBUtil.java---封装数据库的连接、关闭、增删查改等操作。
hjc.vo.User.java---封装用户类
stust.xml---stust2的配置文件
lib(内涵各种可能用到的jar依赖包,上一节有截图)
web.xml---也是stust2的配置文件
(注:关于这两个配置文件的工作原理,可参照http://blog.csdn.net/gopain/article/details/40790523)
.jpg文件---jsp文件所调用的图片
login.jsp---登录页面,需要输入用户名密码
index.jsp---登录成功的结果页面
jmp.jsp---登录失败的结果页面
以一次登录为例:
在j2ee中运行login.jsp,url中review_ssh为项目(project)名称
我们输入数据库中存在的用户名密码:
(数据库名为hjc,表名为user,主键为uid类型int递增)
输入的是xlc,grc
页面跳转成功,到index.jsp,这里用的是明文传输
从开始的登录页面,到跳转成功,经历了从jsp——传值——java——数据库操作——jsp的过程
首先看jsp如何传值到java上,方法是stust.xml中的相关配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<global-results>
<result name="fail">jmp.jsp</result>
</global-results>
<action name="login" class="hjc.action.LoginAction">
<result name="success">index.jsp</result>
<result name="failed">jmp.jsp</result>
</action>
</package>
</struts>
里面有一段
<action name="login" class="hjc.action.LoginAction">
意思就是,如果触发"login"的action,就执行hjc.action.LoginAction.java,上面已经说到,这个java文件的作用是进行数据库操作的。
登录时,jsp执行的action为login!select,即执行login的action--跳到hjc.action.LoginAction.java,再执行这个java文件的select的方法。所以我们知道了,jsp中form表单action的格式为 “action!method”(动作!方法)。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login & Register</title>
<script>
function onregister(){
document.getElementById("loginid").style.display="none";
document.getElementById("registerid").style.display="";
}
function onlogin(){
document.getElementById("loginid").style.display="";
document.getElementById("registerid").style.display="none";
}
</script>
</head>
<style>
body{text-align:center}
</style>
<body background="bkg.jpg">
<div id = "loginid" style="display:">
<s:actionerror/>
<h1>登录</h1><br>
<form action="login!select" name="loginform">
account : <input type="text" name="username"><br><br>
password: <input type="password" name="password"><br><br>
<input type="submit" value="登录" οnclick="check()"><br><br>
</form>
<button οnclick="onregister()">立即注册</button>
</div>
<div id = "registerid" style="display:none">
<h1>注册</h1><br>
<form action="login!add" name="loginform">
account : <input type="text" name="username"><br><br>
password: <input type="password" name="password"><br><br>
<input type="submit" value="注册"><br><br>
</form>
<button οnclick="onlogin()">返回登录</button>
</div>
</body>
</html>
之后我们看java中的操作:
package hjc.action;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import hjc.dbr.DBUtil;
import hjc.vo.User;
public class LoginAction extends ActionSupport implements ModelDriven<User>{
private User user=new User();
public String add(){
DBUtil db=new DBUtil();
String sql = "insert into user value(null,?,?)";
int rs = db.executOther(sql, new Object[] {user.getUsername(),user.getPassword()});
if(rs>0) return SUCCESS;
return "failed";
}
public String select() {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session= request.getSession();
System.out.println(user.getUsername().length());
session.setAttribute("password", user.getPassword());
session.setAttribute("username", user.getUsername());
DBUtil db=new DBUtil();
String sql = "select * from user where username=? and password=?";
ResultSet rs = db.execQuery(sql, new Object[] {user.getUsername(),user.getPassword()});
try {
if(rs.next()) return SUCCESS;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "failed";
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
session是干什么的?
session是将本次登录的个人信息存在session中,以便后续的页面操作。也就是说让跳转之后“你”还是“你”。
后记:在只有stust2的框架中,我们在数据库不发生更改的情况下可以实现登录验证,与数据库增删查改相关的相当多的功能,但是如果数据库的表结构发生更改,比如在user中,我们加了一个2级密码,那么数据库表以及java代码都需要大面积改动。
本节项目下载:https://pan.baidu.com/s/1U3jTgomXflQs7gWofhFdMQ