<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          jfinal-dreampie基于 jfinal 的開源框架庫

          聯(lián)合創(chuàng)作 · 2023-09-20 11:56

          jfinal-dreampie 是一個(gè)基于jfinal的開源框架庫,主要集成或調(diào)優(yōu)功能如下:

          1.緩存維護(hù)更細(xì)粒度

           @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME)
          
          
          @Inherited
          @Retention(RetentionPolicy.RUNTIME)
          @Target({ElementType.TYPE, ElementType.METHOD})
          public @interface CacheNameRemove {
            String name();
          
            String[] keys() default {};
          }
          
          //根據(jù)key值來移除基于某個(gè)特定方法的緩存,而不是移除整個(gè)controller下的緩存
          
          String controllerKey = ai.getControllerKey();
              if (!ValidateUtils.me().isNullOrEmpty(removeCacheName)) {
                String keyPrefix = null;
                if (!ValidateUtils.me().isNullOrEmpty(removeCacheKeys)) {
                  for (String removeKey : removeCacheKeys) {
                    keyPrefix = controllerKey + SLASH + removeKey;
                    removeByCacheKey(removeCacheName, keyPrefix);
                  }
                } else {
                  keyPrefix = controllerKey;
                  removeByCacheKey(removeCacheName, keyPrefix);
                }
              }

          2.增加Slf4jLogger實(shí)現(xiàn),然日志配置能基于任何Slf4j下的log實(shí)現(xiàn),如logback

          public class Slf4jLogFactory implements ILoggerFactory

          3.基礎(chǔ)model實(shí)現(xiàn),實(shí)現(xiàn)基礎(chǔ)的常用的部分功能用于復(fù)用

           public List<M> findAll() {
              return find(getSelectSql() + getExceptSelectSql());
            }
          
            public List<M> findBy(String where, Object... paras) {
              return find(getSelectSql() + getExceptSelectSql() + getWhere(where), paras);
            }
          
            public List<M> findTopBy(int topNumber, String where, Object... paras) {
              return paginate(1, topNumber, getSelectSql(), getExceptSelectSql() + getWhere(where), paras).getList();
            }
          
            public M findFirstBy(String where, Object... paras) {
              return findFirst(getSelectSql() + getExceptSelectSql() + getWhere(where), paras);
            }
          
            public Page<M> paginateAll(int pageNumber, int pageSize) {
              return paginate(pageNumber, pageSize, getSelectSql(), getExceptSelectSql());
            }
          
            public Page<M> paginateBy(int pageNumber, int pageSize, String where, Object... paras) {
              return paginate(pageNumber, pageSize, getSelectSql(), getExceptSelectSql() + getWhere(where), paras);
            }
          
            public boolean updateAll(String set, Object... paras) {
              return Db.update(getUpdateSql() + getSet(set), paras) > 0;
            }
          
            public boolean updateBy(String set, String where, Object... paras) {
              return Db.update(getUpdateSql() + getSet(set) + getWhere(where), paras) > 0;
            }
          
            public boolean deleteAll() {
              return Db.update(getDeleteSql()) > 0;
            }
          
            public boolean deleteBy(String where, Object... paras) {
              return Db.update(getDeleteSql() + getWhere(where), paras) > 0;
            }
          
            public boolean dropAll() {
              return Db.update(getDropSql()) > 0;
            }
          
            public boolean dropBy(String where, Object... paras) {
              return Db.update(getDropSql() + getWhere(where), paras) > 0;
            }

          4.akka異步執(zhí)行框架

          public class AkkaPlugin implements IPlugin
          
          
          Akka.system().scheduler().scheduleOnce(Duration.create(1000, TimeUnit.MILLISECONDS),
                  new Runnable() {
                    @Override
                    public void run() {
                      //do Something
                    }
                  }, Akka.system().dispatcher());

          5.atmosphere  chat demo

          @ManagedService(path = "/im/{room: [a-zA-Z][a-zA-Z_0-9]*}")
          public class ChatRoom {
          }

          6.coffeescript  compiler plugin,編譯coffeescript代碼,并監(jiān)控文件改動(dòng)重新編譯

          public class CoffeeScriptPlugin implements IPlugin {
          }

          7.Flyway 數(shù)據(jù)庫自動(dòng)腳本升級(jí) Plugin,用于自動(dòng)生成或升級(jí)數(shù)據(jù)庫,避免不斷使用數(shù)據(jù)庫工具修改數(shù)據(jù)導(dǎo)致的版本問題

          public class FlywayPlugin implements IPlugin {
          }

          8.lesscss compiler plugin,編譯less代碼,并監(jiān)控文件改動(dòng)重新編譯

          public class LessCssPlugin implements IPlugin {
          }

          9.mailer 郵件發(fā)送plugin,使用akka異步發(fā)送郵件

           Akka.system().scheduler().scheduleOnce(Duration.create(1000, TimeUnit.MILLISECONDS),
                  new Runnable() {
                    @Override
                    public void run() {
                      MailerConf mailerConf = MailerPlugin.mailerConf;
                      HtmlEmail htmlEmail = new HtmlEmail();
                      htmlEmail.setCharset(mailerConf.getCharset());
                      htmlEmail.setSocketTimeout(mailerConf.getTimeout());
                      htmlEmail.setCharset(mailerConf.getEncode());
                      htmlEmail.setHostName(mailerConf.getHost());
                      if (!ValidateUtils.me().isNullOrEmpty(mailerConf.getSslport()))
                        htmlEmail.setSslSmtpPort(mailerConf.getSslport());
                      if (!ValidateUtils.me().isNullOrEmpty(mailerConf.getPort()))
                        htmlEmail.setSmtpPort(Integer.parseInt(mailerConf.getPort()));
                      htmlEmail.setSSLOnConnect(mailerConf.isSsl());
                      htmlEmail.setStartTLSEnabled(mailerConf.isTls());
                      htmlEmail.setDebug(mailerConf.isDebug());
                      htmlEmail.setAuthenticator(new DefaultAuthenticator(mailerConf.getUser(), mailerConf.getPassword()));
                      try {
                        htmlEmail.setFrom(mailerConf.getFrom(), mailerConf.getName());
                        htmlEmail.setSubject(subject);
                        htmlEmail.addTo(recipients);
                        htmlEmail.setHtmlMsg(body);
                        // set the alternative message
                        htmlEmail.setTextMsg("Your email client does not support HTML messages");
                        if (!ValidateUtils.me().isNullOrEmpty(attachment))
                          htmlEmail.attach(attachment);
                        htmlEmail.send();
                      } catch (EmailException e) {
                        e.printStackTrace();
                      }
                    }
                  }, Akka.system().dispatcher());

          10.自定義驗(yàn)證碼,可以自定義使用字符或者數(shù)字,顏色和樣式可以自調(diào)

          public class PatchcaRender extends Render {
            private static final String CODE_CHAR = "0123456789";
          }

          11.QuartzPlugin使用quartz執(zhí)行定時(shí)任務(wù),參照部分網(wǎng)絡(luò)實(shí)例,簡易實(shí)現(xiàn)

          QuartzFactory.me().startJobOnce(TimeUtils.me().toString(DateTime.now()), ++jobId, "stati", this.getClass().getSimpleName(), OrderDataJob.class, param);

          12.shiro權(quán)限框架,基于數(shù)據(jù)庫url配置過濾,驗(yàn)證碼驗(yàn)證

          //讀取數(shù)據(jù)庫權(quán)限只需實(shí)現(xiàn)該接口
          public interface JdbcAuthzService {
            public Map<String, AuthzHandler> getJdbcAuthz();
          }

          13.shiro的freemarker標(biāo)簽庫

          <@shiro.hasPermission name="P_USER">
                          <li><a href="/admin/user">${i18n.getText("admin.user")}</a></li>
                      </@shiro.hasPermission>

          14.xss過濾的StringEscapeUtils過濾器實(shí)現(xiàn)

          public class AttackHandler extends Handler {
            @Override
            public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
              request = new HttpServletRequestWrapper(request);
              nextHandler.handle(target, request, response, isHandled);
            }
          }

          15.json數(shù)據(jù)請(qǐng)求時(shí),返回的error信息使用json字符串

          public class JsonErrorRenderFactory implements IErrorRenderFactory {
            public Render getRender(int errorCode, String view) {
              if (ThreadLocalUtil.isJson())
                return new JsonErrorRender(errorCode, view);
              else
                return new ErrorRender(errorCode, view);
            }
          }

          16.自動(dòng)綁定多數(shù)據(jù)源的tablebind

           AutoMultiSourceTableBindPlugin tableBindDefault = new AutoMultiSourceTableBindPlugin(druidDefault, SimpleNameStyles.LOWER);
          //讓default數(shù)據(jù)源排除shop目錄下的model,因?yàn)樵撃夸浀膍odel屬于custom數(shù)據(jù)源
          tableBindDefault.addExcludePaths("cn.dreampie.function.shop");
          
           AutoMultiSourceTableBindPlugin tableBindCustom = new AutoMultiSourceTableBindPlugin(druidCustom, SimpleNameStyles.LOWER);
          //讓custom只掃描shop目錄,注意當(dāng)使用includepaths是只會(huì)掃描配置的路徑,如果沒有使用includepaths會(huì)掃描全路徑
          tableBindCustom.addIncludePaths("cn.dreampie.function.shop");

          17.壓縮請(qǐng)求數(shù)據(jù)的gzipFilter,可測(cè)試

            <!--gzip compress filter-->
            <filter>
              <filter-name>gzipFilter</filter-name>
              <filter-class>cn.dreampie.common.web.filter.gzip.GZIPFilter</filter-class>
            </filter>
            <filter-mapping>
              <filter-name>gzipFilter</filter-name>
              <url-pattern>/*</url-pattern>
              <dispatcher>REQUEST</dispatcher>
              <dispatcher>FORWARD</dispatcher>
              <dispatcher>INCLUDE</dispatcher>
              <dispatcher>ERROR</dispatcher>
            </filter-mapping>
            <!--gzip compress filter-->

          18.http緩存cacheFilter,和gzipFilter共同用于提高用戶性能

          <!-- cache filter-->
            <filter>
              <filter-name>cacheFilter</filter-name>
              <filter-class>cn.dreampie.common.web.filter.cache.CacheFilter</filter-class>
            </filter>
            <filter-mapping>
              <filter-name>cacheFilter</filter-name>
              <url-pattern>/*</url-pattern>
              <dispatcher>REQUEST</dispatcher>
              <dispatcher>FORWARD</dispatcher>
              <dispatcher>INCLUDE</dispatcher>
              <dispatcher>ERROR</dispatcher>
            </filter-mapping>
            <!--cache filter-->
          瀏覽 13
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费欧美一级视频 | 亚洲无 码A片在线 | 波多野吉衣在线观看免费天堂 | 欧美特黄电影在线视频 | 91在线成人 |