サーブレット&JSP&フィルター
サーブレット
サーブレットは、(Tomcatなど)のWebサーバはユーザのアクセスリンク経路異なるプロセスによってサーブレットへの要求に基づいてそれらの応答が返され、コースのweb.xmlの一般的なルーティング構成は、使用され、サーバ側で実行されているオブジェクトであります注釈の形態です。
機能
- シングルトン
- 初期化要求のサーブレットの例
基本的な
以下は、HTML&サーブレット&web.xmlの例です
HTML(アクションとメソッドの値に注意してください):
...
<form action="login" method="post">
账号: <input type="text" name="name"> <br>
密码: <input type="password" name="password"> <br>
<input type="submit" value="登录">
</form>
...
web.xmlファイル(パスとURLの間にサーブレットマッピングを注意してください):
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>LoginServlet</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
サーブレット:
public class LoginServlet extends HttpServlet{
// @Override // 当前函数的作用见下
// public void service(HttpServletRequest request, HttpServletResponse response){...}
// public void init(ServletConfig config) {...} // 继承于父类,Servlet 的构造函数执行后会自动执行此函数,只会执行一次
// 处理 GET 请求
public void doGet(HttpServletRequest request, HttpServletResponse response){
try {
response.getWriter().println("<h1>Hello Servlet!</h1>");
response.getWriter().println(new Date().toLocaleString());
} catch (IOException e) {
e.printStackTrace();
}
}
// 处理 POST 请求
public void doPost(HttpServletRequest request, HttpServletResponse response){
try{
String name = request.getParameter("name");
String password = request.getParameter("password");
}catch (IOException e) {
e.printStackTrace();
}
}
}
各サーブレットは、必要があるのHttpServletを継承します。HttpServletをが有するサービスメンバー関数を、この方法は、デフォルトサービス要求を決定し、(GETまたはPOST)現在の関数法に従ってdoGetメソッドまたはdoPostメソッドを呼び出すこと。次のようにフィルタ・書き換え可能な拘束サービス・反射は、異なるサーブレット処理要求を実行することができます。
フィルタは、ユーザの要求、から取られた次のコードセクションフィルタオブジェクトを使用して解決しました:
// 假设请求的方法是 ***/admin_category_list
if(uri.startsWith("/admin_")){
String servletPath = StringUtils.substringBetween(uri,"_", "_") + "Servlet"; // 确定 Servlet
String method = StringUtils.substringAfterLast(uri,"_" );
request.setAttribute("method", method); // 确定方法
req.getRequestDispatcher("/" + servletPath).forward(request, response); // 执行 Servlet
return;
}
(この時とdoGetメソッドdoPostメソッドを必要としない)反射法を使用して機能し、サービス選択及び実行サーブレットをオーバーライドします。
@Override
public void service(HttpServletRequest request, HttpServletResponse response) {
...
try {
/*借助反射,调用对应的方法*/
String method = (String) request.getAttribute("method");
Method m = this.getClass().getMethod(method, javax.servlet.http.HttpServletRequest.class,
javax.servlet.http.HttpServletResponse.class,Page.class);
String redirect = m.invoke(this,request, response,page).toString();
}
...
}
一般的な方法
- ジャンプ
- サーバーのジャンプ(応答を返すコンテンツのジャンプが、ブラウザのアドレスを変更しないでください):
request.getRequestDispatcher("success.html").forward(request, response);
- (サーバーがクライアントにリダイレクトアドレスを送信)クライアントを移動:
response.sendRedirect("fail.html");
- サーバーのジャンプ(応答を返すコンテンツのジャンプが、ブラウザのアドレスを変更しないでください):
- 開始からサーブレット
- web.xml構成では
<load-on-startup>10</load-on-startup>
、サーブレットの発売以来、達成することができます
- web.xml構成では
JSP
JSP、Javaテクノロジは、HTMLクラスで直接コードを書くことができ、JSPは最終的にサーブレットに変換されます。後者はHttpServletをから継承しながらJSPは、HttpJspBaseから継承されました。
JSPの例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("great");
%>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word : words) {%>
<tr>
<td><%=word%></td>
</tr>
<%}%>
</table>
ページ出力:
今日 |
---|
あります |
すばらしいです |
JSP組成
JSPページこれらの要素:
- 静的コンテンツ、HTML、CSS、JavaScriptのなど
- 指示
<%@开始 %>
などの終了、<%@page import="java.util.*"%>
- 式
<%=%>
HTMLの出力部、のため<%="hello jsp"%>
に類似<%out.println("hello jsp");%>
- スクリプトレットは、中
<%%>
間、あなたは、任意のJavaコードを書くことができます - 中の文
<%!%>
の間には、フィールドやメソッドを宣言することができます。しかし、お勧めできません。 - アクション
<jsp:include page="Filename" >
でjsp
別のページのページを含みます。 - なお、
<%-- -- %>
HTMLコメントとは異なり、<!-- -->
通じjsp
コメント、ブラウザが対応するコードがサーブレットでコメントアウト対応を見ることができません
暗黙オブジェクト
明示的な定義オブジェクトを使用することはできません。すなわち9つのJSP暗黙オブジェクト、の合計:
- 出力のうち、アウト要求、応答、
- pageContext、セッション、アプリケーション、現在のページを表す、セッション、グローバルスコープオブジェクト
- サーブレットのインスタンスを実行するときにJSPは、サーブレットクラスにコンパイルされます。代表であるページこの
- 設定ファイル、設定はweb.xmlにいくつかの初期化パラメータを取得することができます
- 例外、例外オブジェクト、例外処理を使用するために指定したページ
JSTL
JSTL JSP標準タグライブラリは、JSTLはオープンなど、Javaの開発は、HTMLタグを使用してJSPに機能することができます。
共通の機能タグ:FMT、FN
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%-- 指明后续的标签使用都会以<c: 开头 --%>
<c:set var="name" value="${'gareen'}" scope="request" />
通过标签获取name: <c:out value="${name}" /> <br> <%-- 类似<%=request.getAttribute("name")%> --%>
<c:remove var="name" scope="request" /> <br>
通过标签获取name: <c:out value="${name}" /> <br>
<c:set var="hp" value="${3}" scope="request" /> <%-- 循环示例 --%>
<c:choose>
<c:when test="${hp<5}">
<p>这个英雄要挂了</p>
</c:when>
<c:otherwise>
<p>这个英雄觉得自己还可以再抢救抢救</p>
</c:otherwise>
</c:choose>
EL式
4つのスコープは、同じ属性を持っている場合、値4に運ばのpageContext、要求、セッション、アプリケーションスコープからEL式は、ELは、優先度の高い順求めます。pageContext > request > session > application
JSP一般的な使用法
- 含める
- コマンドインクルードが含まれます:
<%@include file="footer.jsp" %>
、現在のJSPは、挿入されたコマンドラインの位置に - アクションは、ザは、次のとおり
<jsp:include page="footer.jsp" />
、footer.jspのfooter_jsp.javaは、挿入された位置指令footer_jsp.javaサーブレットの実行結果の形に変換されません
- コマンドインクルードが含まれます:
- ジャンプ
- クライアントのジャンプ:
<%response.sendRedirect("hello.jsp");%>
- サーバーを移動:
<jsp:forward page = "hello.jsp"/>
- クライアントのジャンプ:
JavaBeanの
標準のJavaBean
- 引数なしでpublicコンストラクタを提供する(デフォルトで提供)
- 各属性は、パブリックゲッターとセッターを持っています
- プロパティがブール値である場合には、対応があるとsetterメソッド
セッション
セッションはセッションです。セッションが最初からウェブサイトにアクセスし、ブラウザを開いて、ユーザーを指し、関係なく、ユーザーはこれまでのところ、ブラウザを閉じるまで、すべてが、同じセッションに属しているどのように多くのページ、リンクをクリックしたどのように多く、このサイトを参照してください。
サーブレット+ JSP \(\約\) MVC
Javaコードを書きやすいサーブレット、ディスプレイ上のJSPを使用してサーブレット・ライト・コードの両方、ビジネス関連の使用の特性を組み合わせて、コードを書きやすいJSPページ。
サーブレットにデータを保存する暗黙オブジェクトに
public class HeroEditServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
Hero hero = new HeroDAO().get(id);
request.setAttribute("hero", hero); // 设置属性后 JSP 使用 EL 语言 ${hero.id},获得数据
request.getRequestDispatcher("editHero.jsp").forward(request, response);
}
}
JSP、暗黙オブジェクトには、データを取得しました
<form action='updateHero' method='post'>
名字 : <input type='text' name='name' value='${hero.name}'> <br>
血量 :<input type='text' name='hp' value='${hero.hp}'> <br>
伤害: <input type='text' name='damage' value='${hero.damage}'> <br>
<input type='hidden' name='id' value='${hero.id}'>
<input type='submit' value='更新'>
</form>
アプリケーション例
- 表示データのページングを使用して
- ディスプレイのフロントエンド、指定した範囲内のバックデータを返します。
フィルタ
ユーザの要求は、フィルタする必要があるとして、チェックポイントをフィルターには、複数のフィルターを提供することができます