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>
作者: kent鹏
出处: http://www.cnblogs.com/xieyupeng/
关于作者:专注JAVAEE领域,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。