JSPの範囲:UseBean
-
13-09-2019 - |
質問
home.jsp
<jsp:useBean id="username" class="java.lang.String" scope="application"/>
<%
username="Jitendra";
%>
<jsp:include page="include.jsp"/>
include.jsp
<%=username%>
これにより、Beanの範囲がアプリケーションであるにもかかわらず、「ユーザー名」がconter.jspで未定義になっているというエラーが発生します。
解決
あなたの問題に関しては、あなたが昔ながらのスクリプトレットを使用してローカルに宣言するものはすべてです いいえ とリンクしています jsp:useBean
. 。また、ローカルスクリプトレット変数を宣言することです いいえ 付属のページに表示されると、少なくともリクエストスコープに明示的に配置する必要があります。スクリプトレットを使用することはaです 悪い練習. 。私はそれを忘れることをお勧めします。
特定の場合、aを作成するだけです 本物 データを保持するJava Bean。つまり、(暗黙の)デフォルトのコンストラクターと公共のゲッター/セッターによって公開される私的プロパティを備えたクラスです。これが基本的な例です。
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
その後、サーブレットクラスを使用して、リクエストを事前に処理できます。サーブレットを使用できます doGet()
このための方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
User user = new User();
user.setName("Jitendra");
request.setAttribute("user", user); // Store in request scope.
request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}
このサーブレットをマップします web.xml
で url-pattern
たとえばの /show
. 。このサーブレットは、によってアクセス可能である必要があります http://example.com/context/show
そしてその doGet()
すぐに実行されます。
次に、JSPファイルを変更/作成します show.jsp
あなたが置くもの /WEB-INF
直接アクセスを防ぐために(クライアントがそれにアクセスできないように http://example.com/context/show.jsp
ただし、次の行を使用して、サーブレットを呼び出すことを「強制」しています。
<p>User name: ${user.name}</p>
${user}
任意のリクエスト/セッション/アプリケーション属性キーに関連付けられているオブジェクトを指します user
. 。これは舞台裏です jspContext.findAttribute("user")
. 。返されたように User
インスタンスは、Javabean Specに準拠しています ${user.name}
呼び出します getName()
の方法 User
インスタンスとELがその結果を表示します。
ああ、私は追加する必要があります、あなたはそうします いいえ 必要 jsp:useBean
このため、サーブレットがすでに作成され、目的の豆をスコープに入れています。
とはいえ、まともなJSP/サーブレットチュートリアル/本から始めることをお勧めします。例:
お役に立てれば。
他のヒント
あなたのコードは「悪」です java.lang.String
本当に豆ではありません。重要なことに、テキストを変更する「セット」メソッドがありません(意図的であり、不変であることを意図しています)。
豆を宣言し、そのプロパティ(つまり、get()とset()メソッドの背後にある名前を使用してそのプロパティを使用して変更することです。実際のBeanインスタンスのみを直接変更することはできません。その値だけです。
Tomcat 6で、 home.jsp
サーブレットコードに翻訳されています:
java.lang.String username = null;
synchronized (application) {
username = (java.lang.String) _jspx_page_context.getAttribute("username",
PageContext.APPLICATION_SCOPE);
if (username == null){
username = new java.lang.String();
_jspx_page_context.setAttribute("username", username,
PageContext.APPLICATION_SCOPE);
}
}
username="Jitendra";
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response,
"include.jsp", out, false);
動作は同じですが、生成された正確なコードはアプリケーションサーバーの実装に依存します。
ローカルの範囲 username
変数は、から生成されるサーブレットに拡張されません include.jsp
. 。値「jitendra」をアプリケーションスコープに設定するのではなく、ローカル変数の値のみを設定しています。
他の人が指摘したように、不変のひもは非常に良い豆を作りません。