学習目標
Webプロジェクトを開発するために、Sevletのリクエストとレスポンスのデザインを1つずつコーディングするのではなく、フィルターを介してグローバルな文字化けしたコードを解決します
1.フィルターの役割を知ることができる
2. フィルターを書くことができる
3.フィルターのライフサイクルに関連する方法を知ることができる
4.指定されたフィルターがフィルターパスに従って機能しているかどうかを判断できる
5.フィルターチェーンとは何かを知ることができる
6.グローバルな文字化けを解決するフィルターを作成する機能
フィルターの概要
- (1)フィルターとは?
Java Web開発には、3つの主要なコンポーネントがあります。サーブレットフィルターリスナー - (2)フィルターの機能は何ですか?
フィルターは実際にWebリソースをインターセプトし、いくつかの処理を行ってから、次のフィルターまたはサーブレットに渡して処理します。 - (3)特徴は?
通常、リクエストを傍受して処理したり
、返却されたレスポンスを傍受したりすることができます。
filter-フィルターの作成***
- (1)アイデアがフィルターを作成する
- (2)アナログサーブレット
@WebServlet
はHttpServlet
doGet / doPostメソッドを拡張します
@WebFilter
はFilter
doFilterメソッドを実装します
- (3)
フィルタリングの正しい理解フィルタリングアドレスがs1の場合、アドレスがs1であるリクエストのみをフィルタリングできます。a.jpg
、s2などにアクセスすると、フィルターはフィルタリングされず、doFilterメソッドは実行されません。
\ src \ com.wzx.pack01_filter \ Demo1Servlet.java
@WebServlet("/s1")
public class Demo1Servlet 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 {
System.out.println("doGet方法执行了啦");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
src \ com.wzx.pack01_filter \ Demo1Filter.java
//我要过滤请求资源路径是s1,如果你访问的是 s1,我就过滤
@WebFilter("/s1")
public class Demo1Filter implements Filter {
public void destroy() {
}
/*
1:这个方法是你访问我要过滤的资源时,自动执行
2: FilterChain被称为过滤器链
3: chain.doFilter(req, resp);放行
如果调用:请求放行
如果不调用,请求不放行
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器doFilter方法执行了");
chain.doFilter(req, resp);
System.out.println("过滤器响应了");
}
public void init(FilterConfig config) throws ServletException {
}
}
filter-filter実行プロセス
- (1)学生がキャンパスに入るとき、彼は最初に警備員に会います、そして学生がキャンパスを離れる場合、彼はまた警備員に遭遇します
- (2)フィルターの実行プロセス
1> Tomcatエンジンがhttp要求を要求オブジェクトに変換し、http応答を応答オブジェクトに変換
2>アドレスが条件を満たすと、要求と応答がdoFilterメソッドに渡されます
3>次にchain.doFilter(requestに渡されます、response)メソッド
4>次に、サーブレットが3つの処理を完了すると、doGetまたはdoPostメソッドに渡されます
。5> doFilterが残りのコードを実行し、応答がブラウザに返されます。 - (3)
doFilterの前にリクエストコードを設定する前にコードのコード位置を設定し、前にレスポンスコードを設定する
filter-フィルターの実行順序***
- (1)リクエストをフィルタリングする2つのフィルターがある場合、実行の順序は何ですか?
最初にFilter1、次にFilter2、最後にサーブレット、その反対は応答が返される場合です - (2)フィルターの実行順序を決定する設定は何ですか?
1:
複数のフィルターを配置したときに配置されるアノテーション、最初の文字はフィルタークラスの順に実行される
2:web.xml
が複数のフィルターを配置されるときに配置される、<filter-mapping></filter-mapping>
連続して配置されたweb.xml シーケンスに従っての
src \ com.wzx.pack02_filter \ AFilter.java
@WebFilter("/s2")
public class AFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("第1个过滤器收到请求");
chain.doFilter(req, resp);
System.out.println("第1个过滤器收到响应");
}
public void init(FilterConfig config) throws ServletException {
}
}
src \ com.wzx.pack02_filter \ BFilter.java
@WebFilter("/s2")
public class BFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("第2个过滤器收到请求");
chain.doFilter(req, resp);
System.out.println("第2个过滤器收到响应");
}
public void init(FilterConfig config) throws ServletException {
}
}
src \ com.wzx.pack02_filter \ Demo2Servlet.java
@WebServlet("/s2")
public class Demo2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servlet执行了");
}
}
コメント@ WebFilter、xml構成に変更
<!--配置Servlet-->
<servlet>
<servlet-name>Demo3Servlet</servlet-name>
<servlet-class>com.wzx.pack03_filter.Demo3Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo3Servlet</servlet-name>
<url-pattern>/s3</url-pattern>
</servlet-mapping>
<!--配置TwoFilter-->
<filter>
<filter-name>TwoFilter</filter-name>
<filter-class>com.wzx.pack03_filter.TwoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TwoFilter</filter-name>
<url-pattern>/s3</url-pattern>
</filter-mapping>
<!--配置OneFilter-->
<filter>
<filter-name>ZneFilter</filter-name>
<filter-class>com.wzx.pack03_filter.ZneFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ZneFilter</filter-name>
<url-pattern>/s3</url-pattern>
</filter-mapping>
フィルターフィルターのライフサイクル(理解)
- (1)フィルタには3つの
メソッドがあります:initメソッド:フィルタオブジェクトはサーバーの起動時に作成されます
。doFilterメソッド:リクエストのパスがフィルタの構成パスと一致
する場合は常に、フィルタのdoFilterメソッドdestroyメソッドが1回実行されます。サーバーのシャットダウン時にフィルターが破壊されました
src \ com.wzx.pack04_life_cycle \ Demo3Filter.java
@WebFilter("/*")
public class Demo3Filter implements Filter {
/*
当你关闭服务器时执行,一般释放资源
*/
public void destroy() {
System.out.println("destroy执行啦888888888888888888888888888888888888");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);
}
//当你把项目部署到服务器上的时候,或者启动服务器,该方法就执行
public void init(FilterConfig config) throws ServletException {
System.out.println("init方法执行了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
}
filter-filter url-pattern設定
- (1)フィルターのURLパターン構成には、サーブレットに類似した3つのタイプがあります。
1:完全路径匹配
@WebFilter("/s1")
@WebFilter("/abc/s1")
2:目录匹配
@WebFilter("/*")
@WebFilter("/abc/*")
3:扩展名匹配
@WebFilter("*.do")
@WebFilter("*.jsp")
src \ com.wzx.pack04_life_cycle \ Demo4Filter.java
@WebFilter("/abc/xxx/*")
public class Demo4Filter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter方法执行了");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
filter-filterインターセプトモード設定
- (1)フィルターは、リソースにアクセスするさまざまな方法を区別でき、ブロックするさまざまな方法があります。
- (2)ディスパッチャー:アクセス方法
REQUEST:リソースに直接アクセスするときのフィルターの実行を表すデフォルト値
FORWARD:転送時のフィルターの実行 - (3)設定方法
デフォルトでは、フィルタは直接アクセスされるリソースのみを傍受できますが、転送されたアクセスリソースは傍受できません。
フィルタに直接アクセスと転送アクセスの両方を傍受させる場合は、@ WebFilter属性を設定する必要があります。
@WebFilter(value = "/index.jsp",dispatcherTypes={
DispatcherType.REQUEST,DispatcherType.FORWARD})
src \ pack05_filter \ DispaterServlet.java
@WebServlet("/dispater")
public class DispaterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
src \ pack05_filter \ AccessFilter.java
@WebFilter(value = "/index.jsp",dispatcherTypes={
DispatcherType.REQUEST,DispatcherType.FORWARD})
public class AccessFilter implements Filter {
public void destroy() {
}
/*
1:FilterChain内部理解成一个集合,这个集合中维持一个过滤器链条
2:这个过滤器链中的过滤器必须按顺序依次执行
3:过滤器链中必须全部通过,才能通过,只要有一个不通过,则无法访问对应的资源
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器执行了");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
フィルターフィルターチェーン
- (1)フィルターチェーンとは
1:FilterChainは内部的にコレクションとして理解され、フィルターチェーンはこのコレクションで維持されます - (2)特徴は何ですか?
》 1このフィルターチェーン内のフィルターは順番に実行する必要があります
》 2チェーン内のすべてのフィルターは通過する前に通過する必要があります。いずれかが失敗すると、対応するリソースにアクセスできません。
フィルター-グローバル文字化け解決
- (1)パラメータを取得する前にリクエストコードを設定する
- (2)ブラウザに応答する前に応答エンコーディング
web \ index.jspを設定します
<form action="${pageContext.request.contextPath}/get_form" method="post">
用户名:<input type="text" name="username"/>
<input type="submit" value="提交"/>
</form>
src \ com.wzx.pack05_filter \ GetFormServlet.java
@WebServlet("/get_form")
public class GetFormServlet 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.setCharacterEncoding("UTF-8");
//1:获取表单数据
String username = request.getParameter("username");
System.out.println("username:"+username);
//2:响应
// response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("收到数据啦!");
}
}
src \ com.wzx.pack05_filter \ CharSetFilter.java
- 鍵となるのは、修飾されたリクエストがフィルターによってインターセプトされる限り、複数のサーブレットリクエストがインターセプトされた後、最初にエンコーディングを設定し、それをサーブレットに渡します。
@WebFilter("/*")
public class CharSetFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1:解决请求参数乱码
HttpServletRequest request = (HttpServletRequest)req;
String method = request.getMethod();
if(method.equals("POST")) {
req.setCharacterEncoding("UTF-8");
}
resp.setContentType("text/html;charset=UTF-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
フィルター-グローバル文字化け分析(理解)
(1)doFilterメソッドの内部実行
"1 doChainの前にコードを実行し、次にdoChainメソッドを実行します
" 2次にサーブレットのdoGet / doPostを
実行します "3最後にdoChainの後にコードを実行します