Struts拦截器的小案例

案例说明:

一个关于用户登录使用拦截器的小案例,连接数据库,判断用户是否存在在数据库中,否则就返回登录界面。

步骤一:创建一个登录界面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界面展示所有数据库中的用户




我们再试一个数据库中不存在的用户,被拦截器拦截转去登录界面(其实应该写一个注册界面,跳去注册界面比较好)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值