web-dev-qa-db-ja.com

JSPファイル内のJavaコードを回避する方法

私はJava EEが初めてなので、次の3行のようなものがあることを知っています。

<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>

は古い学校のコーディング方法であり、JSPバージョン2にはJSPファイル内のJavaコードを避ける方法があります。誰かが私に代替のJSP 2行を教えてもらえますか、そしてこのテクニックは何と呼ばれますか?

1606
former

安全策として:スクリプトレットを無効にする

別の質問 が議論しているように、あなたはあなたのweb.xmlウェブアプリケーション記述子でスクリプトレットを無効にすることができ、そして常にそうすべきです。

私は、開発者がスクリプトレットを追加するのを防ぐために、特に、遅かれ早かれ概要を見失ってしまうような大企業では、常にそうします。 web.xml設定は次のようになります。

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
218

JSTL は、条件、ループ、セット、取得などのタグを提供します。例:

<c:if test="${someAttribute == 'something'}">
   ...
</c:if>

JSTLはリクエスト属性で動作します-それらはほとんどの場合、サーブレットによってリクエストに設定され、サーブレットにforwardsされます。

107
Bozho

私はこれが正しいかどうかわからない。

あなたはMVCについて何かを読むべきです。 Spring MVCStruts 2 は、最も一般的な2つの解決策です。

60
tzim

JSTLタグをEL式と一緒に使用して、JavaコードとHTMLコードを混同しないようにすることができます。

<%@ page contentType="text/html;charset=UTF-8" language="Java" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
    <head>
    </head>
    <body>

        <c:out value="${x + 1}" />
        <c:out value="${param.name}" />
        // and so on

    </body>
</html>
53
Behrang

Wicket などのコンポーネントベースのフレームワークもあります。これにより、多くのHTMLが自動的に生成されます。 HTMLで終わるタグは非常に基本的なもので、混在するロジックは事実上ありません。その結果、典型的なHTML要素を持つほぼ空のようなHTMLページができます。欠点は、 Wicket APIに習得するコンポーネントがたくさんあり、それらの制約の下では達成が困難なことがあることです。

34
tsand

MVCアーキテクチャー・パターンでは、JSPがViewレイヤーを表します。 JSPにJavaコードを埋め込むことは悪い習慣と考えられています。あなたは " - テンプレートエンジン"としてJSPと共に _ jstl _freeMarkervelocity を使うことができます。これらのタグのデータプロバイダ はあなたが扱っているフレームワーク に依存します。 MVC Patternの実装としてのStruts 2webwork_ ognl _ "Beans PropertiesをJSPに公開するための非常に興味深いテクニック"を使っています。

32
Sami Jmii

経験上、JSPにはいくつかの欠点があることがわかりました。そのうちの1つは、マークアップと実際のコードを混同しないようにするのが難しいことです。

可能であれば、次にあなたがする必要があることのために特殊な技術を使うことを検討してください。 Java EE 6にはJSF 2.0があり、これは#{bean.method(argument)}アプローチを通してJSFページと一緒にJavaビーンを接着することを含むたくさんの素晴らしい機能を提供します。

jSPでのJavaコーディングの欠点を単純に避けたい場合は、スクリプトレットを使用しても可能です。 JSPに最小限のJavaを使用し、JSPページにはほとんど計算やロジックを使用しないようにするために、ある程度の規律に従ってください。

<%@ page contentType="text/html;charset=UTF-8" language="Java" %>
<%//instantiate a JSP controller
MyController clr = new MyController(request, response);

//process action if any
clr.process(request);

//process page forwaring if necessary

//do all variable assignment here
String showMe = clr.getShowMe();%>

<html>
    <head>
    </head>
    <body>
        <form name="frm1">
            <p><%= showMe %>
            <p><% for(String str : clr.listOfStrings()) { %>
            <p><%= str %><% } %>

            // and so on   
        </form>
    </body>
</html>
26
dipu

JSTLを使って自分のタグをカスタマイズして書く方法を学ぶ

ELは EviL (実行時例外、リファクタリング)です。
Wicketも悪くなる可能性があります(パフォーマンス、小規模なアプリケーションまたは単純なビュー層にとっては面倒)

Java2s の例

これはWebアプリケーションのweb.xmlに追加する必要があります。

<taglib>
    <taglib-uri>/Java2s</taglib-uri>
    <taglib-location>/WEB-INF/Java2s.tld</taglib-location>
</taglib>

/ WEB-INF /にFile:Java2s.tldを作成します。

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://Java.Sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<!-- a tab library descriptor -->
<taglib xmlns="http://Java.Sun.com/JSP/TagLibraryDescriptor">
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>Java2s Simple Tags</short-name>

    <!-- this tag manipulates its body content by converting it to upper case
    -->
    <tag>
        <name>bodyContentTag</name>
        <tag-class>com.Java2s.BodyContentTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
          <name>howMany</name>
        </attribute>
    </tag>
</taglib>

次のコードをWEB-INF\classes\com\Java2sにコンパイルします。

package com.Java2s;

import Java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class BodyContentTag extends BodyTagSupport{
    private int iterations, howMany;

    public void setHowMany(int i){
        this.howMany = i;
    }

    public void setBodyContent(BodyContent bc){
        super.setBodyContent(bc);
        System.out.println("BodyContent = '" + bc.getString() + "'");
    }

    public int doAfterBody(){
        try{    
            BodyContent bodyContent = super.getBodyContent();
            String bodyString  = bodyContent.getString();
            JspWriter out = bodyContent.getEnclosingWriter();

            if ( iterations % 2 == 0 ) 
                out.print(bodyString.toLowerCase());
            else
                out.print(bodyString.toUpperCase());

            iterations++;
            bodyContent.clear(); // empty buffer for next evaluation
        }
        catch (IOException e) {
            System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage());
            e.printStackTrace();
        } // end of catch

        int retValue = SKIP_BODY;

        if ( iterations < howMany ) 
            retValue = EVAL_BODY_AGAIN;

        return retValue;
    }
}

サーバーを起動し、ブラウザにbodyContent.jspをロードします。

<%@ taglib uri="/Java2s" prefix="Java2s" %>
<html>
    <head>
        <title>A custom tag: body content</title>
    </head>
    <body>
        This page uses a custom tag manipulates its body content.Here is its output:
        <ol>
            <Java2s:bodyContentTag howMany="3">
            <li>Java2s.com</li>
            </Java2s:bodyContentTag>
        </ol>
    </body>
</html>
26
tomasb

Wicketは、JavaとHTMLを完全に分離するための代替手段でもあるため、デザイナーとプログラマーは、互いにほとんど理解することなく、さまざまなコードセットを一緒に操作することができます。

Wicketを見てください。

25
msj121

あなたは良い質問をしました、そしてあなたは良い答えを得ましたが、私はあなたがJSPを取り除くことを提案するでしょう。それは最終的に死ぬであろう時代遅れの技術です。テンプレートエンジンのような最新のアプローチを使用してください。ビジネス層とプレゼンテーション層が非常に明確に分離され、テンプレート内にJavaコードが存在しないことが確実なので、ほとんどの場合WYSIWYGを利用してWebプレゼンテーション編集ソフトウェアから直接テンプレートを生成できます。

そして確実にフィルタや前後の処理を避けてください。そうしないと、変数がどこで値を取得するのかわからないため、サポートやデバッグの問題に対処することができます。

24
Dmitriy R

jSPファイル内のJavaコードを回避するために、JavaはJSTLのようなタグライブラリを提供するようになりました。また、Javaはすべてのプログラミング構造をタグの形式で記述できるJSFを作成しました。

21
mahesh

いくら回避しようとしても、他の開発者と仕事をするときには、スクリプトレットを好む人がいて、次に悪いコードをプロジェクトに挿入することがあります。したがって、スクリプトレットのコードを本当に減らしたい場合は、最初のサインでプロジェクトを設定することが非常に重要です。これを克服するためのいくつかのテクニックがあります(他に言及されたいくつかのフレームワークを含みます)。ただし、純粋なJSPの方法を好む場合は、JSTLタグファイルを使用してください。これに関して素晴らしいことは、あなたはまたあなたのプロジェクトのためにマスターページを設定することができるので、他のページはマスターページを継承することができます。

以下の内容でWEB-INF /タグの下にbase.tagというマスターページを作成します

<%@tag description="Overall Page template" pageEncoding="UTF-8"%>

<%@attribute name="title" fragment="true" %>

<html>
  <head>
    <title>  
       <jsp:invoke fragment="title"></jsp:invoke>
    </title>

  </head>
  <body>
    <div id="page-header">
       ....
    </div>
    <div id="page-body">
      <jsp:doBody/>
    </div>
    <div id="page-footer">
      .....
    </div>
  </body>
</html>

この本文ページで、 "title"というフラグメントを作成したので、子ページで、マスターページのこの場所にさらにコードを挿入できます。また、タグ<jsp:doBody/>は、子ページのコンテンツに置き換えられます

WebContentフォルダに子ページ(child.jsp)を作成します。

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:base>
    <jsp:attribute name="title"> 
        <bean:message key="hello.world" />
    </jsp:attribute>

    <jsp:body>
    [Put your content of the child here]
    </jsp:body>   
</t:base>

<t:base>は、使用したいマスターページを指定するために使用されます(現時点ではbase.tagです)。ここでタグ<jsp:body>内のすべての内容はあなたのマスターページの<jsp:doBody/>を置き換えます。あなたの子ページには任意のタグlibも含めることができ、あなたは他のもののように通常それを使うことができます。ただし、ここでスクリプトレットコード(<%= request.getParameter("name") %> ...)を使用してこのページを実行しようとすると、JasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed hereが表示されます。したがって、他の人が悪意のあるコードをjspファイルに含める方法はありません。

このページをあなたのコントローラから呼び出す:

コントローラからchild.jspファイルを簡単に呼び出すことができます。これはstrutsフレームワークでもうまく機能します。

21
Thai Tran

JSPではJSTL Tag librariesを使用してください。これは完璧に動作します。

19
Chandra Sekhar

JSTLタグとEL式を使うだけです。

18
tanglei

誰かが実際に複数の言語でのプログラミングに反対している場合 、GWTをお勧めします。理論上は、すべてのJSおよびHTML要素を避けることができます。それらを使って、他の言語でコーディングしなくてもWebサービスを利用できます。拡張機能(smartGWTまたはVaadin)で指定されているように、どこからでもデフォルトのCSSを使用できます。何十もの注釈を学ぶ必要はありません。

もちろん、必要に応じて、コードの詳細を調べてJSをインジェクトしてHTMLページを充実させることもできますが、実際にはそれを避けて他のフレームワークで記述されたものと同じ結果になります。試してみる価値があると私は言います、そして基本的なGWTはよく文書化されています。

そしてもちろん、多くの仲間のプログラマーがここでいくつかの他の解決策を説明または推奨しました。 GWTは、Webパーツを本当に扱いたくない、または最小化したくない人々のためのものです。

17
CsBalazsHungary

Pythonの世界からの素晴らしいアイデアは テンプレート属性の言語 ;です。 TALはZopeによって導入され(したがって別名 "Zope Page Templates"、ZPT)、標準であり、PHP、XSLT、およびJavaでの実装もあります(私はPython/ZopeおよびPHPインカネーションを使いました)。このクラスのテンプレート言語では、上記の例の1つは次のようになります。

<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name">Example product</td>
        <td tal:content="product/description">A Nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

このコードは、通常のHTML(またはXHTML)にXMLネームスペース内の特殊な属性を加えたもののように見えます。ブラウザで表示して、設計者が安全に微調整することができます。マクロと国際化のサポートもあります。

<h1 i18n:translate="">Our special offers</h1>
<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name"
            i18n:translate="">Example product</td>
        <td tal:content="product/description"
            i18n:translate="">A Nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

コンテンツの翻訳が利用可能であれば、それらが使用されます。

私は Javaの実装についてはあまり知りません

16
Tobias

JSPでスクリプトレットを使用することはお勧めできません。

代わりに、次のものを使用できます。

  1. JSTLタグ
  2. EL式
  3. カスタムタグ - 使用する独自のタグを定義できます。

参照してください。

  1. http://docs.Oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. _ el _
15
kapil das

もちろん、<%! counter++; %>をイベントプロデューサ - コンシューマアーキテクチャに置き換えます。この場合、ビジネスレイヤはカウンタをインクリメントする必要性について通知され、それに応じて反応し、プレゼンターに通知してビューを更新します。将来的にはカウンターの新しい値と古い値を知る必要があるため、多くのデータベーストランザクションが関与します。レイヤーは完全に分離されているため、明らかにシリアル化が関係しています。 RMI、IIOP、SOAPを介してカウンターを増やすことができます。しかし、HTMLだけが必要で、それはあなたが実装していません。あなたの新しい目標はあなたの新しい光沢のあるE7、64GB RAMサーバーで1秒に250の増分を達成することです。

私はプログラミングに20年以上携わっていますが、ほとんどのプロジェクトはセクステットの前に失敗しています。再利用性置換性オブジェクト指向能力デバッグ性テスト容易性保守性さえも必要です。機能性だけを気にかけている人々によって運営されている他のプロジェクトは、非常に成功しました。また、プロジェクトの初期段階で実装されている固いオブジェクト構造のため、コードを仕様の大幅な変更に対応させることができません(別名アジャイル)。

そのため、私は先延ばしとして、プロジェクトの早い段階で、または特に必要とされていないときに、「レイヤー」または冗長データ構造を定義する作業を検討します。

14
Razvan

技術的には、実行時にJSPはすべてサーブレットに変換されます 。 JSPは当初、MVCパターンに従ってビジネスロジックとデザインロジックを分離する目的で作成されました。したがってJSPは実行時に技術的にはすべてJavaコードです。しかし、質問に答えるために、タグライブラリは通常JSPページへのロジックの適用(Javaコードの削除)に使用されます。

11
mel3kings

Java Webアプリケーションで次のことを使用すると、JSPの前景からJavaコードを排除できます。

  1. WebアプリケーションにMVCアーキテクチャを使用する

  2. JSPタグを使用する

    a。標準タグ

    b。カスタムタグ

  3. 式言語

9
Ajay Takur

JSPファイル内のJavaコードを避ける方法

式言語( _ el _ )の他に、 _ jstl _ のようなタブライブラリタグを使用できます。しかしELはJSPではうまくいきません。したがって、JSPを完全に削除して Facelets を使用することをお勧めします。

Facelets JSF(Java Server Faces) 用に設計された最初の非JSPページ宣言言語であり、JSPと比較してJSF開発者にとってより単純で強力なプログラミングモデルを提供します。 Webアプリケーション開発用のJSPで発生するさまざまな問題を解決します。

enter image description here

出典

6
Yster

スクリプトレットの使用は非常に古い方法であり、お勧めできません。 JSPページに何かを直接出力したい場合は、 _ jstl _ と共に Expression Language(EL) を使用してください。

Velocity、Freemarker、Thymeleafなどのテンプレートエンジンを使用するなど、他のオプションもあります。しかし、ELとJSTLでプレーンJSPを使用することは、ほとんどの場合私の目的にかなうものであり、初心者にとっても最も簡単な方法です。

また、ビュー層でビジネスロジックを実行することはベストプラクティスではないことに注意してください。ビジネスロジックはサービス層で実行し、出力結果をControllerを通じてビューに渡す必要があります。

4
adn.911

それ以上のものは私の友人には使用されていません。私のアドバイスはビュー(css、html、javascriptなど)をサーバーから切り離すことです。

私の場合、Angularを使用してビューを処理するシステムを使用し、必要なデータはすべてrestサービスを使用してサーバーから取得します。

私を信じて、これはあなたがデザインする方法を変えるでしょう

3
Eduardo

バックボーンを使い、UIデザインにはJavaScriptフレームワークのように角度を付け、rest apiを使ってデータを取得します。これにより、UIからJavaの依存関係が完全に削除されます。

3
Sumesh TG

JSP 2.0には"タグファイル"という機能があり、外部Javaコードおよびtldなしでタグを記述できます。 .tagファイルを作成してWEB-INF\tagsに配置する必要があります。タグをパッケージ化するディレクトリ構造を作成することもできます。

例えば:

/WEB-INF/tags/html/label.tag

<%@tag description="Rensders a label with required css class" pageEncoding="UTF-8"%>
<%@attribute name="name" required="true" description="The label"%>

<label class="control-label control-default"  id="${name}Label">${name}</label>

のように使用します

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/html"%>
<h:label  name="customer name" />

また、タグの本文を簡単に読むことができます

/WEB-INF/tags/html/bold.tag
<%@tag description="Bold tag" pageEncoding="UTF-8"%>
<b>
  <jsp:doBody/>
</b>

これを使って

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/bold"%>
<h:bold>Make me bold</h:bold>

サンプルは非常に単純ですが、ここで多くの複雑なタスクを実行できます。他のタグ(例:if/forEcah/chosenなどの制御タグを持つJSTLまたはformat/contains/uppercaseなどのテキスト操作、またはSQLタグselect/updateも使用できることを考慮してください。例Hashmap、アクセスタグsessionrequest、...

タグファイルは、JSPファイルのようにサーバーを変更するときにサーバーを再起動する必要がないため、非常に簡単に開発できます。これにより、開発が容易になります。

優れたタグがたくさんあるStruts 2のようなフレームワークを使用している場合でも、独自のタグを使用するとコードを大幅に削減できることがわかります。タグパラメーターをstrutsに渡すと、フレームワークタグをカスタマイズできます。

タグを使用してJavaを回避するだけでなく、HTMLコードを最小化することもできます。私自身は、ページでコードの重複が始まるとすぐに、HTMLコードを確認してタグを作成しようとします。

(JSPコードでJavaを使用することになったとしても、そうではないことを願っていますが、そのコードをタグにカプセル化できます)

2
Alireza Fattahi
  1. サーブレットクラス内に値とパラメータを作成します。
  2. JSTL/Taglibを使用してJSP内でこれらの値とパラメータを取得します。

このアプローチのいいところは、あなたのコードもHTMLのようなコードだということです!

1
Mehdi

多くの答えが言うように、JSTLを使うか、あなた自身のカスタムタグを作成してください。 ここ はカスタムタグの作成に関する良い説明です

1
Code_Mode

EL式と一緒にJSTLタグを使用すると、これを回避できます。 jspページに次のものを追加します。

<%@ page contentType="text/html;charset=UTF-8" language="Java" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/fmt" prefix="fmt" %>
0
bhanwar rathore