jQuery-ui テーマの動的変更

1)  JSPの自作カスタムタグを使った select を使う


<%@ taglib uri="/WEB-INF/htmythema.tld" prefix="MyThema" %>

2) 1) を使いたいところに配置


// マイテーマ選択用 //
      var themasel = "<MyThema:mythema realdir='' themaval='<%=cfg.getSeltheme()%>' />";

          // == 生成完了した時 == //
          gridComplete: function () {

      var THEMA_DIV = "<div style='float:right' id='mythemadiv'></div>";    

            // マイテーマ選択用 //
            $("#t_others").append(THEMA_DIV);
            $('#mythemadiv').html("MyTheme " + themasel);
            // テーマ変更 => リロード //
            $('#themasel').on('change', function () {
              $('#thmnm').val($(this).val());
              $('#thmchgform').submit();
            });

    <%-- テーマ変更用 --%>
    <%--<MyThema:mythema realdir="" themaval="<%=cfg.getSeltheme()%>"/>--%>
    <form id="thmchgform" method="post" action="export.jsp">
      <input type="hidden" name="thmchg" value="yes" />
      <input type="hidden" name="thmnm" id="thmnm" value="" />
    </form> 

3) 変更リクエストのactionは自ページで、変更内容はクッキーとセッションにセット (どっち使っても良いが、実際はセッションを使ってる)


  // テーマ変更で来た場合 //
  if (request.getParameter("thmchg") != null) {

    //  セッションに格納 //
    String thmnm = request.getParameter("thmnm");
    cfg.setSeltheme(thmnm);

    // クッキーに保存 //
    Cookie cookie = new Cookie("thema", thmnm);
    cookie.setMaxAge(60 * 24 * 60 * 60); //有効期間を60日間に設定
    response.addCookie(cookie);

  }

[ 画面例 ]

多言語化の方法

[ 基本的方法 ]

  1. データベースにマスタを用意
  2. JSPでデータベースのデータを読込、Javascriptの連想配列になった文字列を、pageContext に格納
  3. pageContext の連想配列を const した変数に格納
  4. 3. を jQuery の text, html に入れて表示。jqGridの場合は、constな変数に格納して使う
  5. 2.により、言語変更は、コード簡潔化の為、ページの再読込を必要とする

JAVA 本番環境リリース時変更をなくす (プロキシサーバー)

開発環境がプロキシなし, 実行環境がプロキシありの場合、そのままでは動かないので、違う設定する必要ありますが、最小限に済ます方法です。
プロキシの設定は、httpclient, seleniumのconnect, jsoupのconnect, curlのシェル実行とかで多用するので、どこに居ても開発がはかどります。

1) web.xmlに使うか使わないかを設定


   <!-- Use proxy or not for curl command -->
  <context-param>
    <param-name>IsUseProxy</param-name> <param-value>0</param-value>
  </context-param>

2) 判別と、使う場合のcurlコマンドに使う引数を、静的設定用クラスに定義


  /**
   * プロキシ利用フラグ
   */
  public static boolean isUseProxy = false;
  /**
   * curl用プロキシ引数
   */
  public static final String ARG_PROXY_CURL = "--proxy http://10.70.1.80:8080";

3) JSPでの利用例


  // クレジットバランス用 //
  ServletContext cntxt = getServletContext();
  String crblcURL = cntxt.getInitParameter("CreditBalanceURL");
 
  crblc.setIsUseProxy(DBini.isUseProxy);

  crblc.setUrl(crblcURL);
  String crrest = crblc.getCreditBalance();
  pageContext.setAttribute("crrest", crrest);

        // == ツールバー == //
        var htmlds = 'From ' + "${dtpcsumsel}" +
                '<span style="margin-left:12px;">' + '${crrest}' + '</span>';
        $('#t_pcsum').prepend(htmlds); // 後でリフレッシュボタンを付けてるのでprepend

  /**
   * curlでクレジットバランス取得
   *
   * @return 文字列
   */
  public String getCreditBalance() {

    int res = 0;
    String proxy = this.isUseProxy ? DBini.ARG_PROXY_CURL: "";

    // コマンド文字列作成 //
    String curcmd = "curl -k --connect-timeout 5 " + proxy + " " + url;
    System.out.println(curcmd);

    String restxt = "";
    try {

      Runtime runtime = Runtime.getRuntime();
      Process p = runtime.exec(curcmd);
      InputStream is = p.getInputStream();

      // レスポンス取得 //
      int nread;
      byte[] rbuf = new byte[500];
      while ((nread = is.read(rbuf)) > 0) {
      }
      restxt = new String(rbuf, "US-ASCII");

    }
    catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println(restxt);

    String blctxt = "";
    if (restxt != null) {
      int crblcstpos = restxt.indexOf("CREDIT_BALANCE=\"");
      int lastchgpos = restxt.indexOf("\" LAST_CHARGED");
      if (crblcstpos != -1 && lastchgpos != -1) {
        blctxt = restxt.substring(crblcstpos + 16, lastchgpos);
      }
      if (blctxt.indexOf("Connection timed out") > -1) {
        blctxt = "TimedOut";
      }
      if (blctxt.equals("")) {
        blctxt = "No Response";
      }
      return blctxt;
    }
    // エラー //
    else {     
      return "Error";
    }
  }

4) Servletでの利用例


    // コマンド //
    String curlcmd = "curl -k " + (DBini.isUseProxy ? DBini.ARG_PROXY_CURL: "")
            + (isSimple ? DBini.vesselPositionURLSimple : DBini.vesselPositionURL) + imo;
    System.out.println(curlcmd);

    // 開始時間取得 //
    long startTime = System.currentTimeMillis();

    VesselPosition vsp = new VesselPosition(DBini.tmNowFmt());

    String restxt = "";
    try {

      Runtime runtime = Runtime.getRuntime();
      Process p = runtime.exec(curlcmd);
      InputStream is = p.getInputStream();

      // レスポンス取得 //
      int nread;
      byte[] rbuf = new byte[2048];
      while ((nread = is.read(rbuf)) > 0) {
      }
      restxt = new String(rbuf, "US-ASCII");

    }
    catch (Exception e) {
      e.printStackTrace();
      vsp.setResmsg(this.FAIL_MESSAFE);
    }

JAVA 本番環境リリース時変更をなくす (ファイルアップロード)

開発環境がWindows, 実行環境がLinuxの場合、そのままでは動かないので、違う設定する必要ありますが、最小限に済ます方法です。

1) web.xmlの記述で、URIを違えた2種類の設定を入れる (アノテーションでも出来ると思うが慣れてないので)


  <!-- ***** Excel Goods master upload **** -->
  <!-- Windows -->
  <servlet>
    <servlet-name>ExcelCheckWin</servlet-name>
    <servlet-class>dnksg.svlt.mstupld.ExcelCheck</servlet-class>
    <multipart-config>
      <max-file-size>-1</max-file-size>
      <max-request-size>-1</max-request-size>
      <file-size-threshold>0</file-size-threshold>
      <location>D:\\#NBTest\\dnksgDocumentTmp</location>
    </multipart-config>
    <init-param>
      <param-name>UploadPath</param-name>
      <param-value>D:\\#NBTest\\dnksgDocumentTmp\\</param-value>
    </init-param>
  </servlet>
  
  <!-- Linux -->
  <servlet>
    <servlet-name>ExcelCheckLin</servlet-name>
    <servlet-class>dnksg.svlt.mstupld.ExcelCheck</servlet-class>
    <multipart-config>
      <max-file-size>-1</max-file-size>
      <max-request-size>-1</max-request-size>
      <file-size-threshold>0</file-size-threshold>
      <location>/home/dnksgDocumentTmp</location>
    </multipart-config>
    <init-param>
      <param-name>UploadPath</param-name>
      <param-value>/home/dnksgDocumentTmp/</param-value>
    </init-param>
  </servlet> 
  
  <!-- Windows -->
  <servlet-mapping>
    <servlet-name>ExcelCheckWin</servlet-name>
    <url-pattern>/ExcelCheckWin</url-pattern>
  </servlet-mapping>
  
  <!-- Linux -->    
  <servlet-mapping>  
    <servlet-name>ExcelCheckLin</servlet-name>
    <url-pattern>/ExcelCheckLin</url-pattern>
  </servlet-mapping>  

2) JSPでファイルセパレータからWindows or Linuxを判別して、pageContextにセット


// Linux or Windows //
  boolean isLin = System.getProperty("file.separator").equals("/");
  pageContext.setAttribute("LW", isLin ? "Lin" : "Win");

3) 2)をJavascriptのconstな変数にセット


    <script type="text/javascript">

      const LW = '${LW}';

4) dropzone.js の 送信先URL末尾で 3)を使う


 // 送信先URL //
  const UPLOAD_URLS = ['ImageUpload', 'FileUploadMulti', 'FileUploadMulti', 'AmazonDocUpload'];
$('#' + itm).dropzone({
      url: UPLOAD_URLS[j] + LW + "?dropzone=1&userid=" + ID_USER + UPLOAD_KIND_PARAMS[j],