サーブレットを呼び出したいlatest_products
ロード時index.jsp
ページ。このサーブレットのリストにはレコードがあります。これを渡したいList<products>
からindex.jsp
。しかし、URLにサーブレットの名前を表示したくありません。これを行う方法はありますか。
従うべき手順:
jsp:include
_を使用して、実行時にJSPにサーブレットの応答を含めるJSPからサーブレットを呼び出します。サンプルコード:
JSP:
_<body>
<jsp:include page="/latest_products.jsp" />
<c:out value="${message }"></c:out>
</body>
_
サーブレット:
_protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("message", "hello");
}
_
しかし、URLにサーブレットの名前を表示したくありません。
以下に示すように、JSPページのように見えるが内部的にはサーブレットであるような、_url-pattern
_内のサーブレットに対して、異なる意味のある_web.xml
_を定義するだけです。
web.xml:
_<servlet>
<servlet-name>LatestProductsServlet</servlet-name>
<servlet-class>com.x.y.LatestProductsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LatestProductsServlet</servlet-name>
<url-pattern>/latest_products.jsp</url-pattern>
</servlet-mapping>
_
従うべき手順:
サンプルコード:
サーブレット:
_protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("message", "hello");
RequestDispatcher view=request.getRequestDispatcher("index.jsp");
view.forward(request,response);
}
_
index.jsp:
_<body>
<c:out value="${message }"></c:out>
</body>
_
uRLをヒットします:_scheme://domain:port/latest_products.jsp
_サーブレットのdoGet()
メソッドを呼び出します。
(...)しかし、URLにサーブレットの名前を表示したくありません。
サーブレットにアクセスするときに、サーブレット名を使用する必要はまったくありません。実際、正しいURLパターンを定義するによって、目的のURLを指すサーブレットを作成できます。
@WebServlet("/index.jsp")
public class LatestProductServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
List<Product> productList = ...
//all the necessary code to obtain the list of products
//store it as request attribute
request.setAttribute("productList", productLlist);
//forward to the desired view
//this is the real JSP that has the content to display to user
request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
}
}
すると、次のようなフォルダー構造になります
- <root folder>
- WEB-INF
+ index.jsp
+ web.xml
そしてWEB-INF/index.jspで:
<!DOCTYPE html>
<html lang="es">
<body>
<!--
Display the data accordingly.
Basic quick start example
-->
<c:forEach items="${productList}" var="product">
${product.name} <br />
</c:forEach>
</body>
</html>
クライアントがhttp://<yourWebServer>:<port>/<yourApplication>/index.jsp
にアクセスし、目的のコンテンツを取得することに注意してください。また、特定のページのコンテンツを取得するために2つのGETリクエストを実行する必要はありません。
このアプローチをさらに進めることができることに注意してください。パターンはサーブレットで定義されているため、クライアントにはindex.jspを使用せず、ページにアクセスするにはindex.htmlを使用することもできます。サーブレットのURLパターンを変更するだけです。
@WebServlet("/index.html")
public class LatestProductServlet extends HttpServlet {
//implementation...
}
クライアントはhttp://<yourWebServer>:<port>/<yourApplication>/index.html
にアクセスし、WEB-INF/index.jspに結果が表示されます。これで、クライアントとあなたの両方が幸せになります。クライアントはデータを取得し、URLにそのugいサーブレット名を表示しません。
追加
Index.jspをweb.xmlのウェルカムページとして使用している場合、アプリケーションサーブレットは実際のファイルindex.jspが存在することを想定しているため、このアプローチは機能しません。これを解決するにはissue、index.jspという名前の空のファイルを作成します。
- <root folder>
- index.jsp <-- fake empty file to trick the application server
- WEB-INF
+ index.jsp
+ web.xml
http://<yourWebServer>:<port>/<yourApplication>/
にアクセスすると、上記のように機能します。
+ Brajのおかげで、Expression Languageを使用して答えを出すことができます。どうやら、これはjspスクリプト/タグよりも優れているはずです。
サーブレット-
import Java.io.IOException;
import Java.util.ArrayList;
import Java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ProductList extends HttpServlet {
private static final long serialVersionUID = 1L;
public ProductList() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<String> products = new ArrayList<String>();
products.add("Car");
products.add("Gun");
products.add("Shades");
request.setAttribute("productsList", products);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
JSP-
<%@ page language="Java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<c:import url="/ProductList" />
<c:set var="myProducts" value="${requestScope.productsList}" />
<h1>List of products from servlet</h1>
<c:forEach var="product" items= "${myProducts}" varStatus="i">
${product}<br>
</c:forEach>
</body>
</html>