案例说明:
一个关于用户登录使用拦截器的小案例,连接数据库,判断用户是否存在在数据库中,否则就返回登录界面。
步骤一:创建一个登录界面login.jsp
并且准备数据库如下 (这里使用的是mysql数据库):
<body>
<form method="post" action="user_login">
用户名:<input type="text" name="admin.userName"/>
密 码: <input type="text" name="admin.passWord"/>
<input type="submit" value="登录"/>
</form>
</body>
顺便看一下案例总体的框架结构,以及需要导入的jar包~~
步骤二:创建万年不倒的实体类~
package cn.itcast.entity;
public class Admin {
private int id;
private String passWord;
private String userName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
步骤三:连接数据库,配置c3p0-config.xml 像这样婶的~
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///user</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>
建立一个连接数据库的工具类,其中通过getDatasource()方法返回数据源对象
package cn.itcast.utils;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JdbcUtils {
private static DataSource datasource;
static {
datasource=new ComboPooledDataSource();
}
public static DataSource getDatasource(){
return datasource;
}
//创建DBUtils常用工具类对象
public static QueryRunner getQuerrRunner(){
return new QueryRunner(datasource); //QueryRunner类的构造方法,接收一个连接池对象,方便底层创建Connection对象
}
}
步骤四:数据访问层dao先生~以及业务处理的service小姐~创建AdminDao类,在其中定义login方法和获取所有用户信息的方法。
package cn.itcast.dao;
import java.sql.SQLException;
import java.util.List;
import javax.management.RuntimeErrorException;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.itcast.entity.Admin;
import cn.itcast.utils.JdbcUtils;
public class AdminDao {
public Admin login(Admin admin){
String sql="select * from user_table1 where userName=? and passWord=?";
try {
return JdbcUtils.getQuerrRunner().query(
sql,
new BeanHandler<Admin>(Admin.class), //将获取的结果集的第一行数据封装到Admin实例中
admin.getUserName(), //登录界面传入的用户名
admin.getPassWord()); //登录界面传入的密码
} catch (SQLException e) {
e.printStackTrace();
}
return admin;
}
public List<Admin> getAll(){
String sql="select * from user_table1";
try {
return JdbcUtils.getQuerrRunner().query(
sql,
new BeanListHandler<Admin>(Admin.class)); //将结果集的每一行都封装到对应的Admin实例中再放入List集合中
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
创建 AdminService ,将dao先生实例化,并将他方法重写~~又返回出来 ( 爱情总是盲目的~~)
package cn.itcast.service;
import java.util.List;
import cn.itcast.dao.AdminDao;
import cn.itcast.entity.Admin;
public class AdminService {
private AdminDao dao=new AdminDao();
public Admin login(Admin admin){
try {
return dao.login(admin);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public List<Admin> getAll(){
try {
return dao.getAll();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
步骤五:创建一个action类,对提交的数据进行处理~
package cn.itcast.action;
import java.util.List;
import cn.itcast.entity.Admin;
import cn.itcast.service.AdminService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private Admin admin; //这里使用了ognl方式实现了数据的自动封装
public Admin getAdmin() {
return admin;
}
public void setAdmin(Admin admin) {
this.admin = admin;
}
private AdminService service=new AdminService();
//登录
public String login(){
try {
Admin userinfo=service.login(admin); //登录返回的用户消息
if(userinfo==null){
return "input"; //用户信息为空,去到login.jsp
}
ActionContext.getContext().getSession().put("userinfo", userinfo); //登录成功,将数据封装到session中
return "success";
} catch (Exception e) {
return ERROR;
}
}
public String list(){
try {
List<Admin> list=service.getAll();
//保存到request中
ActionContext.getContext().getContextMap().put("listAdmin", list);
return "list";
} catch (Exception e) {
return ERROR;
}
}
}
然后对action进行配置~~
首先是大哥web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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-app_2_5.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
然后是二哥struts.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="admin" extends="struts-default">
<action name="user_*" class="cn.itcast.action.UserAction" method="{1}">
<result name="input">/login.jsp</result>
<result name="success" type="redirectAction">user_list</result> .//这里使用了活动的跳转
<result name="list">/list.jsp</result>
</action>
</package>
</struts>
步骤六:通过继承AbstractInterceptor类 建立UserCheckInterceptor的拦截器类 (本案例的重点)
package cn.itcast.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class UserCheckInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context=ActionContext.getContext(); //获取ActionContext的对象
ActionProxy proxy=invocation.getProxy(); //获取action的代理对象
String methodName=proxy.getMethod(); //从代理对象中获得执行的方法
if(!"login".equals(methodName)){ //判断
Object obj=context.getSession().get("userinfo");
if(obj==null){
return "login";
}else{
return invocation.invoke(); //执行下一个拦截器
}
}else{
return invocation.invoke(); //执行下一个拦截器
}
}
}
紧接着当然还是在struts.xml中配置拦截器啦~ (生命不止 ,配置不息)
<struts>
<package name="admin" extends="struts-default">
<!-- 拦截器配置 -->
<interceptors>
<!-- 1,自定义一个拦截器 -->
<interceptor name="loginCheck" class="cn.itcast.interceptor.UserCheckInterceptor"></interceptor>
<!-- 2,定义一个拦截器栈,里面放入默认拦截器和自定义的拦截器 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginCheck"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 执行拦截器 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<global-results> <!--全局配置 -->
<result name="error">/error.jsp</result>
</global-results>
<action name="user_*" class="cn.itcast.action.UserAction" method="{1}"> <!--我们刚刚配置好的action哥哥 -->
<result name="input">/login.jsp</result>
<result name="success" type="redirectAction">user_list</result>
<result name="list">/list.jsp</result>
</action>
</package>
</struts>
经过六大步骤之后我们就来试着运行一下吧~~~~
首先输入数据库中有的用户,然后转去List界面展示所有数据库中的用户
我们再试一个数据库中不存在的用户,被拦截器拦截转去登录界面(其实应该写一个注册界面,跳去注册界面比较好)