国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JSP自定義標簽就是如此簡單

codercao / 3094人閱讀

摘要:傳統標簽是這樣子的將標簽體的內容通過注入到對象中。現在我們使用標簽來進行防盜鏈模擬下場景頁面是海賊王資源,頁面提示非法盜鏈,是我的首頁。

為什么要用到簡單標簽?

上一篇博客中我已經講解了傳統標簽,想要開發自定義標簽,大多數情況下都要重寫doStartTag(),doAfterBody()和doEndTag()方法,并且還要知道SKIP_BODY,EVAL_BODY等等的變量代表著什么,在什么方法中使用。這樣實在是太麻煩了!

因此,為了簡化標簽開發的復雜度,在JSP 2.0中定義了一個更為簡單、便于編寫和調用的SimpleTag接口來實現標簽的功能。

一般來說,實現了SimpeTag接口的標簽稱之為簡單標簽

SimpleTag接口

首先我們來看一下它的源碼吧

    public interface SimpleTag extends JspTag {
        void doTag() throws JspException, IOException;
    
        void setParent(JspTag var1);
    
        JspTag getParent();
    
        void setJspContext(JspContext var1);
    
        void setJspBody(JspFragment var1);
    }

setParent()和getParent()方法就不多說了,我們來看一下剩下的3個方法

        void doTag() throws JspException, IOException;

        void setJspContext(JspContext var1);
    
        void setJspBody(JspFragment var1);

明顯地:

doTag()就是我們要寫代碼處理邏輯地方

setJspContext(JspContext var1)是將PageContext對象傳遞給標簽處理器類(PageContext是JspContext的子類)

setJspBody(JspFragment var1)把代表標簽體的JspFragment對象傳遞給標簽處理器對象

快速入門

一般地,我們做開發都是繼承SimpleTagSupport類(該類實現了SimpleTag)來編寫自定義標簽

下面我們就來個快速入門吧

目標:傳入字符串格式就可以顯示想要的格式日期,對比之前傳統標簽的,看有什么不同之處

標簽處理器類:

    public class Demo1 extends SimpleTagSupport {
    
    
        String format = null;
    
        @Override
        public void doTag() throws JspException, IOException {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
    
            this.getJspContext().getOut().write(simpleDateFormat.format(new Date()));
        }
    
        public String getFormat() {
            return format;
        }
    
        public void setFormat(String format) {
            this.format = format;
        }
    }

tld文件:

   
        formatDate
        tag.Demo1
        tagdependent
        
            format
            true
            true
        
    

效果:

簡單標簽的好處就是不用去理會doStartTag、doEndTag、SKIP_BODY以及一系列的方法和屬性!

簡單標簽一個doTag()方法走天下!

SimpleTagSupport類的執行順序:

①WEB容器調用標簽處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標簽處理器對象

②WEB容器調用標簽處理器對象的setParent方法,將父標簽處理器對象傳遞給這個標簽處理器對象。【注意,只有在標簽存在父標簽的情況下,WEB容器才會調用這個方法】

③如果調用標簽時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標簽處理器對象。如果標簽的屬性值是EL表達式或腳本表達式,則WEB容器首先計算表達式的值,然后把值傳遞給標簽處理器對象。

④如果簡單標簽有標簽體,容器將調用setJspBody方法把代表標簽體的JspFragment對象傳遞進來

⑤執行標簽時:容器調用標簽處理器的doTag()方法,開發人員在方法體內通過操作JspFragment對象,就可以實現是否執行、迭代、修改標簽體的目的。

深入簡單標簽

在我們講解傳統標簽的時候,配合著SKIP_BODY、SKIP_PAGE等變量可以實現如下的功能:

控制jsp頁面某一部分內容(標簽體)是否執行

控制整個jsp頁面是否執行

控制jsp頁面內容重復執行

修改jsp頁面內容輸出

簡單標簽可沒有這些變量呀,那它怎么才能實現上面那些功能呢?

在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用于通知WEB容器不再執行JSP頁面中位于結束標記后面的內容,這等效于在傳統標簽的doEndTag方法中返回Tag.SKIP_PAGE常量的情況,我們來測試一下,在上面例子的代碼中添加

    throw new SkipPageException();

效果:

至于其他的功能下面會講到

帶標簽體的簡單標簽

SimpleTagSupport也可以帶標簽體,但是處理方法和傳統標簽完全不同

傳統標簽是這樣子的:將標簽體的內容通過setBodyContent()注入到BodyContent對象中。

簡單標簽是這樣子的:通過JspFragment對象實現!

我們來看一下JspFragment對象的源碼吧


    public abstract class JspFragment {
        public JspFragment() {
        }
    
        public abstract void invoke(Writer var1) throws JspException, IOException;
    
        public abstract JspContext getJspContext();
    }

JspFragment對象十分簡單,重要的只有invoke(Writer var1)方法(獲取JspContext對象并不重要,在標簽描述器上就可以獲取到了)

public abstract void invoke(java.io.Writer out) :

用于執行JspFragment對象所代表的JSP代碼片段

參數out用于指定將JspFragment對象的執行結果寫入到哪個輸出流對象中,如果傳遞給參數out的值為null,則將執行結果寫入到JspContext.getOut()方法返回的輸出流對象中。(簡而言之,可以理解為寫給瀏覽器)

下面是標簽處理器類的代碼

    public class Demo1 extends SimpleTagSupport {
        @Override
        public void doTag() throws JspException, IOException {
    
            //得到代表標簽體的對象
            JspFragment jspFragment = getJspBody();
    
            //invoke方法接收的是一個Writer,如果為null,就代表著JspWriter(),將標簽體的數據寫給瀏覽器!
            jspFragment.invoke(null);
            
        }
    }

效果:

既然標簽體的內容是通過JspFragment對象的invoke()方法寫給瀏覽器的,那么那么那么,我只要控制好invoke()方法,我想干什么就干什么!

也就是說:

不調用invoke()方法,標簽體內容就不會輸出到瀏覽器上

重復調用invoke()方法,標簽體內容就會被重復執行

若想在標簽處理器中修改標簽體內容,只需在調用invoke方法時指定一個可取出結果數據的輸出流對象(例如StringWriter),讓標簽體的執行結果輸出到該輸出流對象中,然后從該輸出流對象中取出數據進行修改后再輸出到目標設備,即可達到修改標簽體的目的

來來來,我們來試驗一下:

不調用invoke()方法

    public void doTag() throws JspException, IOException {

        //得到代表標簽體的對象
        JspFragment jspFragment = getJspBody();
        
        //jspFragment.invoke(null);

    }

- **標簽體的內容沒有輸出**
![](http://i.imgur.com/rgEAjZG.png) 

- **調用兩次invoke()方法**

```java

    public void doTag() throws JspException, IOException {

        //得到代表標簽體的對象
        JspFragment jspFragment = getJspBody();

        jspFragment.invoke(null);
        jspFragment.invoke(null);

    }


```
- **標簽體的內容被輸出了兩次**!
![](http://i.imgur.com/UH8VAhw.png)
- **invoke()方法指定別的輸出流(StringWriter),將標簽體的內容寫到流對象中,再通過流對象把數據取出來,達到修改的目的。**


```java

        //得到代表標簽體的對象
        JspFragment jspFragment = getJspBody();

        //創建可以存儲字符串的Writer對象
        StringWriter stringWriter = new StringWriter();

        //invoke()方法把標簽體的數據都寫給流對象中
        jspFragment.invoke(stringWriter);

        //把流對象的數據取出來,流對象的數據就是標簽體的內容
        String value = stringWriter.toString();

        //將數據改成是大寫的,寫到瀏覽器中
        getJspContext().getOut().write(value.toUpperCase());

```

- **標簽體的內容被改成了大寫!**

![](http://i.imgur.com/HpbrbKR.png)





我們可以發現,傳統標簽能完成的功能,簡單標簽都可以完成,并且更為簡單!

自定義標簽的應用

既然我們學了簡單標簽,我們就用簡單標簽來做開發吧!

防盜鏈

在講解request對象的時候,我們講解過怎么實現防盜鏈的功能。現在我們使用標簽來進行防盜鏈

模擬下場景:1.jsp頁面是海賊王資源,2.jsp頁面提示非法盜鏈,index1.jsp是我的首頁。別人想要看我的海賊王資源,就必須通過我的首頁點進去看,否則就是非法盜鏈!

標簽處理器的代碼

    @Override
    public void doTag() throws JspException, IOException {

        //如果想要做成更加靈活的,就把站點設置和資源設置成標簽屬性傳遞進來!

        //等會我們要獲取得到request對象,需要使用到JspContext的子類PageContext
        PageContext pageContext = (PageContext) this.getJspContext();

        //獲取request對象
        HttpServletRequest httpServletRequest = (HttpServletRequest) pageContext.getRequest();

        //獲取到referer
        String referer = httpServletRequest.getHeader("Referer");

        //獲取到response對象,等會如果是非法盜鏈,就重定向別的頁面上
        HttpServletResponse httpServletResponse = (HttpServletResponse) pageContext.getResponse();
        
        //非法盜鏈!
        if (referer == null || !referer.startsWith("http://localhost:8080/zhongfucheng")) {

            //2.jsp提示了非法盜鏈!
            httpServletResponse.sendRedirect("/zhongfucheng/2.jsp");

            //不執行頁面下面的內容了,保護頁面
            throw new SkipPageException();
        }
    }

1.jsp代碼:

    
    
    
        
    
    
    
    海賊王最新資源
    
    
    

index1.jsp代碼

    

這是首頁!

海賊王最新資源

2.jsp代碼

    
    你是非法盜鏈的!!!!!!
    

第一次我是直接訪問1.jsp,Referer是為空的,所以是非法盜鏈。第二次我是通過從首頁點進去看的,所以可以訪問1.jsp。效果圖:

if標簽

在JSTL中,我們已經使用過了標簽了,現在我們學習了自定義標簽,可以開發類似于JSTL的if標簽了!

既然是if標簽,那么就需要編寫帶屬性和帶標簽體的標簽(需要判斷是true還是false呀!,通過判斷是否為真值來決定是否執行標簽體的內容)

標簽處理器代碼

    public class Demo1 extends SimpleTagSupport {
        
        //定義一個Boolean類型的變量
        boolean test ;
    
        @Override
        public void doTag() throws JspException, IOException {
    
            //獲取到代表標簽體內容的對象
            JspFragment jspFragment = this.getJspBody();
    
            //如果為真值才執行標簽體的內容
            if (test == true) {
                jspFragment.invoke(null);
            }
        }
    
        public boolean isTest() {
            return test;
        }
    
        public void setTest(boolean test) {
            this.test = test;
        }
    }

tld文件的代碼

    
        if
         tag.Demo1
        scriptless
        
            test
            true
            true
        
    

本來就沒有user這個域對象屬性,所以user就是為null

將user改成不為null,瀏覽器就沒有輸出了

forEach標簽

forEach標簽最基本的功能:遍歷集合、數組

首先,我先寫一個可以遍歷List集合的標簽,可能我們會這樣設計

public class Demo2 extends SimpleTagSupport {

    //遍歷的是List集合,于是標簽的屬性就為List
    private List items;

    //遍歷出來的對象就用Object存著,因為我們不知道List集合保存的是什么元素
    private Object var;


    @Override
    public void doTag() throws JspException, IOException {

        //獲取到迭代器
        Iterator iterator = items.iterator();

        //遍歷集合
        while (iterator.hasNext()) {

            //獲取到集合的元素
            var = iterator.next();

            //.....var屬性代表的就是集合的元素,現在問題來了,好像在標簽體內無法獲取到這個對象....
            //做到這里完成不下去了....
        }
    }

    public void setItems(List items) {
        this.items = items;
    }

    public void setVar(Object var) {
        this.var = var;
    }
}

上面的思路是正常的,但是做不下去!我們換一個思路唄。上面的問題主要是在標簽體獲取不到被遍歷出來的對象

我們這樣做:把var定義成String類型的,如果遍歷得到對象了,就設置PageContext的屬性,var為關鍵字,對象為值。在標簽體用EL表達式搜索以var為關鍵字的對象!每遍歷出一個對象,就執行一次標簽體!

于是就有了以下的代碼!

public class Demo1 extends SimpleTagSupport {

    //遍歷的是List集合,定義List集合成員變量
    private List items;

    //以var為關鍵字存儲到PageContext
    private String var;



    @Override
    public void doTag() throws JspException, IOException {

        //獲取到集合的迭代器
        Iterator iterator = items.iterator();

        //獲取到代表標簽體內容的對象
        JspFragment jspFragment = this.getJspBody();

        //遍歷集合
        while (iterator.hasNext()) {
            Object o = iterator.next();

            //把遍歷出來的對象存儲到page范圍中,關鍵字為標簽的屬性var(在標簽體中使用EL表達式${var},就能夠獲取到集合的對象了!)
            this.getJspContext().setAttribute(var, o);

            //每設置了一個屬性,我就執行標簽體
            jspFragment.invoke(null);
        }
    }

    public void setItems(List items) {
        this.items = items;
    }

    public void setVar(String var) {
        this.var = var;
    }
}

tld文件如下

    
        forEach
        tag.Demo1
        scriptless
        
            var
            true
            
            false
        

        
            items
            true
            true
        
    

測試的jsp代碼如下

    <%
        List list = new ArrayList();
        list.add("zhongfucneng");
        list.add("1");
        list.add("2");
        list.add("3");
    
        request.setAttribute("list",list);
    %>
    
    
        ${str}
    
    

效果:

上面寫的僅僅能夠遍歷List集合,做一個通用的forEach標簽麻煩的是在:不知道傳進來的是什么類型的數組、什么類型集合!,需要逐一去判斷

我們的實現思路就是將所有的集合或數組都轉成是Collection類型的!

我們來嘗試著寫一下

        //如果items是Collection類型的,就強轉為Colletion
        if (items instanceof Collection) {
            collection = (Collection) items;
        }

        //如果itmes是Map類型的,那么就強轉為Map,再獲取到,這個是Set集合的!
        if (items instanceof Map) {
            Map map = (Map) items;
            collection = (Collection) map.entrySet();
        }
        
        //對象數組
        if (items instanceof Object[]) {
            Object[] objects = (Object[]) items;
            collection = Arrays.asList(objects);
        }
        
        //int[],Byte[],char[]等八大基本數據類型.....
        

還有int[],byte[],char[]等八大基本數據類型,這八大基本數據類型就不能用Arrays.asList()把引用傳進去了。因為JDK5以后會把引用自動裝箱成Interger[]、Byte[]等等,而不是獲取到數組的元素數據。

測試代碼如下:

    public static void main(String[] args) {

        int[] ints = new int[]{1, 2, 3};
        Object[] objects = new Object[]{"1", "2", "3"};

        if (objects instanceof Object[]) {
            Collection collection = Arrays.asList(objects);
            System.out.println(collection);
        }
        if (ints instanceof int[]) {

            Collection collection1 = Arrays.asList(ints);
            System.out.println(collection1);
        }
    }

效果:

對于八大基本類型數據我們就可以這樣干


        if (items instanceof int[]) {
            int[] ints = (int[]) items;
            collection = new ArrayList();
            for (int anInt : ints) {
                collection.add(anInt);
            }
            
        }
        //......這里還要寫7個

JSTL的forEach標簽類似就是這樣干的

由于JDK5的新特性,我們又有另外的解決方案,Class對象能夠判斷是否為數組類,reflect反射包下Array類

其實,無論Map集合、還是任何類型的數組、都可以使用Colletion進行遍歷!。

如果是八大基本數據類型的數組,我們就使用反射來進行構建出Collection集合。

標簽處理器的代碼

public class Demo1 extends SimpleTagSupport {

    //遍歷的是未知的集合或數組,定義成Object
    private Object items;

    //每次被遍歷的對象存儲關鍵字
    private String var;

    //Colletion
    private Collection collection;

    //在WEB容器設置標簽的屬性的時候,判斷是什么類型的數組和集合
    public void setItems(Object items) {
        this.items = items;

        //如果items是Collection類型的,就強轉為Colletion
        if (items instanceof Collection) {
            collection = (Collection) items;
        }

        //如果itmes是Map類型的,那么就強轉為Map,再獲取到,這個是Set集合的!
        if (items instanceof Map) {
            Map map = (Map) items;
            collection = (Collection) map.entrySet();
        }

        //可以這樣解決,Class對象判斷是否是一個數組類
        if (items.getClass().isArray()) {

            //創建Collection集合添加數組的元素!
            collection = new ArrayList();

            //再利用reflect包下的Array類獲取到該數組類的長度
            int len = Array.getLength(items);

            //遍歷并添加到集合中
            for (int i = 0; i < len; i++) {
                collection.add(Array.get(items, i));
            }
        }
    }

    public void setVar(String var) {
        this.var = var;
    }

   @Override
    public void doTag() throws JspException, IOException {

        //獲取到代表標簽體內容的對象
        JspFragment jspFragment = this.getJspBody();
        Iterator iterator = collection.iterator();


        //遍歷集合
        while (iterator.hasNext()) {
            Object o = iterator.next();

            //把遍歷出來的對象存儲到page范圍中(在標簽體中使用EL表達式${var},就能夠獲取到集合的對象了!)
            this.getJspContext().setAttribute(var, o);

            jspFragment.invoke(null);
        }
    }
}

tld文件和上面是一樣的,下面是測試代碼


<%
    /*list集合*/
    List list = new ArrayList();
    list.add("zhongfucneng");
    list.add("1");
    list.add("2");
    list.add("3");
    request.setAttribute("list",list);

    /*基本數據類型數組*/
    int[] ints = new int[]{1, 2, 3, 4, 5};
    request.setAttribute("ints", ints);

    /*對象數組*/
    Object[] objects = new Object[]{2, 3, 4, 5, 6};
    request.setAttribute("objects", objects);

    /*map集合*/
    Map map = new HashMap();
    map.put("aa", "aa");
    map.put("bb", "bb");
    map.put("cc", "cc");
    request.setAttribute("map",map);
%>

    List集合:
    
        ${str}
    
    
    

基本數據類型數組: ${i}

對象數組: ${o}

map集合: ${me.key} = ${me.value}

效果:

HTML轉義標簽

要開發這個標簽就很簡單了,只要獲取到標簽體的內容,再通過經過方法轉義下標簽體內容,輸出給瀏覽器即可

標簽處理器代碼:

public class Demo1 extends SimpleTagSupport {



   @Override
    public void doTag() throws JspException, IOException {

       //獲取到標簽體的內容再修改
       StringWriter stringWriter = new StringWriter();
       JspFragment jspFragment = this.getJspBody();
       jspFragment.invoke(stringWriter);
       String content = stringWriter.toString();

       //經過filter()轉義,該方法在Tomcat可以找到
       content = filter(content);

       //再把轉義后的內容輸出給瀏覽器
       this.getJspContext().getOut().write(content);


    }

    private String filter(String message) {

        if (message == null)
            return (null);

        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
                case "<":
                    result.append("<");
                    break;
                case ">":
                    result.append(">");
                    break;
                case "&":
                    result.append("&");
                    break;
                case """:
                    result.append(""");
                    break;
                default:
                    result.append(content[i]);
            }
        }

        return (result.toString());
    }
}

測試代碼

    
    你好啊 
    
    
你好啊

效果:

if else標簽

在JSTL中并沒有if else的標簽,JSTL給予我們的是choose,when,otherwise標簽,現在我們模仿choose,when,otherwise開發標簽

思路:when標簽有個test屬性,但otherwise怎么判斷標簽體是執行還是不執行呢?這時就需要choose標簽的支持了!choose標簽默認定義一個Boolean值為false,。當when標簽體被執行了,就把Boolean值變成true,只要Boolean值為false就執行otherwise標簽體的內容。

看程序就容易理解上面那句話了:

choose標簽處理器

    public class Choose extends SimpleTagSupport {
    
        private boolean flag;
    
        @Override
        public void doTag() throws JspException, IOException {
    
            this.getJspBody().invoke(null);
        }
    
        public boolean isFlag() {
            return flag;
        }
    
        public void setFlag(boolean flag) {
            this.flag = flag;
        }
    }

When標簽處理器

    public class When extends SimpleTagSupport {
    
        private boolean test ;
    
        @Override
        public void doTag() throws JspException, IOException {
    
    
            Choose choose = (Choose) this.getParent();
    
            //如果test為true和flag為false,那么執行該標簽體
            if (test == true && choose.isFlag() == false) {
    
                this.getJspBody().invoke(null);
    
                //修改父標簽的flag
                choose.setFlag(true);
            }
    
        }
        public void setTest(boolean test) {
            this.test = test;
        }
    }

OtherWise標簽處理器


    public class OtherWise extends SimpleTagSupport {
    
    
        @Override
        public void doTag() throws JspException, IOException {
    
    
            Choose choose = (Choose) this.getParent();
    
            //如果父標簽的flag為false,就執行標簽體(如果when標簽沒執行,flag值就不會被修改!when標簽沒執行,就應該執行otherwise標簽!)
            if (choose.isFlag() == false) {
                getJspBody().invoke(null);
    
                //改父標簽的flag為false
                choose.setFlag(true);
    
            }
        }
    }

測試代碼:

    
        
            user為空
        
    
        
            user不為空
        
    
    

效果:

DynamicAttribute接口

此接口的主要功能是用于完成動態屬性的設置!前面我們講解屬性標簽的時候,屬性都是寫多少個,用多少個的。現在如果我希望屬性可以動態的增加,只需要在標簽處理器類中實現DynamicAttribute接口即可!

現在我要開發一個動態加法的標簽

標簽處理器

    public class Demo1 extends SimpleTagSupport implements DynamicAttributes {
    
        //既然有動態屬性和動態的值,那么我們就用一個Map集合存儲(1-1對應的關系),做的加法運算,值為Double類型的。
        Map map = new HashMap<>();
    
        @Override
        public void doTag() throws JspException, IOException {
    
            //定義一個sum變量用于計算總值
            double sum = 0.0;
    
            //獲取到Map集合的數據
            Iterator iterator = map.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
    
                sum += entry.getValue();
            }
    
            //向瀏覽器輸出總和是多少
            this.getJspContext().getOut().write(String.valueOf(sum));
        }
    
    
        //對于這個要實現的方法,我們只要關注第2個參數和第3個參數即可
        //第二個參數表示的是動態屬性的名稱,第三個參數表示的是動態屬性的值
        @Override
        public void setDynamicAttribute(String s, String localName, Object value) throws JspException {
    
            //將動態屬性的名字和值加到Map集合中
            map.put(localName, Double.valueOf(Float.valueOf(value.toString())));
        }
    }

tld文件,注意要把dynamic-attribute設置為true


    
        dynamicAttribute
         tag.Demo1
         empty

        
        true
    

測試代碼

    

效果,double在運算的時候會丟失精度的,現在只是測驗下動態屬性,這里就不詳細說了!

開發自定義函數

至于怎么開發自定義函數,在EL表達式的博客中有

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68478.html

相關文章

  • JSP第六篇【定義標簽之傳統標簽

    摘要:首先我們來看一下接口的源碼上面程序的執行流程引擎遇到自定義標簽,首先創建標簽處理器類的實例對象。當容器執行到自定義標簽的結束標記時,調用方法。 為什么要使用自定義標簽? JSTL標簽庫只提供了簡單的輸出等功能,沒有實現任何的HTML代碼封裝,并且某些復雜類型轉換,或者邏輯處理的時候,JSTL標簽庫完成不了,需要自定義標簽! 編寫自定義標簽的步驟: 編寫一個實現Tag接口的Java類【...

    songze 評論0 收藏0
  • JSP面試題都在這里

    摘要:下面是我整理下來的知識點圖上的知識點都可以在我其他的文章內找到相應內容。在中,尤其重要的是對象。 下面是我整理下來的JSP知識點: showImg(https://segmentfault.com/img/remote/1460000013229216?w=4962&h=2653); 圖上的知識點都可以在我其他的文章內找到相應內容。 JSP常見面試題 jsp靜態包含和動態包含的區別 j...

    gaosboy 評論0 收藏0
  • JSP第四篇【EL表達式介紹、獲取各類數據、11個內置對象、執行運算、回顯數據、定義函數、fn方法

    什么是EL表達式? 表達式語言(Expression Language,EL),EL表達式是用${}括起來的腳本,用來更方便的讀取對象! EL表達式主要用來讀取數據,進行內容的顯示! 為什么要使用EL表達式? 為什么要使用EL表達式,我們先來看一下沒有EL表達式是怎么樣讀取對象數據的吧! 在1.jsp中設置了Session屬性 向session設置一個屬性 在2...

    flyer_dev 評論0 收藏0
  • Java3y文章目錄導航

    摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...

    KevinYan 評論0 收藏0
  • Struts2【UI標簽、數據回顯、資源國際化】

    摘要:值得注意的是的值是文件的全名也就是說,如果有包,就把包名寫上并且,不需要寫上后綴標簽使用國際化的值是配置文件中配置的信息,寫上就行了登陸測試注意,已經替換成了中文了如果文章有錯的地方歡迎指正,大家互相交流。 Struts2UI標簽 Sturts2為了簡化我們的開發,也為我們提供了UI標簽...也就是顯示頁面的標簽..... 但是呢,Struts2是服務端的框架,因此使用頁面的標簽是需要...

    graf 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<