requestのメモ
一、要求データを取得する.
String getParameter(String name)メソッドでは指定された名前データが得られ、Enumeration getParameterName()ではすべてのデータの名前が得られ、反復ですべてのデータが得られ、String[]getParameterValue(String name)では同じ名前のすべてのデータが得られ、String配列が返されます.他にもいろいろな方法がありますが、その中で役に立つのはMapgetParameterMap()の方法だと思います.ブラウザからフォームを取得してデータをコミットすると、例えばフォームを登録すると、通常はformbeanにカプセル化します.この方法で便利になり、BeanUtilsラックパッケージから提供されるpopulateメソッドでformbeanオブジェクトとメソッドから返されたmapオブジェクトを転送することで、mapからbeanへのコピーを実現することができます.
二、request文字化けし問題.
ブラウザがサーバにデータを転送すると、現在のページで使用されているコードテーブルが照会され、このコードテーブルに従ってデータがサーバに転送され、サーバはrequestを通じてデータを取得し、requestはISO-8559コードテーブルをデフォルトで照会し、両側に異なるコードテーブルを使用すると、文字化けが発生します.データを取得する前にrequest.setCharacterEncoding(「UTF-8」)requestが採用する符号表を設定します.しかし、ここで注意しなければならないのは、この方法はpost方法でコミットされたデータにのみ有用であり、get方法でコミットされたデータには役に立たない.すなわち、データを取得する前に符号化方式を設定しても、データコミット方式がgetであれば、依然として文字化されていない.もちろんformフォームのコミット方式は基本的にpostに変更されますが、ハイパーリンクのコミット方式はgetです.ハイパーリンク後にデータがあると文字化けしてしまう可能性があります.この解決策はサーバ構成を変えることで解決できますが、この方法は基本的に採用されていません.結局、サーバ構成を変更すると他のウェブアプリケーションに影響を与えます.解決策は手作業で解決するしかない.
三、転送を要求する.
この方法はweb開発においてMVC設計モードでよく用いられるが、このときservletがデータのみを処理し、jspがデータのみを表示するので、servletがデータを処理した後、requestのsetAttributeメソッドを呼び出し、requestドメインにデータを格納し、RequestDispatcher getRequestDispatcher(String path)メソッドを呼び出し、このメソッドはRequestDispatcherオブジェクトを返し、forwardメソッドを呼び出すと、リクエストをjspに転送し、jspからデータ表示を取り出すことができます.
リダイレクトアドレスバーは変更され、クライアントは合計2回リクエストを送信したが、リクエスト転送アドレスバーは変更されず、クライアントも1回のみリクエストを送信した.
さらに、(1)forwardメソッドを呼び出す前にservlet書き込み部がクライアントに実際に送信された場合、IllegelStateException異常が放出されることに注意する必要があります.
四、refere防犯チェーン.
サイトが苦労して見つけたリソースが、簡単に他人にアドレスでアクセスされると、サイトの苦労は他人のサイトのハイパーリンクだけではありません.だからrefeeで来訪先を得ることができて、もし当駅を通じて飛び込んで来ないならば、当駅のトップページに戻ります.
String getParameter(String name)メソッドでは指定された名前データが得られ、Enumeration getParameterName()ではすべてのデータの名前が得られ、反復ですべてのデータが得られ、String[]getParameterValue(String name)では同じ名前のすべてのデータが得られ、String配列が返されます.他にもいろいろな方法がありますが、その中で役に立つのはMapgetParameterMap()の方法だと思います.ブラウザからフォームを取得してデータをコミットすると、例えばフォームを登録すると、通常はformbeanにカプセル化します.この方法で便利になり、BeanUtilsラックパッケージから提供されるpopulateメソッドでformbeanオブジェクトとメソッドから返されたmapオブジェクトを転送することで、mapからbeanへのコピーを実現することができます.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getParameter("username"));
Enumeration e=request.getParameterNames();
while(e.hasMoreElements()){
String name=(String)e.nextElement();
System.out.println(request.getParameter(name));
}
Map map=request.getParameterMap();
User user=new User();
try {
BeanUtils.populate(user, map);// map bean
//BeanUtils.copyProperties(bean1,bean2);//bean
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
}
二、request文字化けし問題.
ブラウザがサーバにデータを転送すると、現在のページで使用されているコードテーブルが照会され、このコードテーブルに従ってデータがサーバに転送され、サーバはrequestを通じてデータを取得し、requestはISO-8559コードテーブルをデフォルトで照会し、両側に異なるコードテーブルを使用すると、文字化けが発生します.データを取得する前にrequest.setCharacterEncoding(「UTF-8」)requestが採用する符号表を設定します.しかし、ここで注意しなければならないのは、この方法はpost方法でコミットされたデータにのみ有用であり、get方法でコミットされたデータには役に立たない.すなわち、データを取得する前に符号化方式を設定しても、データコミット方式がgetであれば、依然として文字化されていない.もちろんformフォームのコミット方式は基本的にpostに変更されますが、ハイパーリンクのコミット方式はgetです.ハイパーリンク後にデータがあると文字化けしてしまう可能性があります.この解決策はサーバ構成を変えることで解決できますが、この方法は基本的に採用されていません.結局、サーバ構成を変更すると他のウェブアプリケーションに影響を与えます.解決策は手作業で解決するしかない.
//request.setCharacterEncoding("UTF-8");// post , get
String username=request.getParameter("username");
String name=new String(username.getBytes("ISO8859-1"),"UTF-8");
System.out.println(username);
System.out.println(name);
三、転送を要求する.
この方法はweb開発においてMVC設計モードでよく用いられるが、このときservletがデータのみを処理し、jspがデータのみを表示するので、servletがデータを処理した後、requestのsetAttributeメソッドを呼び出し、requestドメインにデータを格納し、RequestDispatcher getRequestDispatcher(String path)メソッドを呼び出し、このメソッドはRequestDispatcherオブジェクトを返し、forwardメソッドを呼び出すと、リクエストをjspに転送し、jspからデータ表示を取り出すことができます.
リダイレクトアドレスバーは変更され、クライアントは合計2回リクエストを送信したが、リクエスト転送アドレスバーは変更されず、クライアントも1回のみリクエストを送信した.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data="xxx";
//request ,
request.setAttribute("data", data);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
さらに、(1)forwardメソッドを呼び出す前にservlet書き込み部がクライアントに実際に送信された場合、IllegelStateException異常が放出されることに注意する必要があります.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data="xxx";
request.setAttribute("data", data);
PrintWriter writer=response.getWriter();
writer.write(data);
writer.close();
//
request.getRequestDispatcher("/3.jsp").forward(request, response);
}
(2)forwardメソッドを呼び出す前にservletのresponseにデータを書き込むと、データがクライアントに実際に伝達されない限り、forwardメソッドは正常に実行され、responseに書き込まれたデータは空になりますが、responseの応答ヘッダセグメント情報は有効に維持されます.四、refere防犯チェーン.
サイトが苦労して見つけたリソースが、簡単に他人にアドレスでアクセスされると、サイトの苦労は他人のサイトのハイパーリンクだけではありません.だからrefeeで来訪先を得ることができて、もし当駅を通じて飛び込んで来ないならば、当駅のトップページに戻ります.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String refere=request.getHeader("refere");
if(refere==null||refere.startsWith("/http:localhost")){
response.sendRedirect("/Test/index.jsp");
return;
}
String data="xxx";
response.getWriter().print(data);
}