1.HttpServletRequestの概要
サーブレットを作成service()
するときにメソッドをオーバーライドします。またはdoGet()/doPost()
、これらのメソッドには2つのパラメーターがあります。1つは要求を表す要求で、もう1つは応答を表す応答です。
serviceメソッドのリクエストタイプはServletRequestであり、doGet / doPostメソッドのリクエストタイプはHttpServletRequestです。、HttpServletRequestは、より強力な関数とメソッドを備えたServletRequestのサブインターフェイスです。今日はHttpServletRequestを学習しています。
2.パケットキャプチャツールを使用してHttpリクエストを取得します
リクエストはリクエストを表すため、このオブジェクトを介してHttpリクエストを取得できますリクエストライン、リクエストヘッダーとリクエスト本文
3つ目は、リクエストを通じてリクエストラインを取得する
クライアントのリクエストメソッドを取得します。String getMethod()
要求されたリソースを取得します。
String getRequestURL()
StringBuffer getRequestURL()
String getContextPath()
---- Webアプリケーションの名前String getQueryString()
---- URLアドレスusername = zhangsan&password = 123を送信した後、パラメータ文字列を取得します
場合:
String method = request.getMethod();
System.out.println("method:"+method);
//2、获得请求的资源相关的内容
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println("uri:"+requestURI);
System.out.println("url:"+requestURL);
//获得web应用的名称
String contextPath = request.getContextPath();
System.out.println("web应用:"+contextPath);
//地址后的参数的字符串
String queryString = request.getQueryString();
System.out.println(queryString);
//3、获得客户机的信息---获得访问者IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println("IP:"+remoteAddr);
効果は次のとおりです。
このアドレスはIPV6アドレスです。127.0.0.1に変更する場合は、コンピューターの構成を変更する必要があります。ローカルIPを表します。
4つ目は、リクエストを通じてリクエストヘッダーを取得する
long getDateHeader(String name)
String getHeader(String name)
-指定されたヘッドを取得しますEnumeration getHeaderNames()
-すべての頭の名前を取得しますEnumeration getHeaders(String name)
int getIntHeader(String name)
ケースナンバーワン:
新しいHeaderServletを作成し、次のように記述します
//1.获得指定的头,这里是获取USER-Agent也就是用户使用的浏览器
String header = request.getHeader("User-Agent");
System.out.println(header);
//2.获得所有的头的名称
Enumeration<String> headerNames =request.getHeaderNames();
while (headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
System.out.println(headerName+":"+headerValue);
効果は次のとおりです。
ケース2:
form.htmlにタグを追加すると、アクセスするアドレスはケース1で記述されたHeadServletです。
<a href="/HeaderServlet">访问HeaderServlet资源</a>
この時点で、コンソールから表示できるすべてのリクエストヘッダーの情報を取得します
TIPSの機能:リファラーヘッダー:訪問のソース機能:アンチリーチリンクは、リンクが私によって書かれたhtmlを介してアクセスされることを意味し、他の人が私のリンクされたWebページを使い込むのを防ぐことができます
ケース3:
盗難防止チェーンをマスターするには、小さなデモを作成します
最初のステップは、新しいnews.htmlを作成し、サーブレットにアクセスすることです。
body>
<a href="/RefererServlet">纯手工山楂球</a>
</body>
2番目のステップは、アクセスチェーンを検出することです
public class RefererServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//对该新闻的来源进行判断
String Header = request.getHeader("RefererServlet");
if(Header !=null&&Header.startsWith("http://localhost")){
//从本人网站跳转过去,可以看新闻
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("纯手中山楂球安全可食用");
}
else{
response.getWriter().write("盗网站者,可耻");
}
}
5、リクエストを通じてリクエスト本文を取得します
リクエスト本文の内容が郵送で提出リクエストパラメータ、形式は次のとおりです。
username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username [zhangsan]
password [123]
hobby [football,basketball]
上記のパラメータを例として、次の方法でリクエストパラメータを取得します。
String getParameter(String name)
String[] getParameterValues(String name)
ケースナンバーワン:
ステップ1:新しいフォームを作成する
<form action="/ContentServlet" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
爱好:<input type="checkbox" name="hobby" value="zq">足球
<input type="checkbox" name="hobby" value="pq">排球
<input type="checkbox" name="hobby" value="ppq">乒乒球
<input type="submit" value="提交">
</form>
ステップ2:テキストボックスでそれぞれ単一の値と複数の値を取得します
public class ContentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得单个表单值
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+" "+password);
//2.获得多个表单的值
String[]hobbys = request.getParameterValues("hobby");
for (String hobby:hobbys){
System.out.println(hobby);
}
}
}
効果は次のとおりです。
Enumeration getParameterNames()
(まれに使用されます)Map<String,String[]> getParameterMap()
(一般的に使用されます)
注:クライアントからサーバーに送信されるパラメーターはすべて文字列です
ケース2:
この時点で、上記のサーブレットの横に書き込みを続けます
//3.获取所有的请求参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
System.out.println(parameterNames.nextElement());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//4.获得所有的参数 参数封装到一个Map<String,String[]>
Map<String,String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String,String[]> entry:parameterMap.entrySet()){
System.out.println(entry.getKey());
for(String str:entry.getValue()){
System.out.println(str);
}
System.out.println("+++++++++++++++++++++++++++++++++++");
}
効果は次のとおりです。
6、文字化けしたコードを送信するソリューション
- 解決する投稿後の方法文字化け:
request.setCharacterEncoding("UTF-8");
- 解決する提出する文字化け:
parameter = new String(parameter.getbytes("iso8859-1"),"utf-8")
;
リクエストの他の7つの機能
- リクエストはドメインオブジェクトです
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
注:リクエストフィールドの範囲:リクエスト内
ケースナンバーワン:
目的はリクエストのドメインに精通しています。情報をServlet1のコンテンツに保存し、Servlet2で取得します。
最初のステップは、新しいServlet1を作成することです
@WebServlet(name = "Servlet1",urlPatterns
="/Servlet1")
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向request域中存储数据
request.setAttribute("name","tom");
RequestDispatcher dispatcher = request.getRequestDispatcher("/Servlet2");
//执行转发的方法
dispatcher.forward(request,response);
}
}
ステップ2:Servlet2を作成する
@WebServlet(name = "Servlet2",urlPatterns
="/Servlet2")
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request域中取出数据
Object attribute = request.getAttribute("name");
response.getWriter().write("123w45"+attribute);
}
}
効果は次のとおりです。
注:この時点でWebサイトにServlet1と入力すると、彼はそれを転送し、コンテンツは、リクエストの次のコンテンツであるServlet2のコンテンツにジャンプして転送します。次に、サーブレットでのリクエストを一度理解するように注意してください。すべてのリソースを取得できます。
- 完全なリクエスト転送をリクエストする
Get request forwarder ---- pathは転送されたアドレスです
RequestDispatcher getRequestDispatcher(String path)
フォワーダーオブジェクトを介して転送requestDispathcer.forward(ServletRequest request, ServletResponse response)
ケース2:
目的:ケース1とほぼ同じように、リクエスト転送のコンテンツに習熟するために、Servlet1とServlet2を作成し、コンテンツをServlet1からServlet2に転送します。
最初のステップ:Servlet1を作成します。
@WebServlet(name = "Servlet1",urlPatterns ="/Servlet1")
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Servlet1将请求转发给Servlet2 此处新建一个转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("/Servlet2");
//执行转发的方法
dispatcher.forward(request,response);
}
}
ステップ2:サーブレットを作成する
@WebServlet(name = "Servlet2",urlPatterns ="/Servlet2")
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("123w45");
}
}
効果は次のとおりです
。このとき、Servlet1にアクセスすると、Servlet2の内容が表示されます。
8、リクエストに関するいくつかの注意事項
1. ServletContextドメインとRequestドメインのライフサイクルを比較しますか?
ServletContext:
- 作成:サーバーの起動
- 破棄:サーバーのシャットダウン
- ドメインの範囲:Webアプリケーション全体
リクエスト:
- 作成:訪問時にリクエストを作成
- 破棄:応答要求の終わりが破棄されます
- ドメインの範囲:リクエスト内
2.クライアントアドレスとサーバーアドレスの書き方は?
- クライアントアドレス:
- クライアントがサーバーにアクセスするアドレス、サーバーの外部のアドレス、
- 機能:Webアプリケーション名を書く
- アクセス方法:リダイレクト
- サーバーアドレス:
- サーバーの内部リソースのジャンプアドレス、
- 機能:Webアプリケーションの名前を書く必要はありません
- アクセス方法:転送
3.転送とリダイレクトの違いは?
- リクエストを2回リダイレクトし、リクエストを1回転送します
- リダイレクトアドレスバーのアドレスが変更され、転送アドレスは変更されません
- リダイレクトは外部のWebサイトにアクセスできます転送は内部リソースにのみアクセスできます
- 転送パフォーマンスはリダイレクトよりも優れています