Struts 2カスタマイズラベルによる権限制御の方法


最近の開発では、ユーザーの権限によって操作ボタンが表示されるかどうかを決定する必要があります。
例えば、ユーザがデータを削除する権限を持つと、画面に「削除」ボタンを表示する。ユーザーにこの権限がないと、画面に対応するボタンが表示されません。
これはカスタムラベルを使う必要があります。
Struts 2のカスタムラベルを定義するには、3ステップだけ必要です。
1.Componentクラスを定義し、org.apache.struts.components.components.componentから継承する。
2.Tag類を定義し、importorg.apache.struts 2.view.jsp.component TagSupportから継承する。
3.WEB-INFディレクトリで対応するLTDファイルを作成する
以下は一つずつ実現します。
Step 1:Componentクラスを定義する
Componentは、名前の通り「セット」です。この中にはラベルを封入するために必要な処理ロジックがあります。
私たちが定義しているComponent類はorg.apache.struts 2.components.componentsを引き継ぐ必要があります。父の種類では、スタートラベルと終了ラベルにそれぞれ対応しています。この二つの方法でラベルを操作することができます。
また、ラベルに属性が必要な場合は、クラスに該当する属性を定義し、これらの属性をパッケージ化するために、それぞれのget()とset()の方法を提供しなければならない。
それから、ラベルと属性を処理できます。
ここで私のコードを提供します。現在表示するボタンごとのURLアドレスとユーザーが持つ権限に対応するURLを比較して、ユーザーがURLにアクセスする権限があるなら、ボタンを表示します。そうでなければ、何も表示されません。

package qdgxy.tag;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.components.Component;
import qdgxy.domain.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.Writer;
public class AComponent extends Component {
  private String actionURL;
  private String value;
  private String onclick = "";
  private HttpServletRequest request;
  @Override
  public boolean start(Writer writer) {
    HttpSession session = request.getSession();
    User user = (User) session.getAttribute("user");
    if (user.hasPrivilegeByURL(actionURL)) {
      try {
        writer.write("<a href='" + formatURL(actionURL) + "' onClick='" + onclick + "'>" + value + "</a>");
      } catch (IOException e) {
        e.printStackTrace();
      }
      return true;
    } else {
      return super.start(writer);
    }
  }
  private String formatURL(String url) {
    int index = url.indexOf('?');
    if (index != -1) {
      String params = url.substring(index);
      url = url.substring(0, index) + ".action" + params;
    } else {
      url = url + ".action";
    }
    return url;
  }
  public AComponent(ValueStack stack, HttpServletRequest request) {
    super(stack);
    this.request = request;
  }
  public String getActionURL() {
    return actionURL;
  }
  public void setActionURL(String actionURL) {
    this.actionURL = actionURL;
  }
  public String getValue() {
    return value;
  }
  public void setValue(String value) {
    this.value = value;
  }
  public String getOnclick() {
    return onclick;
  }
  public void setOnclick(String onclick) {
    this.onclick = onclick;
  }
}
Step 2:Tagクラスを定義する
Tag類は、はっきり言えば私達が使っているラベルです。
Tagクラスを作成するには、まずorg.apache.struts 2.view.jsp.Component TagSupport類を継承する必要があります。
そして、getBean()方法とpopullateParams()方法を書き換えます。
getBean()方法は、ラベルコンポーネントの一例、すなわち、ステップ1で作成したコンポーネントを返すために使用される。
popullateParaams()メソッドは、属性を満たすために使用されます。すなわち、私たちのラベルの属性をラベルクラスにパッケージします。したがって,Tagクラスでも対応する属性を定義し,get()とset()法を提供する必要がある。
そうすると、私たちはコンポーネントを指定してラベルを処理することができます。
ラベル処理ロジックを直接Tag類に書かないで、Component類を単独で定義しますか?
これは、Struts 2は様々な表現層技術をサポートしており、Componentを使って、異なる表現層技術に対して異なる処理方式を使用して、プログラムの拡張性を高めることができるからです。
私のコードを与える:
このコードで実現される機能は、Step 1で定義されたコンポーネントを使ってラベルを処理することです。

package qdgxy.tag;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ATag extends ComponentTagSupport {
  private String actionURL;
  private String value;
  private String onclick = "";
  @Override
  public Component getBean(ValueStack valueStack, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
    return new AComponent(valueStack, httpServletRequest);
  }
  @Override
  protected void populateParams() {
    AComponent component = (AComponent) getComponent();
    component.setActionURL(actionURL);
    component.setValue(value);
    component.setOnclick(onclick);
  }
  public String getOnclick() {
    return onclick;
  }
  public void setOnclick(String onclick) {
    this.onclick = onclick;
  }
  public String getActionURL() {
    return actionURL;
  }
  public void setActionURL(String actionURL) {
    this.actionURL = actionURL;
  }
  public String getValue() {
    return value;
  }
  public void setValue(String value) {
    this.value = value;
  }
}
Step 3:WEB-INFディレクトリでTLDファイルを作成する
TLDファイルはラベルの文法を説明しています。例えば、ラベルにはどのような属性がありますか?ラベルの属性は式などをサポートしていますか?
私たちはJSPでラベルを使う前に、それぞれのラベルライブラリを導入する必要があります。だから、TLDファイルを定義して、JSPで私たちのカスタムラベルを使用できるようにします。
私が定義したTLDファイルにはいくつかの簡単な属性があります。

<?xml version="1.0" encoding="UTF-8"?>
<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>oa</short-name>
  <uri>/WEB-INF/OATag.tld</uri>
  <tag>
    <name>a</name>
    <tag-class>qdgxy.tag.ATag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
      <name>actionURL</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>value</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>onclick</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>
その中:
shart-name:プレフィックスに相当します。
uri:つまり「%@taglib」のuriです。
タグ一つ
tag-class:ラベル類は私達のTag類です。
body-content:ラベル体に書ける内容
atribute:属性
name:属性名
required:必要かどうか
rtexprvalue:表現をサポートしていますか?
TLDファイルにはまだ多くの内容がありますので、Googleで簡単に入手できます。ここでは詳しく説明しません。
そこで、私たちはJSPでカスタムラベルを使うことができます。
使用方法:
1.ラベルライブラリの導入:<%@taglib prefix=「oa」uri=「/WEB-INF/OATag.tld」%
2.使用ラベル:このように、ユーザが現在のページを確認すると、ユーザの権限に応じて操作ボタンを表示するかどうかを選択することができます。
締め括りをつける
以上、Struts 2について、カスタマイズラベルによる権限制御の方法を紹介しました。興味のある友達はStrutsとservletが共存できない問題解決方法を参照してください。  Struts 2アップロードファイルのサイズ制限方法の解析を修正します。  struts 2開発プロセスと詳細配置などです。何か問題があったら、メッセージを残してください。編集者はすぐに返事します。