美文网首页jstl
jsp学习 EL JSTL C标签

jsp学习 EL JSTL C标签

作者: 哈哈海 | 来源:发表于2016-11-17 23:06 被阅读0次

JSP

Java server page    服务器端用来开发动态网页
原因: 替换servlet中显示逻辑的servlet
            (获得作用域中的数据 + 想浏览器显示网页)
            java+HTML   (java代码嵌套html标签)

第一个JSP程序

//显示当前系统时间
1.代码命名: *.JSP
            HTML代码+java代码(html标签嵌套java代码)
2.部署tomcat中
    部署地位相当于html文件。
3.访问JSP
    和HTML访问一样。
注意:
    ① jsp开发无须在web.xml中注册
    ② jsp代码无须程序员编译
    JSP程序执行:
        HTML表签直接输出浏览器
        java代码,执行。如果有执行结果,显示给浏览器.

JSP对比servlet

servlet
    java嵌套HTML
    开发后需要程序员编译
    在web.xml配置
    修改代码需要重新启动tomcat

    
JSP
    HTML嵌套java
    直接部署,无须程序员手动编译
    无需要在web.xml配置
    修改代码无须重新启动tomcat

JSP中java脚本元素

表达式脚本:  将结果输出给浏览器
    表达式?    1+1     a/b     a++     a==b
        <%= java表达式 %>
            * 末尾不能有分号 ;
            * 表达式有执行结果;
普通脚本
    流程控制代码.
    <%  普通java代码 %>
声明脚本
    <%! 声明变量,定义函数的代码%>

注意:
    1. java脚本不能嵌套HTML标签
    2. java脚本不能相互嵌套.

JSP原理

本质上是Servlet程序.
JSP执行原理:
    1. 浏览器请求jsp程序,tomcat将jsp翻译servlet程序(*.java)
    2. 将servlet程序编译成class文件
    3. 调用servlet程序service方法提供响应服务。
*  一次访问jsp
    tomcat将jsp翻译servlet程序(*.java)
*  一旦修改jsp
    tomcat将jsp重新发翻译servlet程序(*.java)

JSP的翻译规则

1.HTML标签部分,翻译成响应输出流方法中内容
    JSP:
        <body>
            <h1></h1>
        </body>
    翻译Servlet:
        pw.println("<body>");
        pw.println("<h1></h1>");
        pw.println("</body>");
2. 表达式脚本
    将表达式翻译输出语句中的代码。
    JSP:
        <%=new java.util.Date() %>
    翻译servlet:
        pw.println(new java.util.Date());
3. 普通脚本
    翻译成service方法内部的代码
4. 声明脚本
    翻译成Servlet的成员变量(成员方法)
jsp翻译规则.png

JSP指令元素

页面指令

<%@page 属性=’值‘%>
导包:
    servlet:    import java.util.*;
    jsp:        <%@page import="java.util.*" %>

设置响应的编码格式:
    servlet:
        resp.setCharacterEncoding("GBK");
        resp.setContentType("text/html");
    JSP:
        contentType='text/html;charset=GBK'
设置jsp文件流编码
    JSP:
        pageEncoding='GBK'
获得session:
    servlet: getSession();
    JSP:      session='true'    当前jsp中可以使用session
            * session='false'   当前jsp中无法使用session
                     翻译后的servlet中没有getSession();
              默认  值  true;

错误页面
    isErrorPage=’false|true‘
        表明当前jsp是否是一个错误页面
        包含隐含exception对象。
    errorPage='url-pattern'
        指明如果当前页面有异常,自动跳转errorPage指向的页面

isELIgnored="false" 表明当前页面是否忽略EL表达式 [了解]

标签库指令

<%@taglib uri='' prefix=''%>
    uri:    引入外部标签库的地址
    prefix: 标签前缀
例如:
    <%@taglib uri='/struts-tags' prefix=’s‘%>       
        <s:if>

包含指令

<%@include file=’被包含的jsp的url-pattern路径‘%>
注意:
    静态包含,源代码包含,注意java变量重复声明的问题。
包含指令.png

动作指令

包含动作

<jsp:include page="被包含的页面的路径 url-pattern"></jsp:include>

*   输出包含,动态包含。不会存在java变量冲突的 问题.
动态包含.png

JSP 9大内置(隐含)对象

什么叫内置对象:
    可以直接在java脚本中使用。不能在声明脚本中使用
    是service方法局部变量.
exception   
request     HttpServletRequest
session     HttpSession
application ServletContext

response    HttpServletResponse
page        this    Object  
out         JspWriter   面向浏览器的输出流
config      ServletConfig
            web.xml ------ ServletContext
            filter标签------FilterConfig
            servlet标签------ServletConfig
            
pageContext【重点】
    1. 作用域:存储命名属性
        pageContext.setAttribute("name",值);
        pageContext.getAttribute("name");
        生命周期: 仅限当前jsp页面。
    2. 管理其他所有的作用域:
        pageContext
        request
        session
        servletContext(application)
        获得作用域中的值:
            pageContext.getAttribute(arg0, arg1)
                参数1: 获得的命名属性的名字
                参数2:    指定的作用域 是一个int类型的数字  作用域对应的常量
                        pageContext     1       PageContext.PAGE_SCOPE
                        request         2       PageContext.REQUEST_SCOPE
                        session         3       PageContext.SESSION_SCOPE
                        servletContext  4       PageContext.APPLICATION_SCOPE
            
        向作用域中存储值
            pageContext.setAttribute(name, Value,作用域对应的常量)
    3.  管理其他所有jsp内置对象。
            获得request对象
                pageContext.getRequest();
            获得session对象
                pageContext.getSession();
            获得application对象(ServletContext)
                pageContext.getServletContext();
        案例:
            动态获得  "/项目名"
                HttpServletRequest
                使用request:
                request.getContextPath();
                使用pageContext:
                ((HttpServletRequest)pageContext.getRequest()).getContextPath()

栗子

jsp翻译规则.png :
导入PersonSystemServlet项目,改名字;
左边---右键---import--general--Existing projects in workspace
---brows---项目目录---勾选 copy projects into workspace
该项目名:
项目名--右键--refacter---rename
项目名--右键--properties--搜 web--修改 web context root(改为项目名一致)
1.将通讯录展示所有联系人的页面
该JSP实现。
旧: showAllPersonAction --------->showAllPersonView
调用service获得list 获得request作用域list
list存入request作用域 显示成一个table
forward
新: showAllPersonAction --------->showAllPersonView.jsp
调用service获得list 获得request作用域list
<%request.getAttribute%>
list存入request作用域 显示成一个table
forward html嵌套java脚本.
2.完成显示所有商品功能
    showAllProductAction            showAllProductView.jsp
        调用service获得list             获得request作用域list
        list存入request作用域            显示成一个table
        forward 
    ProductService:
        public List<Product> getAllProducts();
    ProductDAO
        public List<Product> selectAllProducts();
    实体Product:
    添加JDBCUtil  配置文件     jar包
    建表
    创建web项目

批量删除

批量删除.png

EL

expression language 表达式语言
特点: 结果输出给浏览器

语法:
    java表达式脚本:  <%= java表达式,调用方法%>
    EL:             ${java表达式}
        访问语法:   []      .

语法介绍

1.  数学运算符   +   -   *   /   %
        注意: ${10/3}         3.33333333
2.  逻辑运算符   >   <   >=  <=  !=  ==
                &&  ||  !
3.  三目运算符   booleab表达式?值1:值2

4.  访问作用域中的值
    访问pageContext作用域
        ${pageScope.命名属性的name}
    获得request作用域中的命名属性
        ${requestScope.命名属性的name}               不是 <%=request%>
    获得session作用域中的值
        ${sessionScope.命名属性的name}
    获得servletContext作用域中的值
        ${applicationScope.命名属性的name}
5.  访问对象的属性
        ${对象.属性名}
            * 原理 调用对象.get属性();
            例如:
                ${person.username}
                person.getUsername()                
    获得  /项目名
    java:   <%=request.getContextPath()%>
            <%=((HttpServletRequest)pageContext.getRequest()).getContextPath()%>
    EL:     ${pageContext.request.contextPath}  【重要】
6.  访问请求参数
    ${param.请求参数的name}
7.  访问cookie
    ${cookie.cookie的name}
    ${cookie.cookie的name.value} //获得cookie得到value
8.  访问数组和List集合
    ${集合[下标]}
9.  访问Map
    ${map.key}  //通过map的key获得value

总结EL中可以使用的内置对象

pageScope requestScope sessionScope applicationScope
pageContext param   cookie
*重点记住:
    1. 不要再JSP写java代码
    2. 
        获得request作用域中的命名属性
            ${requestScope.命名属性的name}               
        获得session作用域中的值
            ${sessionScope.命名属性的name}

JSTL part I

jsp标签库。
作用: 条件判断,流程控制,循环。 url生成。
使用:
    1. 导入jstl的jar包
    
    2. 导入jstl
        <%@taglib uri='http://java.sun.com/jsp/jstl/core' prefix=‘c’%>

if: 单条件判断
    使用:
        <c:if test='boolean表达式结果'>
            条件成立执行。
        </c:if>

choose: 多条件分支
    when
    otherwise
    使用:
        <c:choose>
            <c:when test='条件1'>
                条件1成立
            </c:when>   
            <c:when test='条件2'>
                条件1不成立,条件2成立
            </c:when>
            <c:when test='条件3'>
                条件1,2都不成立,条件3成立
            </c:when>
            <c:otherwise>
                else,条件都不成立
            </c:otherwise>
        </c:choose>

forEach 遍历集合
    <c:forEach items='list' var='p'>
        ${p}
    </c:forEach>
        var:每次循环得到的当前元素对象。
        items:被遍历的集合。
        
        begin:遍历集合的起始下标
        end:遍历集合的结束下标
        step:下标渐变值。步长.
        varStatus:
            varStatus='aa'
                aa.index    下标
                aa.count    被遍历出来的元素个数(序号)

JSTL问题

1. jstl标签属性中,使用EL表达式,el表达式外不能写空格.

总结:

JSP开发
    显示逻辑代码
    EL+JSTL(不要出现java代码)
    EL: ${requestScope}
            ${sessionScope}
            ${对象.属性名}
    JSTL:
            choose
            forEach

JSTL part II

formatDate:
    使用:
        ① 导入    <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" 
            prefix="fmt" %>
        ② <fmt:formatDate value="" pattern=""/>
            value: 要格式化的日期
            pattern: 日期格式
                    年   yyyy
                    月   MM
                    日   dd
remove
    使用:
        <c:remove var='' scope='' />
        删除作用域中的值
            var:要删除的命名属性的name
            scope:删除的作用域哪个
                    page        pageContext作用域
                    request     request作用域
                    session     session作用域
                    application ServletContext作用域

url
    使用:
        <c:url value='url-pattern'></c:url>
            1.将url-pattern转换成uri
            2.在cookie被禁用的时候,自动将JESSSIONID追加在url后面
      
    禁用cookie的解决办法:
        1. 将jsp中所有的超链接,表单的action
            <c:url value='url-pattern'></c:url>
        2. 处理servlet中重定向的路径
            response.encodURL(uri);
            在uri后自动追加 jsessionid的值

相关文章

网友评论

    本文标题:jsp学习 EL JSTL C标签

    本文链接:https://www.haomeiwen.com/subject/hiljpttx.html