目次
リクエストの転送:クリックして、リクエストの転送とリダイレクトの違いを確認します
リクエスト
ユーザーがブラウザーを介してサーバーにアクセスすると、TomcatはHttp要求のすべての情報をRequestオブジェクトにカプセル化し、開発者は要求オブジェクトメソッドを介してブラウザーで送信されたすべての情報を取得できます。
リクエストリクエスト情報を取得する
リクエストライン情報を取得する
リクエストライン情報には以下が含まれます:リクエストメソッドリクエストパス(getリクエストはパラメータを運ぶ)プロトコル/バージョン
関連API:
reqeust.getMethod()---->リクエストメソッドを取得します
request.getContextPath()----->プロジェクトのアプリケーションパスを取得します
request.getRemoteAddr()----->リクエスターのIPを取得します
request.getQueryString()------> getrequestのすべてのリクエストパラメータを取得します
request.getProtocol()------->プロトコルとバージョンを取得する
request.getRequestURI()----->リクエストパスを取得します
getRequest URL():統一リソースロケーター(絶対パス)
getRequest URI():統一リソース記述子(相対パス)
コードケース:
public class RequestLineServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.1 获得请求方式
String method = request.getMethod();
//1.2 获得项目的虚拟发布名称(别名) - 用于动态的项目路径
String contextPath = request.getContextPath();
//1.3 获得远程主机的ip地址(指的是客户端的ip)
String remoteAddr = request.getRemoteAddr();
//1.4 获得?号后面的数据部分
String queryString = request.getQueryString();
//1.5 获得协议版本
String protocol = request.getProtocol();
//1.6统一资源定位符(绝对路径)
StringBuffer requestURL=request.getRequestURL();
//1.7统一资源描述符(相对路径)
String requestURI = request.getRequestURI();
}
}
リクエストヘッダー情報を取得します。
getHeader(String):---->キーに従って文字列データを取得します
一般的なリクエストヘッダー:
参照元:---->リソースのソースを取得します。直接入力した場合、参照元はありません
user-agent ---->システムバージョンとブラウザバージョン
リファラーは、申請プロセスで、ホットリンクを防ぐために使用される以前のリソースパスを表示するためによく使用されます。たとえば、誰かがニュースにアクセスしたときに、正しい合法的なWebサイトから転送された場合、違法なWebサイトからの特定のニュースを指していれば、通常どおり閲覧できます。 、ページのソースは他の人のウェブサイトです(ウェブサイトのアドレスは一意です)。これはホットリンクを形成します。したがって、接続訪問中に自分のウェブサイトによって提供されているかどうかを判断できます。
コードケース:
public class RefererServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("网站内部后台被访问了");
//多个人可以访问服务器 需要判断
String referer = request.getHeader("referer");
if("http://localhost:8080/day09/index.html".equals(referer)){
System.out.println("自己网站的路径 可以继续访问");
}else{
System.out.println("钓鱼网站的路径 提示用户修改密码");
}
}
}
リクエストパラメータを取得します。
string getParameter(String s)------>キーに従って値を取得します
Map <String、String []> getParameterMap()------>すべてのキーと値のペアのデータを取得し、マップにカプセル化します
string [] getParameterValues()------>キーに従って値のセットを取得します
コードケース:
public class RequestParamServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String[] hobbies = request.getParameterValues("hobby");
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
System.out.println(entry.getKey() + "@@" + Arrays.toString(entry.getValue()));
}
}
}
リクエスト後の処理中国語の文字化け
コードの文字化けの問題について:ストレージコードと読み取りコードに一貫性がない場合にのみ発生します。フォームがデータを送信する場合、httpプロトコルのデフォルトコードはiso-8859-1です。このコードの特徴は、中国語をサポートしていないことですが、 getリクエストの実行時に文字化けの問題はありません。この状況はtomcatのバージョンに関連しています。Tomcat8.5はすでにgetリクエストの中国語の文字化けを処理していますが、投稿は処理されていないため、自分で処理する必要があります。これに対処する方法は、パラメータを取得する前に対処してください。
//要求されたエンコーディングを設定します
request.setCharacterEncoding( "utf-8");この処理コードを最初に配置する必要があります。
リクエストパラメータの情報はバッファに配置されます。バッファのコードは1回だけ初期化でき、データを取得する前にエンコーディングを設定できます。最初にバッファからデータを取得した場合、バッファのエンコーディングは固定され、変更できなくなります。
他の機能を要求する
ドメインオブジェクト(共有データ)
- ドメインオブジェクト:スコープ内でデータを共有できるスコープを持つオブジェクト
- reqeustドメイン:リクエストのスコープを表し、リクエストで転送される2つのリソース間でデータを共有できます
- リクエストのライフサイクル:リクエストが来るとリクエストオブジェクトが作成され、レスポンスが生成されるとリクエストは破棄されます
リクエストの転送:クリックして、リクエストの転送とリダイレクトの違いを確認します
応答
応答動作応答情報
運用対応ライン
応答行情報には、プロトコル/バージョン番号とステータスコードが含まれます。
ステータスコード:
- 200:要求応答が成功しました
- 302:リダイレクト、ブラウザは2番目のリクエストを再開します
- 304:ブラウザはデフォルトでローカルキャッシュを読み取ります
- 404:ファイルが見つかりません
- 405:getまたはpostメソッドが見つからないか、親クラスのgetまたはpostメソッドが手動で呼び出されました
- 500:サーバー内部コードエラー。
応答ヘッダーを設定します
一般的な応答ヘッダー:
- 場所:リダイレクトされたアドレスを設定します
- 更新:定期的な更新
- content-type:返されるデータのmimeタイプとエンコーディングを設定します
- content-disposition:ファイルのダウンロードに使用される宣言モードで応答を開くようにコンテンツを設定します。値は添付ファイルです。ファイル名=ファイル名。サフィックス
API:
setHeader(String response header、String value):値を文字列タイプの応答ヘッダーに設定します。後の設定で前の設定が上書きされます
addHeader(Strign応答ヘッダー、文字列値):タイプStringの応答ヘッダーを追加します
コードケース:リダイレクト
public class ThreeServletServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置状态吗
//response.setStatus(302);
//2.设置响应头地址信息 可以跳转站外地址
//response.setHeader("location", "http://www.baidu.com/");
//可以跳转站内资源 跟请求转发不一样的时候 需要加上项目的虚拟路径名称
//请求转发: 只是服务器内部的动作 , 重定向是可以跳转服务器外部信息
//response.setHeader("location", "/day09/fourServlet");
//重定向的简化api
response.sendRedirect( "/day09/fourServlet");
}
}
操作応答本体:
API
PrintWriter getWriter(); //一般的に
ServletOutputStreamで文字データを書き込むgetOutputStream(); //一般的なファイルダウンロードの使用
注:
2つのストリームを同じロジックに表示することはできず、2つのストリームは相互に排他的です。
中国の文字化け処理への応答
setContentType( "mime type、charset = utf-8")
- 応答のデータmimeタイプを設定します
- データの文字エンコードを設定します
- データを解析するエンコーディングをブラウザに指示します
public class ResponseBodyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 响应体其实就是流
* 字节流 : 一般用于输出 图片 视频 文件..信息
* response.getOutputStream() 字节流
* 字符流 : 一般用于输出 文本信息
* response.getWriter() 打印流 字符流
* api : 都是write 用于输出内容
* print的底层都是write 建议都用print方法输出内容
* 注意: 字节流和字符流不能同时使用(会报错)
*/
//我们需要特殊设置内容 通知浏览器 以什么方式 什么编码解析内容
//设置响应的数据格式及编码 设置输入法 在中文下使用英文标点
//出现在第一行
request.setCharacterEncoding("utf-8");
//response.setHeader("content-type" , "text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("aaa<a href=''>百度一下</a>");
}
}