SSH框架——Struts2篇

Posted 夕冰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH框架——Struts2篇相关的知识,希望对你有一定的参考价值。

拦截器

拦截器几乎完成了Struts2框架70%的工作,包括解析请求参数,将请求参数赋值给Action属性,执行数据校验,文件上传……,这些拦截器以name-class对的形式配置在struts-default.xml文件中,其中name是拦截器的名字,是使用该拦截器的唯一标识,class指定了该拦截器的实现类。

登录Action实现类

public class LoginAction  extends ActionSupport{

    private  String username;

    private  String password;

       

    public  String execute(){

       if(getUsername().equals("admin") && getPassword().equals("123")){

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

           return "success";

       }else{

           return "fail";

       }

    }

    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;

    }

 

}

 

 

自定义拦截器类,继承自

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class SimpleInterceptor  extends AbstractInterceptor {

 

    //用于设置拦截器的名字

    private  String name;

    //为拦截器设置名字的setter方法

    public void setName(String name) {

       this.name = name;

    }

   

    /**

     * 拦截器实现功能代码

     */

    @Override

    public  String intercept(ActionInvocation invocation) throws  Exception {

       //取得被拦截的action实例

       LoginAction action =  (LoginAction) invocation.getAction();

       //打印开始执行的时间

       System.out.println(name+"拦截器的动作------------"+"开始执行Action的时间"+new Date());

       //取得开始执行Action的时间

       long start =  System.currentTimeMillis();

       //执行该拦截器后一个拦截器

       //如果该拦截器后没有其他拦截器,则直接执行Action的被拦截方法

       String result = invocation.invoke();

       //打印执行结束时间

       System.out.println(name+"拦截器的动作------------"+"执行完登录Action的时间为:"+new Date());

       long end =  System.currentTimeMillis();

       System.out.println(name+"拦截器的动作------------"+"执行完该Action的时间为:"+(end-start)+"毫秒");

      

       return  result;

    }

}

 

struts.xml中配置使用自定义拦截器

<!--  配置本系统所使用的包 -->

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

     

     <!-- 应用所需使用的拦截器都在该元素下配置 -->

     <interceptors>

        <!-- 配置mySimple拦截器 -->

        <interceptor name="mySimple" class="org.cgx.in.SimpleInterceptor">

            <!-- 为拦截器指定参数 -->

            <param name="name">简单拦截器</param>

        </interceptor>

     </interceptors>

        <action name="login"  class="org.cgx.vo.LoginAction">

            <result name="success">/welcome.jsp</result>

            <result name="fail">/error.jsp</result>

            <!-- 配置系统的默认拦截器 -->

            <interceptor-ref name="defaultStack"></interceptor-ref>

           <!-- 应用自定义的拦截器 -->

            <interceptor-ref name="mySimple">

                  <param name="name">改名后的拦截器===</param>

            </interceptor-ref>

        </action>    

</package>

 

登录表单界面代码

<%@ page language="java" import="java.util.*"  pageEncoding="UTF-8"%>

<%

String  path = request.getContextPath();

String  basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<%@taglib prefix="s" uri="/struts-tags"  %>

<!DOCTYPE html PUBLIC  "-//W3C//DTD HTML 4.01  Transitional//EN">

<html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>Insert  title here</title>

    </head>

    <body>     

       <s:form action="/login"  method="post">

            <s:textfield name="username" key="user"/>

            <s:textfield name="password" key="pass"/>

            <s:submit key="login"/>

       </s:form>

    </body>

</html>

 

struts.xml应用自定义拦截器时,可以通过excludeMethods属性指定不被拦截的方法;通过includeMethods属性指定被拦截的方法

<!--  应用自定义的拦截器 -->

<interceptor-ref name="mySimple">

<param name="name">改名后的拦截器</param>

   <!-- 指定不需要拦截的方法 -->

   <param name="excludeMethods">execute</param>

   <!-- 指定需要拦截的方法 -->

   <param name="includeMethods">execute</param>

</interceptor-ref>

excludeMethodsincludeMethods同时使用时,拦截器会拦截。

当不需要拦截多个方法时可用逗号隔开

<param name="excludeMethods">execute,regist</param>

 


校验用户是否登录

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.i18n.encoding" value="UTF-8"></constant>

    <!-- 指定全局国际化资源文件 -->

    <constant name="struts.custom.i18n.resources" value="mess"></constant>

    <!-- 修改以下配置,设置是否需要重新启动tomcat -->

    <constant name="struts.devMode" value="false"></constant>

    <!-- 调用动态方法 -->

    <constant name="struts.enable.DynamicMethodInvocation"  value="true"></constant>

    

     <!-- 配置本系统所使用的包 -->

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

     <!-- 应用所需使用的拦截器都在该元素下配置 -->

     <interceptors>

        <!-- 配置mySimple拦截器 -->

        <interceptor name="mySimple" class="org.cgx.in. SimpleInterceptor">

            <!-- 为拦截器指定参数 -->

            <param name="name">简单拦截器</param>

        </interceptor>

     </interceptors>

        <action name="login"  class="org.cgx.vo.LoginAction">

            <result name="success">/welcome.jsp</result>

            <result name="fail">/error.jsp</result>

        </action> 

        <action name="show"  class="org.cgx.in.Test">

            <result name="ok">/welcome.jsp</result> 

            <result name="login">/index.jsp</result>

            <!-- 配置系统的默认拦截器 -->

            <interceptor-ref name="defaultStack"></interceptor-ref>

           <!-- 应用自定义的拦截器 -->

            <interceptor-ref name="mySimple">

              <param name="name">自定义拦截器</param>

            </interceptor-ref>       

        </action>               

    </package>

</struts>

登录成功后将用户名写入session中,当访问其他页面时,首先由拦截器拦截,查看是否登录,即session中是否有值。若已登录即跳转至请求页面,若未登录则跳转至登录界面,并提示未登录

public class SimpleInterceptor  extends AbstractInterceptor {

 

    //用于设置拦截器的名字

    private  String name;

    //为拦截器设置名字的setter方法

    public void setName(String name) {

       this.name = name;

    }

    /**

     * 拦截器实现功能代码

     */

    @Override

    public  String intercept(ActionInvocation invocation) throws  Exception {

       //取得请求相关的ActionContext实例

       ActionContext context =  invocation.getInvocationContext();

       Map session =  context.getSession();

       //取出session中的user属性

       String user = (String) session.get("user");

       //如果没有登录,或者用户名不是xice,都返回重新登录

       if(!("").equals(user)&&("xice").equals(user)){

           return  invocation.invoke();

       }

       context.put("tip", "您还没有登录!");

       return"login";

    }

}

通过ActionContext返回提示信息,jsp界面接收显示方法

${requestScope.tip}


以上是关于SSH框架——Struts2篇的主要内容,如果未能解决你的问题,请参考以下文章

SSH框架——struts2篇

SSH开发模式——Struts2进阶

SSH理解——Struts2篇

SSH框架整(12)

SSH(struts2+spring+hibernate)三大框架整合

ssh三大框架的认识