Struts2学习笔记(第四天)

Struts2_day04

1.今日任务

·使用Struts2完成对用户登录的权限拦截器代码编写

2.相关知识

2.1 Struts2拦截器

2.1.1 拦截器的概述

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOPAspect-OrientedProgramming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

2.1.2 Struts2执行流程

2.1.3 自定义拦截器
方式1:
//拦截器:第一种创建方式
//拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
public class MyInterceptor implements Interceptor {
	@Override
	//初始化方法
	public void init() {
		
	}

	@Override
	//拦截方法
	public String intercept(ActionInvocation arg0) throws Exception {
		return null;
	}

	
	@Override
	//销毁方法
	public void destroy() {
		
	}
}

方式2:
//创建方式2: 继承AbstractInterceptor -> struts2的体贴
//帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
public class MyInterceptor2 extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		
		return null;
	}

}



方式3:

//继承:MethodFilterInterceptor 方法过滤拦截器
//功能: 定制拦截器拦截的方法.
//	定制哪些方法需要拦截.
//	定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{

	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		//前处理
		System.out.println("MyInterceptor3 的前处理!");
		//放行
		String result = invocation.invoke();
		//后处理
		System.out.println("MyInterceptor3 的后处理!");
		
		return result;
	}

}


2.1.4 拦截器配置
<interceptors>
	<!-- 1.注册拦截器 -->
		<interceptor name="myInter3" class="cn.itcast.a_interceptor.MyInterceptor3"></interceptor>
	<!-- 2.注册拦截器栈 -->
		<interceptor-stack name="myStack">
			<!-- 自定义拦截器引入(建议放在20个拦截器之前) -->
			<interceptor-ref name="myInter3">
				<!-- 指定哪些方法不拦截
				 <param name="excludeMethods">add,delete</param> -->
				 <!-- 指定哪些方法需要拦截 -->
				 <param name="includeMethods">add,delete</param>
			</interceptor-ref>
			<!-- 引用默认的拦截器栈(20个) -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</interceptor-stack>	
	</interceptors>
	<!-- 3.指定包中的默认拦截器栈 -->
		<default-interceptor-ref name="myStack"></default-interceptor-ref>

3.CRM案例练习

使用Struts2完成对用户登录的权限拦截器代码编写



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>
	
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.i18n.encoding" value="UTF-8"></constant>
	<constant name="struts.configuration.xml.reload" value="true" />
	
	<package name="crm" namespace="/" extends="struts-default">
		<!-- 配置拦截器 -->
		<interceptors>
			<interceptor name="loginInterceptor" class="com.itheima.web.interceptor.LoginInterceptor"></interceptor>
			<interceptor-stack name="myStack">
				<interceptor-ref name="loginInterceptor">
					<!--指定不包含login方法  -->
					<param name="excludeMethods">login</param>
				</interceptor-ref>
				<!-- 引用默认拦截器栈 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 指定默认拦截器栈 -->
		<default-interceptor-ref name="myStack"></default-interceptor-ref>
		
		<!-- 定义全局结果集 -->
		<global-results>
			<result name="login">
				/login.jsp
			</result>
		</global-results>
			
		<!-- 配置异常处理映射 -->
		<global-exception-mappings>
			<!-- 如果出现java.lang.RuntimeException异常,就将跳转到名为error的结果 -->
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>
		
		
		<action name="CustomerAction_*" class="com.itheima.web.action.CustomerAction"
			method="{1}">
			<result name="list">/jsp/customer/list.jsp</result>
			<result name="toList" type="redirectAction">
				<param name="actionName">CustomerAction_list</param>
				<param name="namespace">/</param>
			</result>
		</action>
		
		<action name="UserAction_*" class="com.itheima.web.action.UserAction" method="{1}">
			<result name="toIndex" type="redirect">/index.htm</result>
			<result name="error" >/login.jsp</result>
			
		</action>
		
	</package>
</struts>

UserAction:

public class UserAction extends ActionSupport implements ModelDriven<User>{
	
	private User user = new User();
	
	private UserService userService = new UserServiceImpl();
	
	public String login() throws Exception {
		//调用业务层登录
		User u = userService.login(user);
		//放入session域
		ActionContext.getContext().getSession().put("user", u);
		return "toIndex";
	}

	
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return this.user ;
	}
}

UserService:

public class UserServiceImpl implements UserService {
	private UserDao userDao = new UserDaoImpl();

	@Override
	public User login(User user) throws Exception {
		// TODO Auto-generated method stub
		User existUser = null;
		// 开启事务
		Transaction tx = HibernateUtils.getCurrentSession().beginTransaction();
		// 获取用户
		existUser = userDao.getByUsername(user.getUser_name());
		// 获取用户后提交事务
		tx.commit();
		// 判断用户是否存在
		if (existUser == null) {
			
			throw new RuntimeException("用户名不存在!");
		} else {
			// 判断密码是否正确
			if (!existUser.getUser_password().equals(user.getUser_password())) {
				throw new RuntimeException("密码错误!");
			}
		}
		return existUser;
	}

}

UserDao:

public class UserDaoImpl implements UserDao {

	@Override
	public User getByUsername(String user_name) throws Exception {
		// TODO Auto-generated method stub
		Session session = HibernateUtils.getCurrentSession();
		
		String hql = "from User where user_name=?";
		Query query = session.createQuery(hql);
		query.setParameter(0, user_name);
		
		return (User) query.uniqueResult();
	}

}

User类

public class User {
	private Long user_id;
	private String user_name;
	private String user_password;
	private Character user_state;
	

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(Long user_id, String user_name, String user_password, Character user_state) {
		super();
		this.user_id = user_id;
		this.user_name = user_name;
		this.user_password = user_password;
		this.user_state = user_state;
	}

	public Long getUser_id() {
		return user_id;
	}

	public void setUser_id(Long user_id) {
		this.user_id = user_id;
	}

	public String getUser_name() {
		return user_name;
	}

	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}

	public String getUser_password() {
		return user_password;
	}

	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}

	public Character getUser_state() {
		return user_state;
	}

	public void setUser_state(Character user_state) {
		this.user_state = user_state;
	}


	@Override
	public String toString() {
		return "User [user_id=" + user_id + ", user_name=" + user_name + ", user_password=" + user_password
				+ ", user_state=" + user_state + "]";
	}
}

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.itheima.domain">
	<!-- 
		name属性为类名 因为上面的 hibernate-mapping已经指定类的包名位置 所以这里只要写类名即可 如果上面没有指定 需要写全类名 com.itheima.domain.Customer
		table属性为数据库里表的名字
	-->
	<class name="User" table="sys_user" >
		<!-- 映射主键id字段 -->
		<id name="user_id" column="user_id">
			<generator class="native"></generator>
		</id>
		<!-- name属性为实体类的字段名 column为数据库里表的字段名 一般为了规范都是设置成一样的 -->
		<property name="user_name" column="user_name"/>
		<property name="user_password" column="user_password"/>
		<property name="user_state" column="user_state"/>
		
	</class>
</hibernate-mapping>

登录页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/frameset.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<STYLE type=text/css>
BODY {
	FONT-SIZE: 12px; COLOR: #ffffff; FONT-FAMILY: 宋体
}
TD {
	FONT-SIZE: 12px; COLOR: #ffffff; FONT-FAMILY: 宋体
}
</STYLE>
<script type="text/javascript">
	window.οnlοad=function(){
		if(window.parent != window){
			window.parent.location.href = '${pageContext.request.contextPath}/login.jsp';
		}
	}
</script>

<META content="MSHTML 6.00.6000.16809" name=GENERATOR></HEAD>
<BODY>
<FORM id=form1 name=form1  method=post action="${pageContext.request.contextPath}/UserAction_login">

<DIV id=UpdatePanel1>
<DIV id=div1 
style="LEFT: 0px; POSITION: absolute; TOP: 0px; BACKGROUND-COLOR: #0066ff"></DIV>
<DIV id=div2 
style="LEFT: 0px; POSITION: absolute; TOP: 0px; BACKGROUND-COLOR: #0066ff"></DIV>


<DIV>   </DIV>
<DIV>
<TABLE cellSpacing=0 cellPadding=0 width=900 align=center border=0>
  <TBODY>
  <TR>
    <TD style="HEIGHT: 105px"><IMG src="images/login_1.gif" 
  border=0></TD></TR>
  <TR>
    <TD background=images/login_2.jpg height=300>
      <TABLE height=300 cellPadding=0 width=900 border=0>
        <TBODY>
        <TR>
          <TD colSpan=2 height=35></TD></TR>
        <TR>
          <TD width=360></TD>
          <TD>
            <TABLE cellSpacing=0 cellPadding=2 border=0>
              <TBODY>
              <TR>
                <TD style="HEIGHT: 28px" width=80>登 录 名:</TD>
                <TD style="HEIGHT: 28px" width=150><INPUT id=txtName 
                  style="WIDTH: 130px" name=user_name></TD>
                <TD style="HEIGHT: 28px" width=370><SPAN 
                  id=RequiredFieldValidator3 
                  style="FONT-WEIGHT: bold; VISIBILITY: hidden; COLOR: white">请输入登录名</SPAN></TD></TR>
              <TR>
                <TD style="HEIGHT: 28px">登录密码:</TD>
                <TD style="HEIGHT: 28px"><INPUT id=txtPwd style="WIDTH: 130px" 
                  type=password name=user_password></TD>
                <TD style="HEIGHT: 28px"><SPAN id=RequiredFieldValidator4 
                  style="FONT-WEIGHT: bold; VISIBILITY: hidden; COLOR: white">请输入密码</SPAN></TD></TR>
              <TR>
                <TD style="HEIGHT: 28px">验证码:</TD>
                <TD style="HEIGHT: 28px"><INPUT id=txtcode 
                  style="WIDTH: 130px" name=txtcode></TD>
                <TD style="HEIGHT: 28px"> </TD></TR>
              <TR>
                <TD style="HEIGHT: 18px" colspan="2"><font color="red"><s:property value="exception.message"/></font></TD>
                <TD style="HEIGHT: 18px"></TD></TR>
              <TR>
                <TD></TD>
                <TD><INPUT id=btn 
                  style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" 
                  οnclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("btn", "", true, "", "", false, false))' 
                  type=image src="images/login_button.gif" name=btn> 
              </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD><IMG src="images/login_3.jpg" 
border=0></TD></TR></TBODY></TABLE></DIV></DIV>


</FORM></BODY></HTML>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值