requestのメモ

4295 ワード

一、要求データを取得する.
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);
	}