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
request_attribute_remove1.jsp
request_attribute_remove2.jsp
テストを実行します.また問題が発生しました!
症状:
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
session_attribute_remove1.jsp---符号化UTF-8
session_attribute_remove2.jsp---コードISO-8859-1
先ほど、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ジャンプの違いに注意してください.
ソリューション:
コードは次のとおりです.
主な考え方は、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>