JSP基础学习

1. JSP 基础语法

JSP:Java Server Page 动态网页编程技术,是Java Web服务器端的动态资源,允许在其嵌套java代码。

(servlet 很难对数据进行排版JSP还可以对html进行排版,所一一般把servlet当作后台,专门写Java代码,JSP专门当作页面显示)

(html 静态页面:页面数据是静态的,不能动态的从服务器中的数据库中获取数据)

JSTL JSP相关的标签库,比如做一些条件判断循环等

  • JSP中可以写java代码,java代码写在scriplet脚本小程序中

  • JSP的指令标签:include 静态包含 跟 include动态包含

  • JSP中四大域对象:

    page :当前页面有效

    request:一次请求就有效

    session:一次会话中有效

    application:整个应用程序中有效

  • EL表达式:通过EL表达式操作域对象,获取域对象中的值

  • JSp本质是servlet文件

2. JSP注释

  • 显示注释:能够在客户端查看的注释

    <! – 显示注释 --> html风格的注释

    (如果注释为字符串的一部分 将<换成 & lt; 将 >换成**& gt;**即写成 & lt;!-- --& gt;)

  • 隐式注释:不能在客户端查看的注释

    <%-- 隐式注释 --%>

    即写成 & lt;%-- --%& gt;

  • < p r e > </p r e> 自动排版

  • <%

​ 中间嵌套java代码

​ %>

3. scriplet脚本小程序

  • java脚本段<% %> 可写Java代码,定义局部变量,编写语句等,生成的代码在servelet中的service方法中
  • 声明<%! %> 声明全局变量,方法,类等,生成的代码在servelet中的类体中
  • 输出表达式<% =数据或数值 %> 可输出变量,或字面量,生成的代码在servelet中的service方法中

4. jsp指令标签

4.1 静态包含

使用include静态指令

  • 格式: <%@ include file =" 要包含的页面地址 "%>

  • 特点:

  1. 把内容进行了直接的替换
  2. 静态包含只会生成一个源码文件,最终内容存放在jspService方法体中(源码文件中)
  3. 不能出现同名变量
  4. 运行效率高一点,耦合度高,不够灵活
4.2 动态包含

使用include动态标签:包含和被包含部分是相互独立的,只有在运行的时候才会动态的包含进来,相当于方法的调用,会生成多个源码文件,可以传参数

  • 格式:

    <jsp:include page=“要包含的页面地址”>< /jsp:include >

  • 特点:

    1. 相当于方法的调用

    2. 会生成多个源码文件

    3. 可以出现同名变量

    4. 效率高,耦合度低

      注:如果动态包含中不需要传递参数时,inlcude双标签之间间不能有任何内容,包括空格和换行。

      在这里插入图片描述

      使用动态包含传递参数,

      格式:

      <jsp:include page=“01-footer.jsp”>

      <jsp:param name=“参数值” value=“参数值”/>

      < /jsp:include >

      • name属性不支持,value属性支持表达式,如value="<%=str%>"
      • 获取参数:request.getParameter(name)通过指定参数名获取参数值

    在这里插入图片描述
    在这里插入图片描述

<%
int a=1;
String url="01-footer.jsp";
//在动态包含中,页面地址可以替换成表达式 如: page="<%=url%>" 但是不能为空
//<jsp:include page="<%=url%>"></jsp:include>
%>
4.3 jsp四大域对象

page作用域:仅在当前页面有效,跳转页面后无效

request作用域:仅在一次请求中有效,即服务端跳转有效,客户端跳转无效

session作用域:在一次会话中有效,服务端和客户端跳转有效

application作用域:在整个应用中有效

设置page范围的域对象:

pageContext.setAttribute(“name01”,“zhangsan”);

设置request范围的域对象:

request.setAttribute(“name02”,“lisi”);

设置session范围的域对象:

session.setAttribute(“name03”,“zhaoliu”);

设置application范围的域对象

application.setAttribute(“name04”,“wangwu”);

在这里插入图片描述

jsp中的页面跳转:

  1. 服务端跳转

    <jsp:forward page="03-jsp四大域对象-02.jsp"></jsp:forward>
    

    2.客户端跳转:

    超链接

    <%--客户端跳转:超链接--%>
    <a href="03-jsp四大域对象-02.jsp">跳转</a>
    

5. EL 表达式

  • 作用:简化jsp代码的

  • 格式:${ 域对象名称 }

  • 操作对象:

    EL表达式一般操作的是域对象,不能操作局部变量

注:

  1. 如果EL表达式获取域对象的值为空,则默认显示空字符串
  2. EL表达式默认从小到大范围去找,找到即可,如果四个范围都没有找到,则显示空字符串
  • 使用四个域对象对应的空间对象:pageScope,requestScope.sessionScope,applicationScope查找指定范围的域对象
获取List

1、获取list的size的值: l i s t . s i z e ( ) ∗ ∗ 2 、 获 取 l i s t 的 指 定 下 标 的 值 : ∗ ∗ { list.size()}** 2、获取list的指定下标的值: ** list.size()2list{list[指定下标]}
注:list代表的是限域变量名 即存在于当前域中的变量的名字

获取Map

获取Map指定key的value: m a p . k e y ∗ ∗ 或 者 ∗ ∗ {map.key}** 或者 ** map.key{map[“key”]}

map代表的也是限域变量名

获取 JavaBean对象

获取JAvaBean中的属性:

1、${JavaBean对象.属性}

2、${JavaBean对象.get属性名()}

注: JavaBean中的属性字段必须提供get方法,否则会报错

empty属性的使用

**作用:**判断域对象是否为空,即判断子符串是否存在

当域对象中字符串为空时,返回true,不为空返回false

如果是要判断是否不为空,其格式为:${!empty 域对象名称}

格式: ${empty 域对象名}

1、域对象为字符串时:

  • 如果域对象不存在,返回 true

  • 域对象为空字符串,返回true

  • 域对象值为null, 返回true

    只有当域对象中存在字符串时,才返回false

2、域对象为List时:

  • list为null: true

  • 没有长度: true

所以empty不仅判断集合是否为空,而且会判断集合长度是否大于0;

3、域对象为Map

  • null: true

  • 没有长度: true

4、域对象为JavaBean时:

  • null: true

  • 空对象: false 虽然只是创建了对象,但是存在地址

EL运算

1、用 a = = b ∗ ∗ 或 者 ∗ ∗ { a==b }** 或者 ** a==b{a eq b} 判断两者是否相等

2、加减乘除 运算 :

加:${a+b }

除:${a / b} 或者 ${a div b}

3、比较大小等逻辑运算 ${ a>b}

6. jstl标签的使用

​ 1、下载JSTL所需要的jar包,(standard.jar)和(jstl.jar)

​ 2、在项目的web目录下的web-inf中新建lib,将jar拷贝进去

​ 3、选择“file”中的“proejct structure”

​ 4、选择“modules”,在右侧的“dependencies”,选择“+”号,将对应lib目录加载进去

​ 5、在需要使用标签库的JSP页面通过taglib标签引入指定库

条件动作标签(if)
格式:
<c:if test="<boolean>" var="<string>" scope="<string>">
    
</c:if>
常用属性:
  • test:条件判断,操作对象是域对象,接受返回结果是boolean类型的值(必要属性)

  • var:限域变量名(存放在作用域中的变量名),用来接收判断结果的值(可选属性)

  • scope:限域变量名的范围(page、request。session、application)(可选属性)

注:

  • 标签操作一般是域对象

  • if标签没有else,如果需要else效果,就需要设置两个完全相反的结果

choose-when-otherwise标签
格式
c:choose>
    <c:when test="">
        
    </c:when>
    <c:otherwise>
        
    </c:otherwise>
</c:choose>

choose相当于switch;when相当于case;otherwose相当于 default

属性
  • choose标签和otherwise标签没有属性
  • when标签只有一个test属性,且必须有一个test属性
注意
  • choose标签中必须包含至少一个when标签,可以没有otherwise标签
  • otherwise标签必须设置在最后一个when标签之后
  • choose标签中只能设置when标签和otherwise标签
  • when标签和otherwise标签中可以嵌套其他标签如< c:if>或< h4>< h4>等
迭代标签
格式
c:forEach
items="<object>"    //被循环的集合
begin="<int>"      //开始数  
end="<int>"     //结束数   
step="<int>"   //迭代数相当于i++
var="<string>"   //   相当于i   限域变量名
varStatus="<string> ">  //当前成员对象的相关信息
</c:forEach>
属性
  • begin:开始数

  • end:结束数

  • step:间隔数

  • var:限域变量名,用来接收当前遍历的成员

  • varStatus:
    在这里插入图片描述

类型
迭代主体内容多次

格式:

<c:forEach var="限域变量名" begin="开始数" end="结束数" step="间隔数">

相当于Java中的for循环 for…int

for(int i=0; i<10 ; i++){

}

循环

格式:

<c:forEach items="被循环的数据可以是数组、List、Map等" var="限域变量名">
    ${取值:限域变量名}&nbsp;
</c:forEach>

相当于Java中的foreach循环

for(String str : list){

}

循环对象集合

创建JavaBean对象:

public class User {
    private   Integer userID;
    private String uname;
    private String pwd;

    public User() {
    }

    public User(Integer userID, String uname, String pwd) {
        this.userID = userID;
        this.uname = uname;
        this.pwd = pwd;
    }

    public Integer getUserID() {
        return userID;
    }

    public void setUserID(Integer userID) {
        this.userID = userID;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpwd() {
        return pwd;
    }

    public void setUpwd(String upwd) {
        this.pwd = upwd;
    }
}

循环对象集合:

<%--    循环对象集合--%>
<%
     List userlist=new ArrayList();
     User user1=new User(1,"zhangsan","123");
     User user2=new User(2,"lisi","456");
     User user3=new User(3,"wangwu","789");
     userlist.add(user1);
     userlist.add(user2);
     userlist.add(user3);
     //把数据存放到作用域中
    request.setAttribute("userlist", userlist);
%>
<%--    判断集合是否为空--%>
    <c:if test="${!empty userlist}">
<%--        当集合不为空时,遍历集合--%>
        <table align="center" width="800" border="1" style="border-collapse:collapse">
            <tr align="center">
               <th>用户编号</th>
               <th>用户名称</th>
               <th>用户密码/th>
               <th>用户操作</th>
            </tr>

<c:forEach items="${userlist}" var="user">
    <tr>
        <td>${user.userID}</td>
        <td>${user.uname}</td>
        <td>${user.pwd}</td>
        <td><button>修改</button></td>
    </tr>
</c:forEach>
        </table>
循环Map
<%--  Map循环--%>
        <%
            Map map=new HashMap();
            map.put("map1","aaa");
            map.put("map2","bbb");
            map.put("map3","ccc");
            request.setAttribute("map", map);
        %>
        <c:forEach items="${map}" var="mapp">
            key:${mapp.key}&nbsp; value:${mapp.value}
        </c:forEach>
格式化动作标签
formatNumber标签

**定义:**用于格式化数字,百分比,货币。即将数值型数据转换成指定格式的字符串类型

格式:

<fmt:formatNumber
    value="<string>"
    type="<string>"
    var="<string>"
    scope="<string>"/>

常用属性:

value:要格式化的数值

type:要格式化的类型

  • number 数值型(默认值)
  • percent 百分比类型
  • currency 货币类型

var:限域变量名,用来接收格式化的结果(存储格式化数字的变量)

scope:var属性的范围,即作用域,默认为page(有page、request、session、applicatin四个范围)

注:

  • 如果设置了var属性,则格式化后结果不会输出,需要通过EL表达式获取var对应的限域变量名
  • 默认的类型(type)的取值为number。可取值:number类型、percent百分比类型、currency货币型
formatDate

**定义:**用于使用不同格式的方式格式化日期。将Date型数据转换成指定格式的字符串类型

格式:

<fmt:formatDate
   value="<string>"/>
   type="<string>"/>
   dateStyle="<string>"/>
   timeStyle="<string>"/>
   pattern="<string>"/> 
   timeZone="<string>"/>
   var="<string>"/>
   scope="<string>" />    

常用属性:

value:要格式化的日期

type: 日期类型 (默认为date)

  • date:日期型 年月日
  • time: 时间型 时分秒
  • both:日期时间型

datetype:日期格式(full、long、medium、short、default(默认))

timetype:时间格式(full、long、medium、short、default(默认))

pattern:自定义格式 (y、M、d、H、m、s)

代码描述实例
y年份。不包含纪元的年份,如其小于10,则显示不具有前导零的年份2002
M月份数字04&April
d月份中的天数20
h12小时制的小时12
H24小时制的小时0
m分钟45
s52

timeZone:显示日期的时区

var:限域变量名,存储格式化日期的变量名

scope:格式化变量名的作业域

parseNumber

定义:将指定格式的数值字符串转换成数值型

格式:

<fmt:formatNumber
    value="<string>"
    type="<string>"
    var="<string>"
    scope="<string>"/>

属性:

value:要解析的数字

type:number、percent、currency

var:要解析的数字的变量

scope:var属性的作用域

parseDate

定义:将日期型的字符串转换成Date型

格式:

<fmt:parseDate
   value="<string>"/>
    type ="<string>"/>
    dateStyle="<string>"/>
    timeStyle="<string>"/>
    pattern="<string>"/>
    timeZone="<string>"/>
    var="<string>"/>
    scope="<string>" />

提示

  • 添加注释快捷键 Ctrl+/

  • 创建jsp页面是在web下,不是在WEB-INF下

  • < br > 换行+"< br >"

  • < pre > 保留格式

  • &nbsp; 空格显示

  • < h1> 这时一个标题,随数字变小,标题字体变小

  • < hr> 分割线

  • < div>是什么

  • < tr>在说明制作表格 之后

  • < th>列,嵌套在< tr>中使用,中间可注明该列的名称,相当于字段名
    在这里插入图片描述

  • < td>嵌套在< tr>表中,相当于行,中间是填写对应的数据,

在这里插入图片描述

<table align="center" width="800" border="1" style="border-collapse: collapse;">
    <tr>
        <th>名称</th>
        <th>当前成员下标</th>
        <th>当前成员循环数</th>
        <th>是否第一次被循环</th>
        <th>是否最后一次被循环</th>
    </tr>
<c:forEach items="${li}" var="item" varStatus="itemp">
    <tr>
        <td>${item}</td>
        <td>${item.index}</td>
        <td>${item.count}</td>
        <td>${item.first}</td>
        <td>${item.last}</td>
    </tr>
    </c:forEach>

在这里插入图片描述

===

  • 不建议使用中文名来命名jsp文件,一旦出现问题会涉及很多配置问题,很难排查

    像下面这样出现问题无法正常访问jsp页面

在这里插入图片描述

  • 新建jsp页面地址附加在默认访问的页面地址后面,访问新建页面
    在这里插入图片描述

  • 在方法爆红时。可能是没有倒入tomcat包

    像这样:

在这里插入图片描述

导包步骤如下:
在这里插入图片描述

${item} ${item.index} ${item.count} ${item.first} ${item.last} ```
  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值