requestの生存期間はサーバジャンプのみ

28307 ワード

症状:
先ほど、a.jspでrequestに属性(ページコードはUTF-8)を追加し、b.jspでその属性(ページコードはISO-8559-1)を削除し、Serv letRequestAttributeListenerで削除に成功したかどうかを観察したいと思っていました.(ページコードがattribute nameの比較に影響するかどうかを見るのが目的です.)
ブラウザで...a.jsp、車に戻って、入力...b.jsp,リターン
その後、サーブレットRequestAttributeListenerはrequestの属性が削除されたことを常に検出していないことが分かった.
分析:
「ブラウザで...a.jspを入力して、車に戻って、それから...b.jspを入力して、車に戻ります」
2つの異なるrequestは、b.jspにアクセスする際にもう1つのrequest objectになっています.client-sideジャンプとserver-sideジャンプの違いに注意してください.
ソリューション:
などのserver-sideジャンプを使用
コードは次のとおりです.
主な考え方は、a.jspが1つのパラメータarg 1をattibuteのkey(またはname)として提出し、b.jspにジャンプ(server-sideジャンプ)し、もう1つのパラメータarg 2を入力し、提出後arg 1.equals(arg 2)がtrueを返すと、requestがarg 1をkeyとするattributeを削除できます.
ServletRequestAttributeListener.java
public class ServletRequestAttributeListenerDemo implements ServletRequestAttributeListener {

    public void attributeAdded(ServletRequestAttributeEvent srae){

        System.out.println("**  request  -->  :" + srae.getName() + ", :" + srae.getValue()) ;

    }

    public void attributeRemoved(ServletRequestAttributeEvent srae){

        System.out.println("**  request  -->  :" + srae.getName() + ", :" + srae.getValue()) ;

    }

    public void attributeReplaced(ServletRequestAttributeEvent srae){

        System.out.println("**  request  -->  :" + srae.getName() + ", :" + srae.getValue()) ;

    }

}

/*

    <listener>

        <listener-class>

            org.foo.listenerdemo.ServletRequestAttributeListenerDemo

        </listener-class>

    </listener>

*/

request_attribute_remove1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

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

<title>Insert title here</title>

</head>

<body>

<!--  form , java charset, java attrname  -->

<%

    String attr_name1 = request.getParameter("attr_name1");

    if (attr_name1!=null && !attr_name1.equals("")) {

        session.setAttribute(attr_name1, "java") ;

        //  server-side , request 

        request.getRequestDispatcher("request_attribute_remove2.jsp").forward(request, response);

    }

%>

<form action="request_attribute_remove1.jsp" method="post"><input type="text" name="attr_name1">

         <input type="submit" value=" ">

</form>

</body>

</html>

request_attribute_remove2.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Insert title here</title>

</head>

<body>

<%

    String attr_name2 = request.getParameter("attr_name2");

    if (attr_name2!=null && !attr_name2.equals("")) {

        session.removeAttribute(attr_name2) ;

    }

%>

<form action="request_attribute_remove2.jsp" method="post">

    Attribute name:<input type="text" name="attr_name2">

         <input type="submit" value="Delete Attribute">

</form>

</body>

</html>

テストを実行します.また問題が発生しました!
症状:
a.jspがパラメータ「info」をコミットした後、consoleは「**追加request属性-->属性名:info、属性内容:java」を表示し、b.jsp(server-sideジャンプ)にジャンプし、パラメータ「info」をコミットします.consoleには何も表示されません.
分析:
formのactionはclient-sideジャンプで、ブラウザのアドレスバーが変わったことに注意!
ソリューション:
今はrequestをsessionに変えてHttpSessionAttributeListenerを使っています
form actionはserver-sideジャンプを実現できますか?
sessionに変換した結果,提出されたパラメータがACSII文字であれば,ページの符号化が異なっても内部Stringの比較に影響を及ぼさず,非ASCII文字,例えば中国語文字が2つの符号化が一致しないページをもたらす可能性があり,同じ文字列であってもequalsの比較結果はfalseであると結論した(この記事:http://www.cnblogs.com/qrlozte/p/3516716.html参照).
コードは次のとおりです.
HttpSessionAttributeListener
public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener {

    public void attributeAdded(HttpSessionBindingEvent se){

        System.out.println(se.getSession().getId() + ",  -->  " + se.getName() + ", :" + se.getValue()) ;

    }

    public void attributeRemoved(HttpSessionBindingEvent se){

        System.out.println(se.getSession().getId() + ",  -->  " + se.getName() + ", :" + se.getValue()) ;

    }

    public void attributeReplaced(HttpSessionBindingEvent se){

        System.out.println(se.getSession().getId() + ",  -->  " + se.getName() + ", :" + se.getValue()) ;

    }

}

/*

    <listener>

        <listener-class>

            org.foo.listenerdemo.HttpSessionAttributeListenerDemo

        </listener-class>

    </listener>

*/

session_attribute_remove1.jsp---符号化UTF-8
<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

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

<title>Insert title here</title>

</head>

<body>

<!--  form , java charset, java attrname  -->

<%

    String attr_name1 = request.getParameter("attr_name1");

    if (attr_name1!=null && !attr_name1.equals("")) {

        session.setAttribute(attr_name1, "java") ;

        request.getRequestDispatcher("request_attribute_remove2.jsp").forward(request, response);

    }

%>

<form action="session_attribute_remove1.jsp" method="post"><input type="text" name="attr_name1">

         <input type="submit" value=" ">

</form>

</body>

</html>

session_attribute_remove2.jsp---コードISO-8859-1
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Insert title here</title>

</head>

<body>

<%

    String attr_name2 = request.getParameter("attr_name2");

    if (attr_name2!=null && !attr_name2.equals("")) {

        session.removeAttribute(attr_name2) ;

    }

%>

<form action="session_attribute_remove2.jsp" method="post">

    Attribute name:<input type="text" name="attr_name2">

         <input type="submit" value="Delete Attribute">

</form>

</body>

</html>