web-dev-qa-db-ja.com

JSPページのロード時にサーブレットを呼び出す方法

サーブレットを呼び出したいlatest_productsロード時index.jspページ。このサーブレットのリストにはレコードがあります。これを渡したいList<products>からindex.jsp。しかし、URLにサーブレットの名前を表示したくありません。これを行う方法はありますか。

9
user3660263

解決策1

従うべき手順:

  • _jsp:include_を使用して、実行時にJSPにサーブレットの応答を含めるJSPからサーブレットを呼び出します。
  • servletのリクエストで属性を設定し、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>
_

解決策2

従うべき手順:

  • サーブレットへの最初の呼び出し
  • 最新の製品を処理する
  • リクエスト属性にリストを設定します
  • jSTLを使用してJSPで簡単にアクセスできるJSPにリクエストを転送する

サンプルコード:

サーブレット:

_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()メソッドを呼び出します。

12
Braj

(...)しかし、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>/にアクセスすると、上記のように機能します。

6
Luiggi Mendoza

+ 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>
0
Borat Sagdiyev