サーブレットジャンプ
1.forward --- RequestDispatcherインターフェース
forward(ServletRequest request、ServletResponse response)---このメソッドは、あるサーブレットから別のWebリソース[サーブレットプログラム/ html / JSP]にリクエストを転送するために使用されます。【転送依頼】
forwardはRequestDispatcherインターフェースに属します
Httpサーブレットリクエストインターフェイスは、メソッドRequestDispatcher getRequestDispatcher(文字列パス)を継承して、サーブレットリクエストインターフェイスからRequestDispatcherオブジェクトを取得します。
パラメータ文字列パス---ターゲットパス[現在のWebアプリケーションのルートディレクトリを示すには、「/」で始まる必要があります]
WEB-INFディレクトリの内容はRequestDispatcherオブジェクトにも表示されることに注意してください。したがって、getRequestDispatcher(String path)メソッドに渡されるリソースは、WEB-INFディレクトリ内のファイルである可能性があります。
RequestDispatcherインターフェイスobject = Httpサーブレットリクエストインターフェイスobject.getRequestDispatcher(文字列パス);
RequestDispatcher接口対象.forward(ServletRequestリクエスト、ServletResponseレスポンス)。
HttpServletRequestオブジェクトを介してデータを渡す。
HttpServletRequestオブジェクトのメソッド
void setAttribute(String name、Object o)は、オブジェクトを名前に関連付け、ServletRequestオブジェクトに格納するために使用されます
Object getAttribute(String name)は、ServletRequestオブジェクトから指定された名前の属性オブジェクトを返すために使用されます
void removeAttribute(String name)は、指定された名前の属性をServletRequestオブジェクトから削除するために使用されます
例えば:
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OneServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("------------------");
//forward(ServletRequest request,ServletResponse response);该方法用于将请求从一个servlet传递给另一个web资源【Servlet程序/html/JSP】
//forward(ServletRequest req,ServletRresponse resp)方法是RequestDispatcher中的方法
//HttpServletRequest中有获得RequestDispatcher对象的方法
//getRequestDispatcher();
/*
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/test.html");
requestDispatcher.forward(req, resp);
req.getRequestDispatcher("/onther").forward(req, resp);
*/
//void setAttribute(String name,Object o);用于将一个对象与另一对象关联后存储到ServletRequest对象中
req.setAttribute("name", "zhangsan");
req.getRequestDispatcher("/other").forward(req, resp);
}
}
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OtherServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Object getAttribute(String name);用于从ServletRequest对象中返回指定名称的属性对象
String name = (String) req.getAttribute("name");
System.out.println("OtherServlet----name==" + name);
}
}
2.リダイレクト---- HttpServletRespone.sendRedirect()[リダイレクト]
HttpServletResponseインターフェースは、sendRedirect(String path)メソッドを定義します。要求は、あるサーブレットから別のWebリソースに渡されます[サーブレットプログラム/ html / JSP]
例えば:
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OneServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("---------------");
//sendRedirect(String path);方法请求从一个Servlet传递给另一个Web资源【Servlet程序/html/JSP】
//resp.sendRedirect("test.html");
//resp.sendRedirect("/test.html");错误
req.setAttribute("name", "lisi");
resp.sendRedirect("other");
}
}
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OtherServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Object getAttribute(String name);用于从ServletRequest对象中返回指定名称的属性值
String name = (String) req.getAttribute("name");
//sendRedirect不能传递数据因为他是重定位
System.out.println("OtherServlet--name=="+name);
}
}
上記のテストは、サーブレットプログラムによってHtml /その他のサーブレットにアクセスすることです。
HTMLを介してサーブレットプログラムにアクセスできますか?
はい、3つの方法があります
1.htmlフォーム要素を介して
2.html経由のハイパーリンク
3. javascriptajaxを介して非同期リクエストを送信します
例えば:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<!--
<center>
<form action="login" method="post">
<table border="1px">
<tr align="center">
<td colspan="2"><h1>用户登录</h1></td>
</tr>
<tr align="center">
<td>账号:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr align="center">
<td>密码:</td>
<td><input type="password" name="password"/></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</center>
-->
<h1><a href="login?username=zhangsan&password=123">用户登录</a></h1>
</body>
</html>
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//得到账号和密码
String name=req.getParameter("username");
String pass=req.getParameter("password");
System.out.println("name=="+name+" "+"pass=="+pass);
}
}
違い:
RequestDispatcher 。forward(req、resp) |
HttpServletRespone 。sendRedirect() |
転送をリクエストする |
リダイレクト |
同じリクエストオブジェクトが使用されます |
さまざまなリクエストオブジェクトが使用されます |
ブラウザのアドレスバーのURLは変更されません |
ブラウザのアドレスバーのURLが変更されます |
データはHttpServletRequestオブジェクトを介して渡すことができます |
HttpServletRequestオブジェクトを介してデータを渡すことができません |
ターゲットパスを設定するときは、「/」を書き込んでも入れなくてもかまいません |
ターゲットパスを設定するときに「/」を記述しないでください |
ServletRequestインターフェースに依存する |
HttpServletResponeオブジェクトに依存します |
セッション追跡
1.なぜセッション追跡が必要なのですか?
使用するHTTPリクエストをブラウザから送信される。httpリクエストは、 httpプロトコルを使用し、HTTPプロトコルはステートレスなプロトコルである。これは、積極的にHTTPプロトコルを使用して、ユーザーが誰であるか記録されません。要求が正常に送信されると、サーバーの意志をmake応答後、ブラウザとサーバー間のリンクはこの時点で消え、サーバーはリクエストの送信元と送信者を認識しません。したがって、この時点で、要求/リンクのステータスを記録/保存する必要があります。この記録/保存要求/リンクのステータスを実現するプロセスは、セッション追跡と呼ばれます。
2.セッショントラッキングとは何ですか?
サーバーハンドラーが要求/リンクステータスの記録/保存を実現するプロセスは、セッショントラッキングと呼ばれます。
3. 4つのセッション追跡テクノロジーとそれぞれの長所と短所は何ですか?
1. URLの書き換え:ユーザーセッションのID情報をURLアドレスに書き換えて、サーバー側のさまざまなユーザーを識別します。
https://blog.csdn.net/qq_33098039/article/details/78184535?sessionid=123456
クライアントがCookieを無効にしている場合、またはCookieをサポートしていない場合でも、URLの書き換えは機能します。
2.フォームフィールドを非表示にします。ユーザーセッションのID情報をHTMLフォーム要素<inputtype = "hidden" name = "" value = "" / >に追加し、サーバーに送信します。このフォーム要素は表示されません。クライアント側でブラウジングすると見えないのですが、ソースコードにあります。
3.クッキー
Cookieは、Webサーバーからクライアントに送信される小さな情報です。クライアントは、ユーザーを識別するためにクライアントから要求されたときに、情報を読み取ってサーバーに送信できます。サーバーはブラウザ側で作成および保存され、ドメイン名をまたぐことはできず、サイズと数量に制限があります。クライアントはこのCookieオブジェクトを2つの方法で保存できます。1つの方法は、一時Cookieと呼ばれるクライアントのメモリに保存することです。これは、ブラウザを閉じると消えます。もう1つの方法は、永続的なCookieと呼ばれるクライアントのディスクに保存することです。今後、クライアントがWebサイトにアクセスしている限り、Cookieが有効期間内であれば、Cookieはサーバーに再度送信されます。このようにして、顧客の追跡が実現されます。クッキーは禁止することができます。
4.セッション
各ユーザーには異なるセッションがあり、ユーザー間で共有することはできません。これは各ユーザー専用です。情報はセッションに保存できます。サーバー側に保存します。複数のサーバー間で共有する問題を解決する必要があります。セッションの内容が複雑すぎると、多数のクライアントがサーバーにアクセスしたときにメモリオーバーフローが発生する可能性があります。したがって、セッションの情報はできるだけ簡潔にする必要があります。
セッションはCookieに依存しています。Cookieが無効になっている場合、セッションも無効になります。
ユーザが最初のサーバにHTTPリクエストを送信すると、サーバは、セッションオブジェクトを識別するためのセッションIDを生成するために、セッション・オブジェクトを作成し、セッションIDクッキーに入れ、次の送信、クライアントに送信され、サーバへのHTTP要求するときを、httpリクエストは、初めて取得したセッションIDとともにサーバーに送信され、サーバー側でさまざまなユーザーが識別されます。
上記のセッション追跡プロセスは、スーパーマーケットに行くときにスーパーマーケットの入り口にあるロッカーにアイテムを保管するプロセスと似ています。
4.セッションとCookieの違いは何ですか?
クッキー |
セッション |
データはサーバーによって作成され、ブラウザ側に保存されます |
サーバー上のデータ |
クッキーはあまり安全ではありません |
セッションは安全です |
サーバーのパフォーマンスを低下させるには、Cookieを使用する必要があります。 |
サーバーのパフォーマンスを低下させることを検討しないでください。セッションを使用できます |
1つのCookieによって保存されるデータは4Kを超えることはできません |
制限なし |
|
セッションはCookieに依存しています。Cookieが無効になっている場合、セッションも無効になります。 |
5.HttpSessionの一般的なメソッド
サーブレットのHttpSessionインターフェース
1. HttpServletRequestオブジェクトのgetSession()メソッドを介してHttpSessionインターフェイスオブジェクトを取得します
2.HttpSessionインターフェースオブジェクトの一般的なメソッド
メソッド宣言 |
関数の説明 |
文字列getId() |
このメソッドは、sessionIDを取得するために使用されます |
long getCreationTime() |
このメソッドは、セッションオブジェクトの作成時間を取得するために使用されます[ms] |
long getLastAccessedTime() |
このメソッドは、セッションの最終アクセス時間を取得するために使用されます[ms] |
int getMaxInactiveInterval() |
このメソッドは、セッションの最大非アクティブ時間を取得するために使用されます[秒] |
ブールisNew() |
このメソッドは、セッションオブジェクトが新しいセッションオブジェクトであるかどうかに使用されます |
void setAttribute(String args0、Object args1); |
このメソッドは、作成されたセッションオブジェクトにデータを保存するために使用されます |
オブジェクトgetAttribute(String args0); |
このメソッドは、セッションオブジェクトに保存されている指定されたデータを取得するために使用されます |
ボイド removeAttribute(String args0); |
このメソッドは、セッションオブジェクトに格納されている指定されたデータを削除するために使用されます |
void invalidate() |
このメソッドは、セッションオブジェクトを破棄するために使用されます |
例:ログイン操作はHttpSessionオブジェクトを使用します
package com.wangxing.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 绘制登录界面的Servlet
* @author Administrator
*
*/
public class LoginUIServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置字符集
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//得到输出流
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html> ");
out.println("<html>");
out.println("<head>");
out.println("<meta charset=\"UTF-8\">");
out.println("<title>用户登录</title>");
out.println("</head>");
out.println("<body>");
out.println("<center>");
//得到session对象
HttpSession session = req.getSession();
//显示session信息
showsessioninfo(out,session);
out.println("<hr>");
Object errorobj = req.getSession().getAttribute("error");
if(errorobj != null){
out.println("<font color=\"red\">"+(String)errorobj+"</font>");
}
out.println("<form action=\"login\" method=\"post\">");
out.println("<table border=\"1px\">");
out.println("<tr align=\"center\">");
out.println("<td colspan=\"2\"><h1>用户登录</h1></td>");
out.println("</tr>");
out.println("<tr align=\"center\">");
out.println("<td>账号:</td>");
out.println("<td><input type=\"text\" name=\"username\"/></td>");
out.println("</tr>");
out.println("<tr align=\"center\">");
out.println("<td>密码:</td>");
out.println("<td><input type=\"password\" name=\"password\"/></td>");
out.println("</tr>");
out.println("<tr align=\"center\">");
out.println("<td colspan=\"2\"><input type=\"submit\" value=\"登录\"/></td");
out.println("</tr>");
out.println("</table>");
out.println("</form>");
out.println("</center>");
out.println("</body>");
out.println("</html>");
out.close();
}
/**
* 显示session信息
* @param out
* @param session
*/
private void showsessioninfo(PrintWriter out, HttpSession session) {
out.println("<table border=\"1px\">");
out.println("<tr align=\"center\">");
out.println("<td colspan=\"2\">");
out.println("<h1>session信息</h1>");
out.println("</td>");
out.println("</tr>");
out.println("<tr align=\"center\">");
out.println("<td>sessionID:</td>");
out.println("<td>"+session.getId()+"</td>");
out.println("</tr>");
out.println("<tr align=\"center\">");
out.println("<td>session对象的创建时间:</td>");
out.println("<td>"+gettime(session.getCreationTime())+"</td>");
out.println("</tr>");
out.println("<tr align=\"center\">");
out.println("<td>session的最后访问时间:</td>");
out.println("<td>"+gettime(session.getLastAccessedTime())+"</td>");
out.println("</tr>");
out.println("<tr align=\"center\">");
out.println("<td>session的最大不活动时间:</td>");
out.println("<td>"+session.getMaxInactiveInterval()+"秒</td>");
out.println("</tr>");
out.println("<tr align=\"center\">");
out.println("<td>session对象是否为新:</td>");
out.println("<td>"+session.isNew()+"</td>");
out.println("</tr>");
out.println("</table>");
}
/**
* 得到时间
* @param creationTime
* @return
*/
private String gettime(long creationTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
return sdf.format(new Date(creationTime));
}
}
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 处理登录业务
* @author Administrator
*
*/
public class LoginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//得到账号和密码
String name = req.getParameter("username");
String pass = req.getParameter("password");
if("zhangsan".equals(name) & "123456".equals(pass)){
//req.setAttribute("username", name);
//req.getRequestDispatcher("success").forward(req, resp);
req.getSession().setAttribute("username", name);
resp.sendRedirect("success");
}else{
//req.setAttribute("error", "用户名密码有误");
//req.getRequestDispatcher("loginui").forward(req, resp);
req.getSession().setAttribute("error", "用户名密码有误!");
resp.sendRedirect("loginui");
}
}
}
package com.wangxing.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 绘制登录成功页面的Servlet
* @author Administrator
*
*/
public class SuccessUIServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset=\"UTF-8\">");
out.println("<title>登录成功</title>");
out.println("</head>");
out.println("<body>");
out.println("<center>");
Object userObj = req.getSession().getAttribute("username");
if(userObj == null){
//req.getRequestDispatcher("loginui");
resp.sendRedirect("loginui");
}else{
out.println("<h1>"+(String)userObj+",登录成功</h1>");
}
out.println("</center>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 处理退出业务
* @author Administrator
*
*/
public class LogoutServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().invalidate();
resp.sendRedirect("loginui");
}
}
3. GetとPostの違いは?
取得する |
役職 |
アドレスバーを介して送信されます |
投稿はメッセージを介して送信され、アドレスバーでデータを受信することもできます |
getパラメーターには長さ制限があります(URLの長さによって制限されます) |
投稿に制限はありません。ファイルをアップロードするときに投稿する必要があります |
GETはTCPパケットを生成します ブラウザはhttpヘッダーとデータを一緒に送信し、サーバーは200(データを返す)で応答します。 |
POSTは2つのTCPパケットを生成します ブラウザは最初にヘッダーを送信し、サーバーは100続行で応答し、ブラウザはデータを送信し、サーバーは200 ok(データを返す)で応答します。 |
安全性差 |
優れたセキュリティ |
データをクエリするときは、Getメソッドを使用することをお勧めします |
データを追加、変更、または削除するときは、Postメソッドを使用することをお勧めします |
ブラウザがロールバックしてもGETは無害です |
ブラウザがロールバックすると、POSTはリクエストを再度送信します |
GETで生成されたURLアドレスをブックマークできます |
POSTによって生成されたURLアドレスをブックマークすることはできません |
GETリクエストはブラウザによってアクティブにキャッシュされます |
POSTは、手動で設定されない限り、ブラウザによってアクティブにキャッシュされません。 |
GETリクエストはURLエンコードのみ可能です |
POSTは複数のエンコード方法をサポートしています。 |
GETリクエストパラメータはブラウザの履歴に完全に保持されます |
POSTのリクエストパラメータはブラウザの履歴に保持されません。 |
パラメータのデータ型、GETはASCII文字のみを受け入れます |
POSTに制限はありません |
GETパラメータはURLを介して渡されます |
POST放在Request body中 |
4.中文乱码的处理
网页----<meta charset="utf-8">
Eclipse---window-->preferences--->General---->workspace---->Text file encoding
Tomcat---默认的字符编码“iso8859-1”
服务器/conf目录/server.xml文件
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
1.页面提交到Servlet处理程序中的中文为乱码
Post提交方式 request.setCharacterEncoding(“utf-8”);
GET方式 String name = new String(name.getBytes(“iso8859-1”),“utf-8”);
2.Servlet处理程序向页面输出的中文为乱码
response.setCharacterEncoding("utf-8"); response.setHeader("Content-Type","text/html;charset=utf-8");