Struts2+Spring整合 火推04 session struts2組件列表 Interceptor攔截器

day04

登陸使用session

struts2的session獲取支持兩種方式,httpSession、SessionMapjavascript

導包:css

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>

一:使用的是sessionMap對象----不推薦html

Map<String, Object> session = ActionContext.getContext().getSession();
session.put("usernameS", username);

二:使用httpSession方式----不推薦前端

HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("usernameS", username);

三:實現sessionaware接口,並實現其中的setsession方法---推薦java

爲了便於其它action共同使用同一個變量session(全局session),咱們須要將session抽取成基類,其它action若是使用,則繼承此基類便可

/**
 * Action基類,便於其它action使用全局session對象信息
 * @author likang
 * @date   2018-1-10 上午8:56:57
 */
public class BaseAction implements SessionAware{

    public Map<String, Object> session;

    /**
     * 此getter方法,是變量session的getter方法
     * @return
     */
    public Map<String, Object> getSession() {
        return session;
    }

    /**
     * 是接口SessionAware中的接口方法,並不是session的setter方法
     */
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

}

 

四:設置BaseAction ,session基類,這樣全局均可以調用

public class BaseAction implements SessionAware{

    public Map<String, Object> session; 
    public Map<String, Object> getSession() {
        return session;
    }
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }    
}


 

struts2組件列表

StrutsPrepareAndExecuteFilter

1:接收請求,而且將請求進行過濾
2:進行轉發到struts.xml進行處理

filter控制器,是須要配置到web.xml中
而且默認的請求後綴名是action和空
若是想修改請求後綴名,則須要在struts.xml中增長以下屬性信息:
    <constant name="struts.action.extension" value="do"/>
若是是容許多個請求後綴,則須要用逗號隔開


(須要進行數據攔截)
(會將請求的數據和響應的數據封裝到值棧中)

Action

package須要繼承struts-default

默認的action是:com.opensymphony.xwork2.ActionSupport
其中有默認的方法:execute
默認的返回值:success

result

1:應用於界面響應的

    dispatcher
    redirect

2:應用於action響應的

    chain
    redirectAction

3:應用於字節流的響應

    stream

4:應用於json的響應

    json---(須要引用struts-json.jar包)

驗證碼實現

需求:jquery

在登陸頁面,增長驗證碼(圖片)信息

請求:web

login.jsp-->/image.do--->action---->login.jsp

開發步驟:ajax

1:修改login.jsp文件,增長驗證碼信息
2:配置一個image.do的action信息(struts.xml)
3:添加一個ImageAction.java文件,execute--生成一張驗證碼圖片

login.jsp:apache

驗證碼:<input id="code" name="code" type="text"><img src="image.do"></img><br/>

ImageAction.java:json

/**
 * 生成驗證碼圖片
 * @author likang
 * @date   2018-1-10 上午10:16:26
 */
@Controller
public class ImageAction {

    public InputStream image;

    public String execute(){

        try {
            BufferedImage bi = new BufferedImage(100, 50, BufferedImage.TYPE_INT_RGB);//表明建立一個畫布或者像素空間
            Graphics graphics = bi.getGraphics();//建立畫筆
            graphics.setColor(Color.RED);//設置圖片前景顏色
            graphics.drawString("java13", 0, 50);//畫信息

            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            ImageIO.write(bi, "png",  bout);//將圖片信息,添加到outputstream中

            byte[] by = bout.toByteArray();//j  a  v  a  1  3
            image = new ByteArrayInputStream(by);//將字節流轉換成字符流

            return "success";

        } catch (Exception e) {
        }
        return "error";
    }

    public InputStream getImage() {
        return image;
    }

    public void setImage(InputStream image) {
        this.image = image;
    }

}

struts.xml:

<!-- 生成驗證碼圖片 -->
    <action name="image" class="imageAction" method="execute">
        <result name="success" type="stream">
            <param name="inputName">image</param>
        </result>
    </action>

使用工具類來生成驗證碼

//經過工具類來生成驗證碼
ValidateCode vc = new ValidateCode(200, 50, 2, 1);
image = vc.getInputStream();

驗證碼校驗

流程:

1:CheckCodeAction.java須要去判斷輸入的驗證碼和系統生成的驗證碼是否一致
2:系統生成的驗證碼須要在image.do的時候,就須要獲取到code字符值

開發步驟:

1:導包:


    <!-- json數據類型 -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-json-plugin</artifactId>
        <version>2.5.13</version>
    </dependency>

2:修改struts.xml中的package中extends屬性爲json-default

    <package name="user" extends="json-default" namespace="/user">

3:增長驗證碼校驗接口struts.xml

    <!-- 驗證碼校驗 -->
    <action name="checkCode" class="checkCodeAction" method="execute">
        <result name="success" type="json"><!-- 來源於struts-json包中的xml文件 -->
            <param name="root">rc</param><!-- root表明json實現類中的參數變量,負責接收json數據 -->
        </result>
    </action>

4:增長一個返回值的實體信息,封裝成json格式數據

    /**
 * 返回的實體對象信息---json格式
 * @author likang
 * @date   2018-1-10 上午11:31:31
 */
public class ReturnContans implements Serializable{

    private int status;
    private String msg;
    private Object data;
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
}

5:增長CheckCodeAction

    /**
 * 驗證碼校驗
 * @author likang
 * @date   2018-1-10 上午11:27:36
 */
@Controller
public class CheckCodeAction extends BaseAction{

    public String code;//接收用戶輸入的驗證碼信息

    ReturnContans rc = new ReturnContans();

    public String execute(){
        String Scode = session.get("Scode").toString();//獲取系統生成的驗證碼
        if (StringUtils.isNotBlank(code) && StringUtils.isNotBlank(Scode)) {
            if (code.equalsIgnoreCase(Scode)) {
                rc.setStatus(0);//0:表明驗證碼正確
                rc.setMsg("驗證碼輸入正確");
//              return "";//驗證碼輸入正確
            }else{
                rc.setStatus(1);//1:表明驗證碼錯誤
                rc.setMsg("驗證碼輸入錯誤");
            }
        }
        return "success";//驗證碼輸入錯誤\驗證碼輸入正確
    }


    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }


    public ReturnContans getRc() {
        return rc;
    }


    public void setRc(ReturnContans rc) {
        this.rc = rc;
    }
}

6:在系統驗證碼生成的時候,須要將驗證碼存放於session中,便於使用校驗

    ImageAction.java:
        session.put("Scode", vc.getCode());

7:編寫login.jsp文件,增長js校驗,發送ajax請求


    <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.min.js"></script>
    <script type="text/javascript">

        $(function(){
            $("#code").blur(function(){
                var code = $("#code").val().trim();
                if (code == "") {
                    $("#Vcode").html("不能爲空");
                    $(":submit").attr("disabled","disabled");
                }else{
                    $.ajax({
                        url:"${pageContext.request.contextPath }/user/checkCode.do",
                        type:"post",
                        dataType:"json",
                        data:{"code":code},
                        success:function(result){
                            if (result.status == 1) {
                                $("#Vcode").html("驗證碼錯誤");
                                $(":submit").attr("disabled","disabled");
                            }else{
                                $("#Vcode").html("驗證碼正確");
                                $(":submit").removeAttr("disabled");
                            }
                        }
                    })
                }
            });

        });

    </script>


    驗證碼:<input id="code" name="code" type="text"><img src="image.do"></img><span id="Vcode"></span>

Interceptor攔截器

struts2提供大量的攔截器,有一個默認的攔截器棧defaultStack

攔截器可使用作爲登陸檢測、性能檢測、權限檢測等等

攔截器棧:interceptor-stack

裏面封裝了須要執行的攔截器

需求:

/list.do----變動:若是用戶沒有登陸,則不能訪問,直接跳轉登陸頁面

開發步驟:

1:自定義一個攔截器,實現Interceptor,並實現其中的intercept方法

    /**
     * 自定義攔截器---攔截用戶是否登陸
     * @author likang
     * @date   2018-1-10 下午2:40:10
     */
    public class DemoInterceptor implements Interceptor{

        @Override
        public void destroy() {
            // TODO Auto-generated method stub

        }

        @Override
        public void init() {
            // TODO Auto-generated method stub

        }

        /**
         * 若是返回值爲noLogin,則表明用戶沒有登陸,此時須要跳轉toLogin.do接口
         * 若是usernameS不爲空,則返回NULL,或者返回invocation.invoke(),表明是繼續執行下一步攔截
         */
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
            //檢測用戶是否登陸
            Map<String, Object> session = ActionContext.getContext().getSession();
            if (session != null) {
                if (session.get("usernameS") != null && !"".equals(session.get("usernameS"))) {
                }else{
                    return "noLogin";//-result-----toLogin.do
                }
            }
            return invocation.invoke();
        }

    }

2:在struts.xml中,增長攔截器設置指定

    <package>
        <interceptors>
            <interceptor name="noLoginInterceptor" class="com.xdl.util.DemoInterceptor"></interceptor>
        </interceptors>
    </package>

3:在須要攔截的action中,指定攔截器指向ref,和result組件返回值

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

     <result name = "noLogin" type="redirectAction">
            <param name="namespace">/user</param>
            <param name="actionName">toLogin</param>
    </result>


4:爲了更方便擴展和應用,將攔截器設置進行提取

    <package name="demo-default" extends="struts-default">
        <interceptors>
            <interceptor name="noLoginInterceptor" class="com.xdl.util.DemoInterceptor"></interceptor>
        </interceptors>
        <global-results>
            <result name = "noLogin" type="redirectAction">
                <param name="namespace">/user</param>
                <param name="actionName">toLogin</param>
            </result>
        </global-results>
    </package>

5:在須要攔截的action中,進行指定,前提須要package繼承demo-default

    <default-interceptor-ref name="noLoginInterceptor"></default-interceptor-ref>

開發工具中,前端資源文件報錯解決方式

前端文件如:css/js/jsp/html等等

Struts2註解配置

1:導包

<!-- 註解包 -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-convention-plugin</artifactId>
        <version>2.5.13</version>
    </dependency>

2:註解

對應到action類上面:

    @Namespace(value="/demo")
    @ParentPackage(value="demo-default")

對應到action中的方法上面:

    @Action(value="hello",results={
        @Result(name="success",location="/WEB-INF/jsp/hello.jsp")
    })

增長自定義攔截器後,一些功能沒法使用問題

修改struts.xml:

<package name="demo-default" extends="struts-default">
    <interceptors>
        <interceptor name="noLoginInterceptor" class="com.xdl.util.DemoInterceptor"></interceptor>
        <interceptor-stack name="demoStack">  <!-- 攔截棧 先走咱們自定義的,再走Struts2默認的攔截器-->
            <interceptor-ref name="noLoginInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </interceptor-stack>
    </interceptors>
    <global-results>
        <result name = "noLogin" type="redirectAction">
            <param name="namespace">/user</param>
            <param name="actionName">toLogin</param>
        </result>
    </global-results>
</package>




<default-interceptor-ref name="demoStack"></default-interceptor-ref>

ValueStack(接口)

前端界面調試以及數據展現:

須要在前端頁面增長S標籤:

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

<s:debug></s:debug>

OGNL應用

Object-Graph Navigation Language

引入ognl-3.1.15.jar 包

對象導航圖語言

public class TestStack {


    @Test
    public void test1(){
        Dept dept = new Dept();
//      dept.setDeptName("nihao");
//      System.out.println(dept.getDeptName());
        setPreperties(dept, "deptName", "nihao");
        System.out.println(dept.getDeptName());
    }


    public void setPreperties(Object entity,String name,String value){
        try {
            Ognl.setValue(name, entity, value);
        } catch (OgnlException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void test2() throws OgnlException{
        Dept dept = new Dept();
        dept.setDeptName("nihaoa");
        System.out.println("數據初始化:"+dept.getDeptName());

        String deptname = (String) Ognl.getValue("deptName", dept);
        System.out.println("經過OGNL獲取數據值:"+deptname);


        Map<String, Object> context = new HashMap<String, Object>();
        context.put("deptName", "nihao-----123123");

        String deptnameS = (String) Ognl.getValue("#deptName", context, dept);
        System.out.println("ognl經過表達式獲取值:"+deptnameS);

    }
}
相關文章
相關標籤/搜索