Java mac idea Struts2的使用04

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

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

}

方式三:

//继承: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. 拦截器配置

拦截action的请求
Demo1Action

public class Demo1Action extends ActionSupport {


    @Override
    public String execute() throws Exception {
        System.out.println("Demo1Action");
        return SUCCESS;
    }
}

拦截器MyInterceptor3

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

    @Override
    protected String doIntercept(ActionInvocation actionInvocation) throws Exception {

        //前处理
        System.out.println("MyInterceptor3 的前处理!");
        //放行
        String result = actionInvocation.invoke();
        //后处理
        System.out.println("MyInterceptor3 的后处理!");

        return result;
    }

}

在配置中设置哪些方法进行拦截,哪些方法不拦截

<struts>

    <package name="inter" namespace="/" extends="struts-default" >
        <interceptors>
            <!-- 1.注册拦截器 -->
            <interceptor name="myInter3" class="test.MyInterceptor3"></interceptor>

            <!-- 2.注册拦截器栈 -->
            <interceptor-stack name="myInterceptorStack">
                <!-- 自定义拦截器引入(建议放在20个拦截器之前) -->
                <interceptor-ref name="myInter3">
                    <!-- 指定哪些方法不拦截
                     <param name="excludeMethods">add,delete</param> -->
                    <!-- 指定哪些方法需要拦截 -->
                    <param name="includeMethods">add,delete,execute</param>
                </interceptor-ref>
                <!-- 引用默认的拦截器栈(20个) -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!-- 3.指定包中的默认拦截器栈 -->
        <default-interceptor-ref name="myInterceptorStack"></default-interceptor-ref>

        <action name="Demo1Action_*" class="test.Demo1Action" method="{1}" >
            <!-- 也可以为Action单独指定走哪个拦截器(栈)
            <interceptor-ref name="myStack"></interceptor-ref>
            -->
            <result name="success" type="dispatcher" >/index.jsp</result>
        </action>
    </package>



    <package name="test" namespace="/test" extends="struts-default">

        <action name="TestAction_*" class="test.TestAction" method="{1}">

            <result name="success" type="dispatcher" >/hello.jsp</result>

        </action>
    </package>
</struts>

3. 登录拦截

  1. 提供登录的action
public class UserAction extends ActionSupport implements ModelDriven<User> {

    private UserService userService = new UserServiceImpl();
    private User user = new User();


    public String login() throws Exception {

        User u = userService.findUser(user);

        ActionContext.getContext().getSession().put("user", u);

        return "toHome";
    }

    @Override
    public User getModel() {
        return user;
    }
}

public class UserServiceImpl implements UserService {

    private UserDao userDao = new UserDaoImpl();

    @Override
    public User findUser(User user) {

        Session session = HibernateUtils.getCurrentSession();

        // 开启事务
        session.beginTransaction();

        User findUser = userDao.findUser(user);

        // 提交事务
        session.getTransaction().commit();

        if (findUser == null) {
            throw  new RuntimeException("账户名不存在");
        }

        if (!findUser.getUser_password().equals(user.getUser_password())) {
            throw new RuntimeException("密码错误");
        }

        return findUser;
    }
}

public class UserDaoImpl implements UserDao {

    @Override
    public User findUser(User user) {

        Session session = HibernateUtils.getCurrentSession();

        String hql = "from User where user_code = ?";

        Query query = session.createQuery(hql);

        query.setParameter(0, user.getUser_code());

        User user1 = (User) query.uniqueResult();

        return user1;
    }
}
  1. 提供
    登录过滤器LoginInterceptor
public class LoginInterceptor extends MethodFilterInterceptor {
    
    @Override
    protected String doIntercept(ActionInvocation actionInvocation) throws Exception {

        // 1. 获取session
        Map<String, Object> session = ActionContext.getContext().getSession();

        // 2.获取登录标识
        User user = (User) session.get("user");

        // 3.判断登录标识是否存在
        if (user == null) {
            return "toLogin";
        } else  {
            actionInvocation.invoke();
        }
        return null;
    }
}
  1. 配置文件中进行配置

注意点:

1.指定包中的默认拦截器栈,并且指定过滤哪些方法
2.定义全局结果集,用来给所有的Action进行统一的结果处理
3.定义全包的异常处理,error对应到相应的结果集
<struts>

    <!-- i18n:国际化. 解决post提交乱码 -->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <constant name="struts.devMode" value="true"></constant>


    <package name="crm" namespace="/" extends="struts-default">

        <!--注册拦截器-->
        <interceptors>
            <interceptor name="loginInterceptor" class="web.interceptor.LoginInterceptor">
                <param name="excludeMethods">login</param>
            </interceptor>

            <!--注册拦截器栈-->
            <interceptor-stack name="crmInterceptors">
                <interceptor-ref name="loginInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        
        <!--指定包中的默认拦截器栈-->
        <default-interceptor-ref name="crmInterceptors"></default-interceptor-ref>
        
        <!-- 定义全局结果集,用来给所有的Action进行统一的结果处理 -->
        <global-results>
            <result name="toLogin" type="redirect" >/login.jsp</result>
        </global-results>

        <!--定义全包的异常处理,error对应到相应的结果集-->
        <global-exception-mappings>
            <!-- 如果出现java.lang.RuntimeException异常,就将跳转到名为error的结果 -->
            <exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
        </global-exception-mappings>

        <action name="CustomerAction_*" class="web.CustomerAction" method="{1}" >
       
            <result name="list" type="dispatcher" >/jsp/customer/list.jsp</result>

            <!--重定向到 CustomerAction_list-->
            <result name="toList" type="redirectAction" >
                <param name="actionName" >CustomerAction_list</param>
                <param name="nameSpace">/</param>
            </result>
        </action>

        <action name="UserAction_*" class="web.UserAction" method="{1}">
            <result name="toHome" type="redirect">/index.htm</result>
            <result name="error"  type="redirect">/login.jsp</result>
        </action>
    </package>

</struts>

jsp页面登录拦截

  <script type="text/javascript">
      window.onload=function(){

          if(window.parent != window){// 如果是在框架中
              //就让框架页面跳转到登陆页面
              window.parent.location.href = "${pageContext.request.contextPath}/login.jsp";
          }

      };
  </script>

4. struts2标签

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容