JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现
一、自定义拦截器
1.架构

2.拦截器创建
//拦截器:第一种创建方式
//拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
public class MyInterceptor implements Interceptor{}
//创建方式2: 继承AbstractInterceptor -> struts2的体贴
//帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
public class MyInterceptor2 extends AbstractInterceptor{}
//创建方式3:继承MethodFilterInterceptor 方法过滤拦截器
//功能: 定制拦截器拦截的方法.
// 定制哪些方法需要拦截.
// 定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{}
3.拦截器api
//放行
String result = invocation.invoke();
//前处理
System.out.println("MyInterceptor3 的前处理!");
//放行
String result = invocation.invoke();
//后处理
System.out.println("MyInterceptor3 的后处理!");
//不放行,直接跳转到一个结果页面
//不执行后续的拦截器以及Action,直接交给Result处理结果.进行页面跳转
return "success";
4.拦截器配置
<package name="inter" namespace="/" extends="struts-default" >
<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>
<action name="Demo1Action_*" class="cn.itcast.a_interceptor.Demo1Action" method="{1}" >
<!-- 为Action单独指定走哪个拦截器(栈)
<interceptor-ref name="myStack"></interceptor-ref>-->
<result name="success" type="dispatcher" >/index.jsp</result>
</action>
</package>
<!-- 补充知识:定义全局结果集 -->
<global-results>
<result name="toLogin" type="redirect" >/login.jsp</result>
</global-results>
二、struts2标签
1.标签体系


2.struts2标签结构

3.控制标签
准备Action然后再到jsp练习struts2标签
public class Demo2Action extends ActionSupport {
public String execute() throws Exception {
List<String> list = new ArrayList<>();
list.add("tom");
list.add("jerry");
list.add("jack");
list.add("rose");
list.add("hqy");
ActionContext.getContext().put("list", list);
return SUCCESS;
}
}
开始练习控制标签:
<%@ taglib prefix="s" uri="/struts-tags" %>
<!-- 遍历标签 iterator -->
<!-- ------------------------------------- -->
<s:iterator value="#list" >
<s:property /><br>
</s:iterator>
<!-- ------------------------------------- --><hr>
<s:iterator value="#list" var="name" >
<s:property value="#name" /><br>
</s:iterator>
<!-- ------------------------------------- --><hr>
<s:iterator begin="1" end="100" step="1" >
<s:property />|
</s:iterator>
<!-- ------------------if else elseif------------------- --><hr> <s:if test="#list.size()==4">
list长度为4!
</s:if>
<s:elseif test="#list.size()==3">
list长度为3!
</s:elseif>
<s:else>
list不3不4!
</s:else>
4.数据标签
<!-- ------------------property 配合ognl表达式页面取值 ------------------- --><hr>
<s:property value="#list.size()" />
<s:property value="#session.user.name" />
5.表单标签
<!-- struts2表单标签 -->
<!-- 好处1: 内置了一套样式. -->
<!-- 好处2: 自动回显,根据栈中的属性 -->
<!-- theme:指定表单的主题
xhtml:默认
simple:没有主题
-->
<s:form action="Demo3Action" namespace="/" theme="xhtml" >
<s:textfield name="name" label="用户名" ></s:textfield>
<s:password name="password" label="密码" ></s:password>
<s:radio list="{'男','女'}" name="gender" label="性别" ></s:radio>
<s:radio list="#{1:'男',0:'女'}" name="gender" label="性别" ></s:radio>
<s:checkboxlist list="#{2:'抽烟',1:'喝酒',0:'烫头'}" name="habits" label="爱好" ></s:checkboxlist>
<s:select list="#{2:'大专',1:'本科',0:'硕士'}" headerKey="" headerValue="---请选择---" name="edu" label="学历" >
</s:select>
<s:file name="photo" label="近照" ></s:file>
<s:textarea name="desc" label="个人简介" ></s:textarea>
<s:submit value="提交" ></s:submit>
</s:form>
6.非表单标签
在action中添加错误信息
this.addActionError("我是错误信息 哈哈哈");
取出错误信息
<s:actionerror/>
三、练习:登陆功能
核心代码:
Action代码:
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
private UserService us = new UserServiceImpl();
public String login() throws Exception {
//1 调用Service 执行登陆操作
User u = us.login(user);
//2 将返回的User对象放入session域作为登陆标识
ActionContext.getContext().getSession().put("user", u);
//3 重定向到项目的首页
return "toHome";
}
@Override
public User getModel() {
return user;
}
}
Service层代码:
public class UserServiceImpl implements UserService {
private UserDao ud = new UserDaoImpl();
@Override
public User login(User user) {
//打开事务
HibernateUtils.getCurrentSession().beginTransaction();
//1.调用Dao根据登陆名称查询User对象
User existU = ud .getByUserCode(user.getUser_code());
//提交事务
HibernateUtils.getCurrentSession().getTransaction().commit();
if(existU==null){
//获得不到=>抛出异常提示用户名不存在
throw new RuntimeException("用户名不存在!");
}
//2 比对密码是否一致
if(!existU.getUser_password().equals(user.getUser_password())){
//不一致=>抛出异常提示密码错误
throw new RuntimeException("密码错误!");
}
//3 将数据库查询的User返回
return existU;
}
}
Dao层代码:
public class UserDaoImpl implements UserDao {
@Override
public User getByUserCode(String user_code) {
//HQL查询
//1.获得Session
Session session = HibernateUtils.getCurrentSession();
//2 书写HQL
String hql = "from User where user_code = ? ";
//3 创建查询对象
Query query = session.createQuery(hql);
//4 设置参数
query.setParameter(0, user_code);
//5 执行查询
User u = (User) query.uniqueResult();
return u;
}
}
四、练习:校验登陆拦截器
核心代码:
拦截器代码:
public class LoginInterceptor extends MethodFilterInterceptor {
//指定不拦截登陆方法. 其他方法都拦截
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//1.获得session
Map<String, Object> session = ActionContext.getContext().getSession();
//2.获得登陆标识
Object object = session.get("user");
//3.判断登陆标识是否存在
if(object == null){
//不存在=>没登录=>重定向到登录页面
return "toLogin";
}else{
//存在=>已经登陆=>放行
return invocation.invoke();
}
}
}
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>
<!-- 指定struts2是否以开发模式运行
1.热加载主配置.(不需要重启即可生效)
2.提供更多错误信息输出,方便开发时的调试
-->
<constant name="struts.devMode" value="true"></constant>
<package name="crm" namespace="/" extends="struts-default" >
<interceptors>
<!-- 注册拦截器 -->
<interceptor name="loginInterceptor" class="cn.itheima.web.interceptor.LoginInterceptor"></interceptor>
<!-- 注册拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="loginInterceptor">
<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="toLogin" type="redirect" >/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="cn.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="cn.itheima.web.action.UserAction" method="{1}" >
<result name="toHome" type="redirect" >/index.htm</result>
<result name="error" >/login.jsp</result>
</action>
</package>
</struts>
补充知识:检查当前页面的父页面是否是自己,不是的话进行跳转,解决页面嵌套问题。
<script type="text/javascript">
window.onload=function(){ if(window.parent != window){// 如果是在框架中
//就让框架页面跳转到登陆页面
window.parent.location.href = "${pageContext.request.contextPath}/login.jsp";
} };
</script>
JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现的更多相关文章
- struts2-自定义拦截器-struts2标签
1 自定义拦截器 1.1 架构 1.2 拦截器创建 创建方式1 创建方式2 创建方式3 ★★★★ 1.3 拦截器api 放行 前后处理 不放行,直接跳转到一个结果页面 不执行后续的拦截器以及Actio ...
- struts2第四天——拦截器和标签库
一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能, ...
- csrf 功能 及 csrf装饰器使用
目录 csrf 功能 及 csrf装饰器使用 简单了解csrf 防范措施 了解更多csrf点击 django 中 csrf csrf装饰器 csrf功能(执行流程) csrf 功能 及 csrf装饰器 ...
- 框架学习之Struts2(四)---拦截器和标签
一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...
- Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】
什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...
- Struts2拦截器和标签
一.struts2拦截器 1.struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面. 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每 ...
- Shiro 自定义登陆、授权、拦截器
Shiro 登陆.授权.拦截 按钮权限控制 一.目标 Maven+Spring+shiro 自定义登陆.授权 自定义拦截器 加载数据库资源构建拦截链 使用总结: 1.需要设计的数据库:用户.角色.权限 ...
- struts2.1.6教程五、拦截器
在前面我们已经初步使用过拦截器,下面继续细细探讨. 1.概述strust2中的拦截器 拦截器是Struts2框架的核心,它主要完成解析请求参数.将请求参数赋值给Action属性.执行数据校验.文件上传 ...
- Struts2学习笔记四:深入拦截器
一:拦截器的工作原理 拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回res ...
随机推荐
- JAVA虚拟机环境变量设置
转自: 网络 下载java环境变量设置所需的jdk并安装,下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7 ...
- mui开发app之自定义事件以更新其他页内容
我之前做过jquery mobile的开发,那还是前年的事情 在jquery mobile中,由于页面是存储在div[data-role=page]的dom中(jqmobile通过对data-role ...
- .bind.apply() 解决 new 操作符不能用与 apply 或 call 同时使用
背景: 小明想要用数组的形式为 Cls.func 传入多个参数,他想到了以下的写法: var a = new Cls.func.apply(null, [1, 2, 3]); 然而浏览器却报错Cls. ...
- 关于phpMyAdmin表数据不能编辑更改的问题
今天在使用phpMyAdmin更改表中的数据时, 发现表的前面没有编辑.复制.删除这些内容, 于是我很奇怪,上网查了查,终于找到了一个解决的办法, 原来是我的这个表没有主键,于是我点击表 的 结构 , ...
- SOA 下实现分布式 调用 cxf+ webService +动态调用
近期项目间隙 自学了 webservice 一下 是我写的 一个demo 首先我们在web.xml 里配置如下 <servlet> <servlet-name>CXFS ...
- Java并发,看到了,就记录下呗
在这篇博客中,主要把之前看的书的内容记录一下,个人感觉还是可以的,原题是这样的:开发一个高效的缓存.这里指的是单机. 首先我来看当前的一个版本 public interface Computable& ...
- Linux五种IO模型性能分析
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步: 所谓同步,就是在发出一个功能调用时, ...
- swift学习 - tableView自适应高度1(xib autoLayout)
tableView自适应高度 效果图: 源码: class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSo ...
- 笔记本shift变粘贴,粘滞键设置已关闭
之前手贱吧,拿湿抹布擦了擦笔记本电脑的自带键盘,然后部分按键失灵了. 本想着反正也都是在寝室用的,趁机找借口买了个机械键盘,啪啪啪... 刚开始好好的,后来发现一按shift就会粘贴,百度了下都说是粘 ...
- TensorFlow for R
TensorFlow™ is an open source software library for numerical computation using data flow graphs. Nod ...
