JavaWeb研究ノート3:HttpServletを(リクエスト&レスポンス)

1 - サーブレットの構成の必需品
  1. フルパス一致
    「/」とを>。以下のような:/ A、/ AA / BB
    >はlocalhost:8080 /プロジェクト名/ AA / BB
  2. パスの試合、試合の前半
    が、「*」終わりと「/」と>。以下のような:/ A / * / *
    > *ワイルドカードは、実際には、一致したが、任意の文字
    >はlocalhost:8080 /プロジェクト名/ AA / BB
  3. 延長試合に
    >書き込み:で始まります「*。」以下のような:。拡張子、。.Aa、* BB

次のようにJavaのと同様のServletContextグローバルパラメータは、外部で定義されています。

<!-- 定义全局参数 -->
<context-param>
	<param-name>favorite</param-name>
	<param-value>type and thinking</param-value>
</context-param>
2-のServletContextリソースファイルを取得します(テストにフォーカス)

ServletContex役割は何ですか?

  1. グローバルコンフィギュレーションパラメータを取得します。
  2. ウェブエンジニアリング・リソースを入手
  3. Accessデータは、フィールドのデータは、サーブレット間で共有オブジェクト

破壊されたときのServletContextを作成すると?

  1. サーバーの起動時には、ServletContextオブジェクトを作成するために、ホスティング、各Webアプリケーションのためになります
  2. マネージドサーバーから削除、またはサーバーがシャットダウンされます

行動の範囲のServletContext:長い同じプロジェクトなどとして、あなたが取ることができます。
Q:Bプロジェクトを取らない理由Aの預金プロジェクト、?A:別のServletContextオブジェクト

多くのBB、直接私の以前のブログ記事での書き込みはありません:サーブレットは、論文の要約を読み込みます

3-のServletContextは、成功したログインの合計数を取得します
  1. 情報を提供するために、視覚的なインターフェイスに必ず、その情報フォーム形態を提供するために、HTMLを書きます
  2. getParameterメソッドは、サーブレットを書くために、情報を取得するには、configureと使用にweb.xmlが、情報REQを取得するオブジェクト
  3. 次のように情報が正しいことを確認し、結果を印刷する、特定のコードを埋める:
    のindex.htmlで:
    <body>
    	<h2>请登录!</h2>
    	<form action="login" method="get">
    		账号:<input type="text" name="username">
    		密码:<input type="text" name="password">
    		<input type="submit" value="登录">
    	</form>
    </body>
    
    doGetメソッドを中がloginservlet:
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    if(username.equals("hpf")&&password.equals("123456")){
    	System.out.println("login success!");
    	resp.getWriter().write("login success!");
    }else{
    	System.out.println("login faild!");
    	resp.getWriter().write("login faild!");
    }
    
  4. ログインに成功ジャンプを達成するには、最初に提供login_success.html、持っている必要がありますの数を取得するために
  5. 番号を取得するには、あなたはまた、CountServletを持っている必要があります。そして、番号を取得し、ページに印刷するのServletContextを使用して
  6. 個人的な書き込みコードの概要と注意事項:

サーブレットに関連付けられている1.html、このフォームのアクション内容でそのフォームは、URLパターンweb.xmlが設定されている必要があり
そうでない場合は、必ず手動でウェブにすること、(新しいサーブレットを選択する場合を除く)、サーブレット2.各書き込みを.xmlファイルのconfigure
3.doGet要求と応答がdoPostメソッドがページを取得し、ジャンプして、ここでの情報の使用を有効に利用することしなければならないオブジェクト
のプロパティを設定し、プロパティを読み込み、回数場所の数を取得するための鍵となることができます4.ServletContextを
5.Servlet htmlのパスとパスは、実際に同じパスで実行されている、それは、プロジェクトディレクトリに同じレベルであります

以下は、完全なコード(フルバージョン)の例である:
でindex.htmlを:

<body>
	<h2>请登录!</h2>
	<form action="login" method="get">
		账号:<input type="text" name="username">
		密码:<input type="text" name="password">
		<input type="submit" value="登录">
	</form>
</body>

doGetメソッドを中がloginservlet:

ServletContext sc = getServletContext();
String username = req.getParameter("username");
String password = req.getParameter("password");
Object count = sc.getAttribute("count");
if(count==null){
	count = 1;
	sc.setAttribute("count", (int)count);
}else{
	sc.setAttribute("count",((int)count+1));
}
if(username.equals("hpf")&&password.equals("123456")){
	System.out.println("login success!");
	//设置状态码
	resp.setStatus(302);
	//定位跳转的位置是哪个页面
	resp.setHeader("Location", "loginSuccess.html");
}else{
	System.out.println("login faild!");
	resp.getWriter().write("login faild!");
}

loginSuccess.html中:

<body>
	<h1>congratulation!login success!</h1>
	<a href="count">点击获取登录成功的次数</a>
</body>

でのdoGetをCountServlet:

ServletContext sc = getServletContext();
int count = (int)sc.getAttribute("count");
resp.getWriter().write("count:"+count);
4-のHttpServletRequestと中国のゴミ問題

Q:HttpServletRequestの最後に使用することは何ですか?A:このオブジェクトは、上で提出されたクライアントカプセル化し、すべてのデータを。

  1. あなたは、クライアントのリクエストヘッダの情報を得ることができます

    //得到一个枚举集合  
    Enumeration<String> headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
    	String name = (String) headerNames.nextElement();
    	String value = request.getHeader(name);
    	System.out.println(name+"="+value);
    }
    
  2. 上のクライアントから送信されたデータを取得します

    String name = request.getParameter("name");
    String address = request.getParameter("address");
    System.out.println("name="+name);
    System.out.println("address="+address);
    -------------------------------------------------
    //name=zhangsan&name=lisi&name=wangwu 一个key可以对应多个值。
    Map<String, String[]> map = request.getParameterMap();
    Set<String> keySet = map.keySet();
    Iterator<String> iterator = keySet.iterator();
    while (iterator.hasNext()) {
    	String key = (String) iterator.next();
    	System.out.println("key="+key + "--的值总数有:"+map.get(key).length);
    	String value = map.get(key)[0];
    	String value1 = map.get(key)[1];
    	String value2 = map.get(key)[2];
    	System.out.println(key+" ======= "+ value + "=" + value1 + "="+ value2);
    }
    //一般情况下,传过来的数据不可能是name=hpf&name=hillain,所以上面的value数组一般不写
    
  3. 中国のデータを取得
    中国と文字化け状況のデータが、次の解決方法を参照することができた場合、サーバーのデータにクライアントが提出したの
    GETメソッド場合、1:

    //使用代码转码
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("userName="+username+"==password="+password);
    //get请求过来的数据,在url地址栏上就已经经过编码了,所以我们取到的就是乱码
    //tomcat收到了这批数据,getParameter 默认使用ISO-8859-1去解码
    //先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串
    username = new String(username.getBytes("ISO-8859-1") , "UTF-8");
    System.out.println("userName="+username+"==password="+password);
    
    //可以在tomcat里面做设置处理,conf/server.xml加上URIEncoding="utf-8"
    //直接在tomcat里面做配置,以后get请求过来的数据永远都是用UTF-8编码
     <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
    

    2、もしPOSTメソッド

    request.setCharacterEncoding("UTF-8"); //这行设置一定要写在getParameter之前
    请求体里面的文字编码get方式,用这行,有用吗? ---> 没用
    

解決するために、ISO-8859-1なぜ必要性を得るために鉛の使用上の文字化け、知っているの図を参照してください。
文字化け説明を取得

5-のHttpServletResponseと中国のゴミ問題

Q:HttpServletResponseの最後に使用することは何ですか?A:このオブジェクトは、クライアントにデータを返すために責任があります。

//以字符流的方式写数据	
//response.getWriter().write("<b>hello response...</b>");
//以字节流的方式写数据 
response.getOutputStream().write("hello response2222...".getBytes());

中国の応答データがありますが、中国が文字化けする可能性がある
2つの二つの状況が発生し、どのように中国が文字化け解決するには、以下に詳細:

  1. 文字ストリーム出力

    response.getWriter()
    //1. 指定输出到客户端的时候,这些文字使用UTF-8编码
    response.setCharacterEncoding("UTF-8");
    //2. 直接规定浏览器看这份数据的时候,使用什么编码来看
    response.setHeader("Content-Type", "text/html; charset=UTF-8");
    response.getWriter().write("这是个测试...");
    
  2. 出力バイトストリーム

    response.getOutputStream()
    //1. 指定浏览器看这份数据使用的码表
    response.setHeader("Content-Type", "text/html;charset=UTF-8");
    //2. 指定输出的中文用的码表
    response.getOutputStream().write("这是个测试...".getBytes("UTF-8"));
    
  3. かどうかは、バイトストリームまたは文字ストリーム、その上のコードの直接の行

    response.setContentType("text/html;charset=UTF-8");
    
6-HttpServletResponseのダウンロードファイルを達成

、直接ダウンロードできるTomcatを使用する最も簡単な方法を達成するために実際には、非常にシンプル。あなたがファイルを我慢する、HTMLを書くこと、ウェブを実行し、マウスのクリックしてダウンロードが、ここでダウンロードが直接開きます、で、そうでない場合は、テキストが、ものの種類は、直接表示されていることをアーカイブこのアプローチは望ましくないので、文字化け。
私たちは、あなたがダウンロードを達成することができます何もする必要はありません理由についてお話しましょう、デフォルトサーブレットでデフォルトのTomcatサーブレット、があるので、これは、HTML形式で静的リソースの上で使用するために設計されたサーブレットのTomcatサーバ、このようなことのCss。
ここでは、ファイルをダウンロードするためにレスポンスを使用して手動でそれを達成することです:

  1. 書き込みHTMLへの最初の、hrefが「サーブレット名?ファイル名=ファイル名。フォーマット」に変更しました
  2. 最後のストリームを保存するために使用され、最初のデータを取得し、ファイルのパス]ダイアログボックスがダウンロードファイルに設定されている取得し、サーブレットを書きます
  3. コードは以下の通りである:
    download.html:
    <body>
    	<h3>文件下载</h3>
    	<a href="test?filename=lqtzs.png">lqtzs.png</a>
    </body>
    
    HttpServletResponseの:
    //1.获取下载的文件名字aa.jpg -- inputStream
    String fileName = req.getParameter("filename");
    //2.获取这个文件在tomcat里面的绝对路径地址
    String path = getServletContext().getRealPath(fileName);
    //让浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接显示
    resp.setHeader("Content-Disposition", "attachment; filename="+fileName);
    //3.转换成输入法(若没有3,也有对话框,不过没法保存)
    InputStream is = new FileInputStream(path);
    OutputStream os = resp.getOutputStream();
    int len = 0;
    byte[] buffer = new byte[1024];
    while((len = is.read(buffer))!=-1){
    	os.write(buffer,0,len);
    }
    os.close();
    is.close();
    
7 - サーブレットの包括的なトレーニング

包括的なトレーニング-登録を達成するためには、セーブデータ、ログインすると、オンラインでダウンロードしてジャンプし
た経験と概要を:

  1. まず第一に、あなたは、新しいWebプロジェクトを作成し、このプロジェクトを削除したい場合は、削除されたこの環境で仕事に行くようにしてください場合
  2. getContextPath.getRealPath(「ファイル名は」)も保存される文書に適用され、元は存在しません。
  3. ライターとのOutputStream文言文言が錆びビット、RESPジャンプとリフレッシュ機能は、学習を強化し続けなければなりません
  4. resp.setContentType( "text / htmlの;のcharset = UTF-8");コードの中国の歪みが解決することが非常に重要です
  5. OutputStreamのファイルパスの私たち自身の定義を書くために、パスは、我々は、ダウンロードコードresp.getOutputStreamで書く必要がありますので、死者を書くことと等価である、実際には、十分に理解あるため、サーバーの応答と出力ストリームで、ファイル出力
  6. :次のようにバージョン1の完全なコードを詳細
    regist.htmlを:
    <body>
    	<h3>请注册:</h3>
    	<form action="save" method="get">
    		账号:<input type="text" name="username"><br><br>
    		密码:<input type="password" name="password"><br><br>
    		昵称:<input type="text" name="nickname"><br><br>
    		<input type="submit" value="注册">
    	</form>
    </body>
    
    SaveServlet:
    ServletContext sc = getServletContext();
    //String realPath = sc.getContextPath();
    //System.out.println(realPath);	//测试路径
    //获得Map集合
    Map<String, String[]> pm = req.getParameterMap();
    Set<String> ks = pm.keySet();
    Iterator<String> iterator = ks.iterator();
    Writer os = new FileWriter(sc.getRealPath("user.properties"));
    while(iterator.hasNext()){
    	String key = iterator.next();
    	String value = pm.get(key)[0];
    	String parameter = new String(key+"="+value);
    	System.out.println();
    	System.out.printf(parameter);
    	os.write(parameter);
    	os.append("\n");
    }
    os.close();
    //设置跳转
    resp.setStatus(302);
    resp.setHeader("Location", "login.html");
    
    login.htmlと:
    <body>
    	<h3>请登录:</h3>
    	<form action="login">
    		账号:<input type="text" name="username">
    		密码:<input type="password" name="password">
    		<input type="submit" value="登录">
    	</form>
    </body>
    
    がloginservlet:
    String username_req = req.getParameter("username");
    String password_req = req.getParameter("password");
    Properties ps = new Properties();
    ServletContext sc = getServletContext();
    InputStream is = sc.getResourceAsStream("user.properties");
    ps.load(is);
    String username_ps = ps.getProperty("username");
    String password_ps = ps.getProperty("password");
    resp.setContentType("text/html;charset=UTF-8");
    if(username_req.equals(username_ps)&&password_req.equals(password_ps)){
    	resp.setStatus(302);
    	resp.setHeader("Location", "download.html");
    }else{
    	resp.getWriter().write("账号密码输入错误!");
    	resp.setHeader("refresh", "3;login.html");
    }
    
    download.html:
    <body>
    	<h3>请选择合适文件下载</h3>
    	<a href="download?filename=lqtzs.png">lqtzs.png</a>
    </body>
    
    するDownloadServlet:
    //1.获取下载的文件名字aa.jpg -- inputStream
    String fileName1 = req.getParameter("filename");
    System.out.println(fileName1);
    //2.获取文件名的时候,以防中文乱码也要转码
    fileName1 = new String(fileName1.getBytes("ISO-8859-1"),"UTF-8");
    System.out.println(fileName1);
    //3.获取这个文件在tomcat里面的绝对路径地址
    String path = getServletContext().getRealPath(fileName1);
    /*4.如果文件的名字带有中文,那么要对这个文件名进行编码处理
    如果是IE或者Chrome,使用URLEncoding编码
    如果是Firefox,使用Base64编码*/
    String ua = req.getHeader("User-Agent");
    if(ua.contains("Firefox")){
    	fileName1 = DownloadUtil.base64EncodeFileName(fileName1);
    }else{
    	fileName1 = URLEncoder.encode(fileName1, "UTF-8");
    }
    //5.让浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接显示
    resp.setHeader("Content-Disposition", "attachment; filename="+fileName1);
    InputStream is = new FileInputStream(path);
    OutputStream os = resp.getOutputStream();
    byte[] bytes = new byte[1024];
    int len = -1;
    while((len = is.read(bytes))!=-1){
    	os.write(bytes, 0, len);;
    }
    os.close();
    is.close();
    
HPF-自己概要

  私は、このセクションの焦点は、中国が意志を使用して、実際には、応答と要求するので、HTMLとサーブレットとの間の接続のアイデアだけでなく、文字化けに対処することだと思います。私は時にするDownloadServlet書き込み、OutputStreamを不使用のresp.getOutputStreamが、予測可能な結果を手新しいもの、ハッハッハ、に、ミスを犯した前ので難易度は、動作入力および出力ストリームを使用している場合があります。
  これは、あなたが人々を助けることができれば、それはハッハッハ優れている、ブログのノートです。最後になりましたが、研究と瞑想は、忍耐力がなければならない、似ています。

公開された15元の記事 ウォン称賛18 ビュー4576

おすすめ

転載: blog.csdn.net/oZuoShen123/article/details/105061015