`

重写queryListener

    博客分类:
  • ADF
 
阅读更多

 

 

Overriding default query listener ,field validation of af:query- Oracle ADF

 
 
 

Hello All,
this post talks about a common requirement - can we apply custom validation in af:query fields ? yes , we can do that by overriding default query listener of af:query component

What af:query is ?

see- Oracle Docs-af:query 
"The query component provides the user the ability to perform a query based on a saved search or personalize saved searches. The component displays a search panel with various elements, each of which help the user to accomplish various tasks."
 
 
Follow steps to apply validation on af:query-
  • Here i am taking example of Departments table of HR Schema
  • First create business components for Departments table
  • then create  bind variables and a view-criteria in departments view object 






     
     
  • See the view criteria is applied for LocationId, ManagerId and Department Name



 
 
  • Now create a page and drop criteria with table on page- it will look like this



 
 
 
    • Next is to select af:query on page and go to property inspector and copy text of default query listener
    • Now create a managed bean and create a custom query listener for af:query
    • In this custom query listener , in this example i am checking for negative Location Id and Manager Id, if there is any negative values ,custom method will show a message otherwise default queryListenerwill be executed
    • We can get af:query's components value using 2 methods
      First One  - Using Bind Variable (getNamedWhereClauseParam)
      Second One - Using QueryDescriptor and ConjunctionCriterion
    • I'm going to explain both methods - see code of custom query listener using first method, two generic methods will be used in this process to invoke expression language and to get BindingContainer of current context

    /**Method to invoke EL Expression
     * @param el
     * @param paramTypes
     * @param params
     * @return
     */
    public static Object invokeEL(String el, Class[] paramTypes, Object[] params) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ELContext elContext = facesContext.getELContext();
        ExpressionFactory expressionFactory = facesContext.getApplication().getExpressionFactory();
        MethodExpression exp = expressionFactory.createMethodExpression(elContext, el, Object.class, paramTypes);

        return exp.invoke(elContext, params);
    }

    /**Method to get Binding Container of current page
     * @return
     */
    public BindingContainer getBindings() {
        return BindingContext.getCurrent().getCurrentBindingsEntry();
    }

    • See the first method to get af:query components value and validate that

    /**Custome Query Listener- Using getNamedWhereClauseParam
     * @param queryEvent
     */
    public void customQueryListener(QueryEvent queryEvent) {
        String deptName = null;
        Integer locId = null;
        Integer mgrId = null;

        /**Get Iterator of Table*/
        DCIteratorBinding iter = (DCIteratorBinding)getBindings().get("DepartmentsView1Iterator");

        /**Get ViewObject from Iterator*/
        ViewObjectImpl vo = (ViewObjectImpl)iter.getViewObject();

        /**Get Bind Variable's Value*/
        if (vo.getNamedWhereClauseParam("LocIdBind") != null) {
            locId = Integer.parseInt(vo.getNamedWhereClauseParam("LocIdBind").toString());
        }
        if (vo.getNamedWhereClauseParam("MgrIdBind") != null) {
            mgrId = Integer.parseInt(vo.getNamedWhereClauseParam("MgrIdBind").toString());
        }
        if (vo.getNamedWhereClauseParam("DeptNmBind") != null) {
            deptName = vo.getNamedWhereClauseParam("DeptNmBind").toString();
        }

        /**Check for Negative values*/
        if ((locId != null && locId < 0) || (mgrId != null && mgrId < 0)) {
            FacesMessage msg = new FacesMessage("Id Value can not be negative");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            /**Execute default query listener with help of invokeEL method*/

            invokeEL("#{bindings.DepartmentsViewCriteriaQuery.processQuery}", new Class[] { QueryEvent.class },
                     new Object[] { queryEvent });
        }
    }

    • And Second Method using QueryDescriptor is-

    /**Custom Query Listener-Using QueryDescriptor
     * @param queryEvent
     */
    public void customqueryProcess(QueryEvent queryEvent) {
        String deptName = null;
        Integer locId = null;
        Integer mgrId = null;

        /**Reference-Frank Nimphius Example- ADF Code Corner
       * http://www.oracle.com/technetwork/developer-tools/adf/learnmore/85-querycomponent-fieldvalidation-427197.pdf
       * */
        QueryDescriptor qd = queryEvent.getDescriptor();

        ConjunctionCriterion conCrit = qd.getConjunctionCriterion();
        //access the list of search fields
        List<Criterion> criterionList = conCrit.getCriterionList();
        //iterate over the attributes to find FromDate and ToDate
        for (Criterion criterion : criterionList) {
            AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();

            if (attrDescriptor.getName().equalsIgnoreCase("DepartmentName")) {
                deptName = (String)((AttributeCriterion)criterion).getValues().get(0);

            } else {
                if (attrDescriptor.getName().equalsIgnoreCase("LocationId")) {
                    locId = (Integer)((AttributeCriterion)criterion).getValues().get(0);

                }
            }
            if (attrDescriptor.getName().equalsIgnoreCase("ManagerId")) {
                mgrId = (Integer)((AttributeCriterion)criterion).getValues().get(0);

            }
        }
        if ((locId != null && locId < 0) || (mgrId != null && mgrId < 0)) {
            FacesMessage msg = new FacesMessage("Id Value can not be negative");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            /**Process default query listener*/
            invokeEL("#{bindings.DepartmentsViewCriteriaQuery.processQuery}", new Class[] { QueryEvent.class },
                     new Object[] { queryEvent });
        }

    }

---以上资料摘自网络上;

下面应用在收费系统的学生学杂费中的汇总

    /**
     * 重写queryListener,获取query的属性字段值,传入存储过程查询合计结果(应缴费用、已交金额、减免费用和欠费)
     * 两种方法:1.通过绑定变量(getNamedWhereClauseParam); 2.使用QueryDescriptor and ConjunctionCriterion
     * 注意:如果使用第二种方法是获取不到下拉值,所以下面结合这两种方法去获取query的输入框和下拉值(年级、校区、院系、专业、班级)
     * @param queryEvent
     * */
    public void queryListener(QueryEvent queryEvent) {
        JSFUtils.invokeMethodExpression("#{bindings.SfglXsxxVoCriteriaQuery.processQuery}",
                                        Object.class, QueryEvent.class,
                                        queryEvent); //默认执行自带的查询方法
        
        ViewObject vo = ADFUtils.findIterator("SfglXsxxVo1Iterator").getViewObject();
        
        //---使用Using QueryDescriptor and ConjunctionCriterion
       
        QueryDescriptor qd = queryEvent.getDescriptor();
        ConjunctionCriterion conCrit = qd.getConjunctionCriterion();
        List<Criterion> criterionList = conCrit.getCriterionList(); //页面查询条件
        String jflx = new String();
        String jfsjStart = new String();
        String jfsjEnd = new String();
        String xh = new String();;
        String xm = new String();;
        String sfzh = new String();;
        String njdm = new String();;
        String xqdm = new String();;
        String dwh = new String();;
        String zydm = new String();;
        String bjdm = new String();;
        for (Criterion criterion : criterionList) {
            AttributeDescriptor attrDescriptor =
                ((AttributeCriterion)criterion).getAttribute();
            if (attrDescriptor.getName().contains("Jflx") && !((AttributeCriterion)criterion).getValues().get(0).equals("")) {
                jflx = String.valueOf(((AttributeCriterion)criterion).getValues().get(0));
            }
            if (attrDescriptor.getName().contains("CreateTime")) {
                if(((AttributeCriterion)criterion).getValues().get(0) != null){
                    jfsjStart = String.valueOf(((AttributeCriterion)criterion).getValues().get(0));
                    if(jfsjStart.length() >19){  //取消时间字符串秒后面的数字
                        jfsjStart = jfsjStart.substring(0, 19);
                    }
                }
                if(((AttributeCriterion)criterion).getValues().get(1) != null){
                    jfsjEnd = String.valueOf(((AttributeCriterion)criterion).getValues().get(1));
                    if(jfsjEnd.length() >19){  //取消时间字符串秒后面的数字
                        jfsjEnd = jfsjEnd.substring(0, 19);
                    }
                }
            }
            if (attrDescriptor.getName().contains("Xh") && ((AttributeCriterion)criterion).getValues().get(0) != null) {
                xh = (String)((AttributeCriterion)criterion).getValues().get(0);
            }
            if (attrDescriptor.getName().contains("Xm") && ((AttributeCriterion)criterion).getValues().get(0) != null) {
                xm = (String)((AttributeCriterion)criterion).getValues().get(0);
            }
            if (attrDescriptor.getName().contains("Sfzh") && ((AttributeCriterion)criterion).getValues().get(0) != null) {
                sfzh = (String)((AttributeCriterion)criterion).getValues().get(0);
            }
            if (attrDescriptor.getName().contains("Nj") && !((AttributeCriterion)criterion).getValues().get(0).equals("")) {
                njdm = vo.getNamedWhereClauseParam("p_nj").toString();
            }
            if (attrDescriptor.getName().contains("Xqdm") && !((AttributeCriterion)criterion).getValues().get(0).equals("")) {
                xqdm = vo.getNamedWhereClauseParam("p_xqdm").toString();
            }
            if (attrDescriptor.getName().contains("Yxdm") && !((AttributeCriterion)criterion).getValues().get(0).equals("")) {
                dwh = vo.getNamedWhereClauseParam("p_dwh").toString();
            }
            if (attrDescriptor.getName().contains("Zydm") && !((AttributeCriterion)criterion).getValues().get(0).equals("")) {
                zydm = vo.getNamedWhereClauseParam("p_zydm").toString();
            }
            if (attrDescriptor.getName().contains("Bjdm") && !((AttributeCriterion)criterion).getValues().get(0).equals("")) {
                bjdm = vo.getNamedWhereClauseParam("p_bjdm").toString();
            }
        }
        //System.out.println("jflx:"+jflx+",jfsjStart:"+jfsjStart+",jfsjEnd:"+jfsjEnd+",xh:"+xh+",xm:"+xm+",sfzh:"+sfzh+",njdm:"+njdm+",xqdm:"+xqdm+",dwh:"+dwh+",zydm:"+zydm+",bjdm:"+bjdm);
        
        try {
            SfxtglAMImpl am =
                (SfxtglAMImpl)ADFUtils.findIterator("SfglXsxxVo1Iterator").getViewObject().getApplicationModule();
            String stmt = "BEGIN SFGL_XSXX_QUERY(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?); END;";
            java.sql.CallableStatement st = null;
            try {
                st = am.getDBTransaction().createCallableStatement(stmt, 0);
                st.setString(1, jflx); 
                st.setString(2, jfsjStart); 
                st.setString(3, jfsjEnd); 
                st.setString(4, xh); 
                st.setString(5, xm); 
                st.setString(6, sfzh); 
                st.setString(7, njdm); 
                st.setString(8, xqdm); 
                st.setString(9, dwh); 
                st.setString(10, zydm); 
                st.setString(11, bjdm); 
                st.registerOutParameter(12, Types.CHAR);  //yjfy 应缴费用
                st.registerOutParameter(13, Types.CHAR);  //yjje已缴金额
                st.registerOutParameter(14, Types.CHAR);  //jmfy 减免费用
                st.registerOutParameter(15, Types.CHAR);  //qf 欠费
                st.execute();

                JSFUtils.setExpressionValue("#{bindings.Totalyjfy.inputValue}", st.getString(12)==null?"0":st.getString(12));
                JSFUtils.setExpressionValue("#{bindings.Totalyjje.inputValue}",st.getString(13)==null?"0":st.getString(13));
                JSFUtils.setExpressionValue("#{bindings.Totaljmfy.inputValue}", st.getString(14)==null?"0":st.getString(14));
                JSFUtils.setExpressionValue("#{bindings.Totalqf.inputValue}", st.getString(15)==null?"0":st.getString(15));
                JSFUtils.refresh(richTable);
            } catch (java.sql.SQLException s) {
                s.printStackTrace();
                throw new oracle.jbo.JboException(s);
            } finally {
                try {
                    if (st != null) {
                        st.close();
                    }
                } catch (java.sql.SQLException s2) {
                    throw new oracle.jbo.JboException(s2);
                }
            }
        } catch (Exception e) {
            log.severe(e);
        }
        
    }

 

create or replace procedure SFGL_XSXX_QUERY(p_jflx      in varchar2,
                                            p_jfsjStart in varchar2,
                                            p_jfsjEnd   in varchar2,
                                            p_xh        in varchar2,
                                            p_xm        in varchar2,
                                            p_sfzh      in varchar2,
                                            p_njdm      in varchar2,
                                            p_xqdm      in varchar2,
                                            p_dwh       in varchar2,
                                            p_zydm      in varchar2,
                                            p_bjdm      in varchar2,
                                            o_totalYjfy out varchar2,
                                            o_totalYjje out varchar2,
                                            o_totalJmfy out varchar2,
                                            o_totalQf   out varchar2) is
  /**
  *  自定义学杂费查询
  *  功能:传入条件参数查询
  *  2015年12月4日
  *   p_jflx 缴费类型
  *   p_jfsjStart 缴费开始时间
  *   p_jfsjEnd 缴费结束时间
  *   p_xh 学号
  *   p_xm 姓名
  *   p_sfzh 身份证
  *   p_njdm 年级
  *   p_xqdm 校区
  *   p_dwh 院系
  *   p_zydm 专业代码
  *   p_bjdm 班级代码
  *   o_totalYjfy 合计应缴费用
  *   o_totalYjje 合计已缴金额
  *   o_totalJmfy 合计减免费用
  *   o_totalQf 合计欠费
  */

  v_sql STRING(3000); --存放查询语句
  v_dqxn varchar2(20);  --当前学年

  xsxx_rec SFGL_SUMTEMP%rowtype; --创建与SFGL_SUMTEMP相同类型的临时集合 

begin
  SELECT xndm into v_dqxn FROM sfgl_xn WHERE sfdqxn=1;  --当前学年
  --根据查询条件初始化的游标语句
  v_sql := 'SELECT 
  ''1'' zj,
trim(DECODE(sum(yjfy),0,''0.00'',TO_CHAR(sum(yjfy),''9,999,999,999.99''))) yjfy,
trim(DECODE(sum(yjje),0,''0.00'',TO_CHAR(sum(yjje),''9,999,999,999.99''))) yjje,
trim(DECODE(sum(qf),0,''0.00'',TO_CHAR(sum(qf),''9,999,999,999.99''))) qf,
trim(DECODE(sum(jmfy),0,''0.00'',TO_CHAR(sum(jmfy),''9,999,999,999.99''))) jmfy FROM (

SELECT sfglxsxx.xm,
       sfglxsxx.nj,
       (nvl(SUM(decode(a.fylx, 1, a.fy)), 0) +
       nvl(SUM(decode(a.fylx, 2, a.fy)), 0) +
       nvl(SUM(decode(a.fylx, 3, a.fy)), 0) +
       nvl(SUM(decode(a.fylx, 4, a.fy)), 0)) yjfy, --应缴费用=学费+住宿费+医保费+其他费用 
       
       nvl(SUM(a.yjfy), 0) yjje, --已缴费用  
       
       (nvl(SUM(decode(a.fylx, 1, a.fy)), 0) +
       nvl(SUM(decode(a.fylx, 2, a.fy)), 0) +
       nvl(SUM(decode(a.fylx, 3, a.fy)), 0) +
       nvl(SUM(decode(a.fylx, 4, a.fy)), 0) - nvl(SUM(a.yjfy), 0)) qf, --欠费=应缴费用-已缴费用
       
       nvl(SUM(jl.je), 0) jmfy, --减免费用   
       a.xn
  FROM sfgl_xsxx sfglxsxx,
       sfgl_yjfy a,
       (SELECT sum(t.je) je, t.yjfyid, t.xn
          FROM sfgl_jfjl t
         WHERE t.jflx = ''3''
         group by t.yjfyid, t.xn) jl
 WHERE sfglxsxx.xszt = ''01''
   AND sfglxsxx.xsid = a.yjyh(+)
   AND a.xn(+) = '''||v_dqxn||'''
   AND a.xn = jl.xn(+)
   AND a.yjfyid = jl.yjfyid(+)
';
  if nvl(p_xh, 'N') <> 'N' then
    v_sql := v_sql || ' and sfglxsxx.xh = ''' || p_xh || '''';
  end if;
  if nvl(p_xm, 'N') <> 'N' then
    v_sql := v_sql || ' and sfglxsxx.xm = ''' || p_xm || '''';
  end if;
  if nvl(p_sfzh, 'N') <> 'N' then
    v_sql := v_sql || ' and sfglxsxx.sfzh = ''' || p_sfzh || '''';
  end if;
  if nvl(p_njdm, 'N') <> 'N' then
    v_sql := v_sql || ' and sfglxsxx.nj = ''' || p_njdm || '''';
  end if;
  if nvl(p_xqdm, 'N') <> 'N' then
    v_sql := v_sql || ' and sfglxsxx.xqdm = ''' || p_xqdm || '''';
  end if;
   if nvl(p_dwh, 'N') <> 'N' then
    v_sql := v_sql || ' and sfglxsxx.yxdm = ''' || p_dwh || '''';
  end if;
   if nvl(p_zydm, 'N') <> 'N' then
    v_sql := v_sql || ' and sfglxsxx.zydm = ''' || p_zydm || '''';
  end if;
   if nvl(p_bjdm, 'N') <> 'N' then
    v_sql := v_sql || ' and sfglxsxx.bjdm = ''' || p_bjdm || '''';
  end if;
   if nvl(p_jflx, 'N') <> 'N' or nvl(p_jfsjStart, 'N') <> 'N' or nvl(p_jfsjEnd, 'N') <> 'N' then
    v_sql := v_sql || ' and exists(
    SELECT 1 FROM sfgl_yjfy syjfy,sfgl_jfjl sjfjl WHERE syjfy.yjfyid = sjfjl.yjfyid
     and syjfy.yjyh = sfglxsxx.xsid ';
     if nvl(p_jflx, 'N') <> 'N' then
        v_sql := v_sql || ' and sjfjl.jflx = ''' || p_jflx || '''';
     end if;
     if nvl(p_jfsjStart, 'N') <> 'N' then
        v_sql := v_sql || ' and sjfjl.create_time >= 
                 to_date('''||p_jfsjStart||''',''yyyy-MM-dd HH24:mi:ss'')';
     end if;
     if nvl(p_jfsjEnd, 'N') <> 'N' then
        v_sql := v_sql || ' and sjfjl.create_time <= 
                 to_date('''||p_jfsjEnd||''',''yyyy-MM-dd HH24:mi:ss'')';
     end if;
     v_sql := v_sql || ' )';
  end if;  
  v_sql :=v_sql||' GROUP BY sfglxsxx.xm,
          sfglxsxx.nj,
          a.xn
 ORDER BY sfglxsxx.nj desc
 )';
/*  dbms_output.put_line('查询语句:'||v_sql);*/

  
   execute immediate v_sql into xsxx_rec;
     o_totalYjfy:=xsxx_rec.yjfy;
     o_totalYjje:=xsxx_rec.yjje;
     o_totalJmfy:=xsxx_rec.jmfy;
     o_totalQf:=xsxx_rec.qf;                                    
    /*dbms_output.put_line('yjfy:'||o_totalYjfy||',yjje:'||o_totalYjje||',jmfy:'||o_totalJmfy||',qf:'||o_totalQf);  
  */
exception
  when others then
    dbms_output.put_line('程序运行出现内部错误,请联系管理员。'||dbms_utility.format_error_backtrace()||'---'||SQLCODE||'---'||SQLERRM);
    raise;
end SFGL_XSXX_QUERY;

 

  • 大小: 34.7 KB
  • 大小: 28 KB
  • 大小: 27.3 KB
分享到:
评论

相关推荐

    asp.net c# Url重写和无扩展名Url重写

    ASP.NET C# URL重写和无扩展名URL重写是两个关键的Web开发技术,用于改进网站的用户体验和搜索引擎优化(SEO)。它们涉及到对应用程序内部请求处理的方式,使得用户可以使用更加友好、易于记忆的URL,同时保持后端...

    C#重写MessageBox对话框

    C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框

    Url重写示例(无后缀Url重写)

    Url重写是Web开发中的一个重要概念,主要用于优化和管理网站的网址结构,使其更符合搜索引擎优化(SEO)标准,同时也可提升用户体验。无后缀Url重写是指在URL中不显示传统的文件扩展名,如.aspx、.html等,使网址看...

    微信小程序 重写App、重写Page 自定义分享

    在微信小程序开发中,"重写App、重写Page与自定义分享"是常见的需求,它们涉及到小程序的基础架构和用户体验优化。以下将详细介绍这些概念及其应用。 **重写App** `App`是微信小程序的全局应用程序对象,它包含了...

    C# url重写 C# url重写

    在IT行业中,URL重写是一项重要的技术,尤其是在Web开发领域,它可以帮助我们创建更美观、更易读且更友好的URL。C#是.NET框架下的主要编程语言,它提供了多种方式来实现URL重写。本篇文章将深入探讨C#中URL重写的...

    c#重写的tabcontrol控件

    本篇文章将深入探讨如何在C#中重写TabControl控件,以及这个过程可能涉及的关键知识点。 首先,让我们了解为什么要重写TabControl。原生的TabControl虽然功能强大,但它的外观和行为可能无法完全符合每个应用程序的...

    ASP.NETweb网站Url重写,地址栏重写

    ASP.NET Web 网站的URL重写是提高网站可读性和SEO优化的重要技术手段。在网站开发中,我们常常需要将复杂的、包含参数的URL转换为简洁、友好的格式,以便用户理解和搜索引擎更容易抓取。本文将深入探讨ASP.NET Web...

    url重写工具,重写二级域名

    标题中的“url重写工具”指的是用于转换或重新映射网站URL的一种技术,它能够将不友好的、复杂的URL转化为用户友好的、简洁的形式。在.NET环境中,这通常通过使用IIS(Internet Information Services)的扩展性来...

    C#实现按钮Button的重写

    本文将深入探讨如何在C#中实现对按钮控件(Button)的重写,以创建自定义的“漂亮”按钮。 首先,我们要理解重写(Override)的概念。在面向对象编程中,重写是指子类重新定义父类中的某个方法,以便提供自己的实现...

    重写window.alert方法

    这就是“重写window.alert方法”的目的。 重写`window.alert()`主要是通过覆盖原有的方法来实现。在JavaScript中,对象的方法是可以被替换的,因此我们可以在全局作用域内定义一个新的`alert`函数,让它执行我们...

    二级域名重写 二级域名重写

    根据提供的标题、描述、标签及部分内容,我们可以了解到讨论的主题是“二级域名重写”,下面将对这一主题进行详细的解析。 ### 二级域名重写的概念 首先,我们需要理解什么是二级域名重写。简单来说,二级域名重写...

    URL重写实例,无二级重写

    URL重写是Web开发中的一个重要概念,主要用于优化网站的URL结构,提高用户体验并有利于搜索引擎优化(SEO)。在ASP.NET环境中,Microsoft提供了URL重写模块,使得开发者能够方便地实现URL的美化和管理。本实例主要...

    java中的url重写

    Java 中的 URL 重写 Java 中的 URL 重写是一种常用的技术,它可以将原始的 URL 转换为另一个 URL,以便达到特定的目的。例如,隐藏真实的 URL、实现 URL 的加密、实现 URL 的重定向等。在 Java 中,有多种方式可以...

    IISURL重写组件

    **IIS URL重写组件详解** IIS(Internet Information Services)是微软提供的一个强大的Web服务器,用于托管网站和应用程序。在IIS中,URL重写组件是一个非常关键的工具,它允许管理员根据预定义的规则改变请求的...

    Java重写.docx

    Java重写知识点详解 Java中的重写(Override)和重载(Overload)是两个重要的概念,它们都是指方法的定义方式,但是它们之间存在着明显的区别。 方法的重载 在同一个类中,可以定义多个方法,它们的方法名相同,...

    URL重写的一个例子

    URL重写是Web开发中的一种技术,主要用于优化和简化用户访问网站时的URL结构,使其更易读、更友好。这种技术通常与动态网站或基于框架的应用程序配合使用,例如ASP.NET、PHP、Java等。在本例中,我们将探讨URL重写的...

    U盘芯片重写教程与工具

    本教程介绍了U盘量产(重写存储分区)的全过程,在附件内还提供了重写的必要工具:MyDiskTest、FlashGenius、chipgenius。 下载本教程后,可根据doc文档的描述内容进行操作,对U盘重新写入。 本教程常用于: 1,建立...

    Nginx 重写规则教程

    Nginx 重写规则是Nginx服务器中用于处理URL请求的重要功能,它允许运维人员通过正则表达式来改变请求的URI,实现URL的重定向、路由转发等多种用途。本教程旨在帮助你理解Nginx的重写模块及其相关指令,以便你能独立...

    Vb.Net 重写控件(源代码)

    在VB.NET编程中,有时我们需要根据项目需求对标准控件的功能进行扩展或定制,这就涉及到控件的重写。本文将深入探讨如何在VB.NET中重写TabContorl、TextBox和Label这三个常见控件,并提供相关的源代码供学习参考。 ...

    ASP.NET C# URL重写 地址重写 伪静态 转HTML

    ASP.NET C# URL重写是Web开发中的一个重要概念,它涉及到网站的地址结构优化和搜索引擎友好性提升。在本文中,我们将深入探讨URL重写、地址重写、伪静态以及如何将ASP.NET C#应用程序中的动态页面转换为HTML,以提高...

Global site tag (gtag.js) - Google Analytics