私はPHP開発者ですが、最近Google App Engine(Java)を使用していくつかのプロジェクトに取り組む必要があります。PHP MVCモデルに関して):
// controllers/accounts.php
$accounts = getAccounts();
include "../views/accounts.php";
// views/accounts.php
print_r($accounts);
Google App Engineのいくつかのデモを見てみましょうJavaサーブレットとJSPを使用しています。彼らがしていることはこれです:
// In AccountsServlet.Java
public class AccountsServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("accountid");
// do something
// REDIRECT to an JSP page, manually passing QUERYSTRING along.
resp.sendRedirect("/namedcounter.jsp?name=" + req.getParameter("name"));
}
}
基本的にJavaの場合、2つの異なるHTTP要求(2番目の要求は自動的に強制されます)でしょ?)JSPファイルでは、サーブレットで計算されたデータを利用できません。
PHPの方法に似た方法がありますか?
JSPでデータを使用できるように、サーブレットで取得したデータをリクエストスコープに設定する必要があります。
サーブレットに次の行があります。
List<Account> accounts = getAccounts();
request.setAttribute("accountList",accounts);
次に、JSPで以下のような式言語を使用してこのデータにアクセスできます。
${accountList}
次のようにsendRedirect
の代わりにリクエストディスパッチを使用します
RequestDispatcher rd = sc.getRequestDispatcher(url);
rd.forward(req, res);
RequestDispatcher
を使用できる場合、これらの値をrequest
またはsession
オブジェクトに格納して、他のJSPに取得できます。
request.sendRedirect
を使用する特定の目的はありますか? RequestDispatcher
を使用しない場合。
public class AccountServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Account> accounts = getAccountListFromSomewhere();
String url="..."; //relative url for display jsp page
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(url);
request.setAttribute("accountList", accounts );
rd.forward(request, response);
}
}
あなたがしたいことは、最初にgetAccounts()からの情報を表すオブジェクトを定義することです-AccountBeanのようなものです。
次に、サーブレットのdoPostまたはdoGet関数で、リクエスト情報を使用してAccountBeanオブジェクトに入力します。
その後、setAttributeメソッドを使用してAccountContextオブジェクトをリクエスト、セッション、またはサーブレットコンテキストに保存し、リクエストをJSPページに転送できます。
JspページのAccountBeanデータは、andタグを使用して抽出されます。
サーブレットの例を次に示します。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
// get data from request querystring
String accountId = req.getParameter("accountid");
// populate your object with it (you might want to check it's not null)
AccountBean accountBean = new AccountBean(accountId);
// store data in session
HttpSession session = req.getSession();
session.setAttribute("accountBean", accountBean);
// forward the request (not redirect)
RequestDispatcher dispatcher = req.getRequestDispatcher("account.jsp");
dispatcher.forward(req, resp);
}
次に、JSPページには、アカウント情報を表示するために次のものがあります。
<jsp:useBean id="accountBean" type="myBeans.AccountBean" />
Your account is <jsp:getProperty name="accountBean" property="status" />
式langの使用に関する上記の説明に加えて、リクエスト自体を介して属性を渡すこともできます。サーブレットのdoGet()では、次のように記述します。
Account[] accounts = AccountManager.getAccountList();
request.setAttribute("accountList", accounts );
RequestDispatcher rd = req.getRequestDispatcher(nextJSPurl);
rd.forward(req, resp);
JSPでは、リクエストから属性を取得できます。
<%
Account[] accounts= (Account[])request.getAttribute("accountList");
if (accounts.length>0) {
for (Account account: accounts) {
%>
<blockquote>account name: <%= account.getName() %></blockquote>
<%
}
}
%>
import javax.servlet.http.*;
public class AccountsServlet extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response) {
try {
// Set the attribute and Forward to hello.jsp
request.setAttribute ("somename", "someValue"); // to save your temporary calculations.
getServletConfig().getServletContext().getRequestDispatcher("/namedcounter.jsp?name=" + req.getParameter("name")).forward(request, response);
} catch (Exception ex) {
ex.printStackTrace ();
}
}
}
上記のコードでは、サーブレットは2つの異なるリクエストを作成しません。転送され、元のリクエストのすべてのデータが保持されます。
request.setAttribute ("somename", "someValue"); // to save your temporary calculations.
これはあなたの質問の私の理解です-サーブレットで計算されたデータと一緒に新しいJSPページにリダイレクトまたはディスパッチしたいですか?そのためには、リクエストをディスパッチする前にリクエスト属性を設定する必要があります。
HttpServletRequest
オブジェクト(req.setAttribute("attribute name", "attribute value")
)を使用して属性を設定できます。属性値は、任意のJavaオブジェクト。
req.getAttribute("attribute name")
で値を取得できます。また、ユーザーgetAttribute()関数の実行中にオブジェクトを型キャストする必要があります。
Java Bean内にデータを設定し、制御がjspに移行するときにjspページにそのデータに簡単にアクセスできます。セッターを使用してJava Beanに日付を設定すると、そのBeanをjspに含めることにより、jspページにそれらのデータにアクセスできます。
<%@page contentType="text/html"%>
<jsp:useBean id="man" class="beans.Person"/>
<jsp:setProperty name="man" property="*"/>
First Name: <jsp:getProperty name="man" property="firstName"/>
このように、Beanクラスが持つことができる多くのプロパティにアクセスできます。