JavaWeb学习笔记——JSP

JSP (Java Server Pages)

JSP全称Java Server Pages(Java服务器页面),是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束

JSP可以理解为一个特殊的页面,其中可以定义HTML标签和Java代码,用于简化书写

JSP原理

  1. 服务器解析请求消息,寻找是否存在index.jsp资源
  2. 如果寻找到index.jsp,会将index.jsp转换为.java文件
  3. 编译.java文件并生成.class字节码文件
  4. 最后由字节码文件提供访问

JSP本质上是一个Servlet

JSP脚本

JSP用来定义Java代码的方式

① <% Java代码 %>:定义的Java代码在service方法中,service方法中可以定义的内容均可以在这里定义

② <%! Java代码 %>:定义的Java代码在JSP装换的Java类中的成员位置,可以定义成员变量,成员方法等

③ <%= Java代码 %>:定义的Java代码会输出到页面上,可以定义输出语句内的内容

JSP内置对象

在JSP页面中不需要创建获取,可以直接使用的对象

变量名真实类型作用
requestHttpServletRequest请求对象
responseHttpServletResponse响应对象
outJspWriter输出流对象,与response.getWriter()相似
pageContextpageContext当前页面共享数据,还可以获取其他8个内置对象
sessionHttpSession一次会话的多个请求件共享数据
applicationServletContext所有用户之间共享数据
pageObject当前页面对象
configServletConfigServlet的配置对象
exceptionThrowable异常对象
response.getWriter() 和 out 的区别
<body>
  <%
    response.getWriter().write("this is response");
  %>
  <%
    out.print("this is out");
  %>
</body>

以上代码定义了两个JSP脚本用来输出内容到页面,正常情况下,程序应当按照顺序执行,即先执行response输出再执行out输出,输出结果也证明了这一点

如果我们将两个脚本换一下位置

<body>
  <%
    out.print("this is out");
  %>
  <%
    response.getWriter().write("this is response1");
  %>
</body>

这时按照正常思路,应当先执行out输出,再执行response输出,然而输出结果却依然是先执行了response输出

这是因为在tomcat服务器给客户端做出响应之前,会先从response缓冲区中寻找数据,再去out缓冲区中寻找数据,所以response.getWriter()的输出永远在out之前

JSP指令

用于配置JSP页面,导入资源文件

JSP指令格式

<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 %>

多个属性之间用空格隔开

JSP指令分类
include:导入页面的资源文件
属性

· file:要导入的页面资源文件

page:配置JSP页面
属性

① contentType:等同于response.setContentType(),可以设置响应体的MIME类型以及字符集,和当前JSP页面的编码(仅限高级IDE)

② pageEncoding:设置当前JSP页面的编码

③ buffer:设置缓冲区大小

④ import:导入包

⑤ errorPage:当前页面发生异常后会自动跳转到指定的错误页面

⑥ isErrorPage:标识当前页面是否为错误页面,默认为false若标注当前页面为错误页面,则可以使用内置对象exception

taglib:导入资源

① prefix:自定义前缀

② uri:导入资源的位置

JSP注释

HTML注释
<!-- -->

HTML注释只能注释HTML代码片段

JSP注释

<%-- --%>

可以注释所有内容

MVC开发模式

M:Model,即模型,用来完成具体的业务操作 ——JavaBean

V:View,即视图,用来展示数据——JSP

C:Controller,即控制器,用来获取请求参数,调用模型,将数据交给视图来展示——Servlet

EL表达式

Expression Language 表达式语言,可以替换和简化JSP中Java代码的书写

EL表达式语法

${ 表达式 }

JSP中是默认支持EL表达式的,如果不希望JSP解析EL表达式,可以使用两种方法

  1. 设置page指令中的isElIgnoredtrue,设置之后JSP中的所有EL表达式都会被忽略
  2. 在EL表达式之前添加\ ——\${}可以忽略单个EL表达式
EL运算符
算数运算符
运算符描述
+加法
-减法
*乘法
/ (div)除法
% (mod)取余
<body>
<h4>算数运算符</h4>
${1 + 1}<br>
${2 - 1}<br>
${4 / 2}<span>等同于</span>${4 div 2}<br>
${5 % 3}<span>等同于</span>${5 mod 3}<br>
</body>

显示结果为

算数运算符
2
1
2.0等同于2.0
2等同于2
比较运算符
运算符描述
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于
<body>
<h4>比较运算符</h4>
${1 > 2}<br>
${3 < 5}<br>
${3 == 3}<br>
${3 != 3}<br>
</body>

显示结果为

比较运算符
false
true
true
false
逻辑运算符
运算符描述
&& (and)与运算
|| (or)或运算
! (not)
<body>
<h4>逻辑运算符</h4>
${true && false}<span>等同于</span>${true and false}<br>
${true || false}<span>等同于</span>${true or false}<br>
${!true}<span>等同于</span>${not true}<br>
</body>

显示结果为

逻辑运算符
false等同于false
true等同于true
false等同于false
空运算符
运算符描述
empty判断字符串,集合,数组的对象是否为null、长度是否为0
<body>
    <%
        List list = new ArrayList();
        String str = "123";
        request.setAttribute("List",list);
        request.setAttribute("String",str);
    %>
    ${empty List}
    ${empty String}
</body>

显示结果为

true false
EL获取域中的值

EL表达式只能从域对象中获取值

EL取值语法
  1. ${域名称.键名} 从指定的域中获取指定键的值
域名称获取值的对象
pageScopepageContext
requestScoperequest
sessionScopesession
applicationScopeapplication(ServletContext)
<body>
    <%
        // 存储数据
        request.setAttribute("request","msgR");
        session.setAttribute("session","msgS");
        pageContext.setAttribute("page","msgP");
        application.setAttribute("application","msgA");
    %>
    <p>获取值</p>
    ${requestScope.request}
    ${sessionScope.session}
    ${pageScope.page}
    ${applicationScope.application}
</body>

显示结果

获取值
msgR msgS msgP msgA 
  1. ${键名}

在这中写法下,会从最小域开始依次寻找指定键名的对应值,直到寻找到为止

<body>
    <%
        // 存储数据
        request.setAttribute("request","msgR");
        session.setAttribute("msg","msgS");
        pageContext.setAttribute("msg","msgP");
        application.setAttribute("application","msgA");
    %>
    <p>获取值</p>
    ${msg}
</body>

显示结果

获取值
msgP 

由于pageContext域对象的范围要小于session,所以当找到ageContext中的对应值后即会输出,若希望使用session中的对应值,则需要添加域名称

EL获取对象值

${域名称.键名.属性名}

本质上会调用对象对应属性的getter方法

示例代码

<body>
    <%
        Person p = new Person();
        p.setName("Person");
        p.setAge(20);
        p.setSex("M");

        request.setAttribute("Person",p);
    %>
    <p>获取对象值</p>
    ${requestScope.Person}
</body>

若直接获取对象,则会将对象的地址值输出出来

获取对象值

domain.Person@13adae1

若希望获取对象的详细值,则需要通过对象的属性来获取

对象的属性指的是,在gettersetter中,去掉getset,然后将剩下的内容首字母变小写,得到的内容则为对象的属性

在示例代码中,Person类存在一个setName()方法,以此为例

方法名去掉get或set属性名
setNameNamename

即Person类存在一个属性为name,可以通过这个属性来获取Person的name值

${requestScope.Person.name}

输出结果为

获取对象值

Person
EL获取List中的值

${域名称.键名[索引]}

<body>
    <%
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");

        request.setAttribute("List",list);
    %>
    <p>获取List值</p>
    ${requestScope.List}
</body>

若直接获取List,则会输出List的所有内容

获取List值

[a, b, c]

通过添加索引可以获取List中指定的内容

${requestScope.List[0]}
获取List值

a

如果出现下标越界的情况,EL表达式会直接输出空字符串而不会报错

若List中存储了一个对象,通过索引和属性也可以输出对象的具体属性值

<body>
    <%
        Person p = new Person();
        p.setName("P");
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add(p);

        request.setAttribute("List",list);
    %>
    <p>获取List值</p>
    ${requestScope.List[3].name}
</body>

输出结果为

获取List值

P
EL获取Map中的值

${域名称.键名.key}

${域名称.键名[“key”]}

<body>
    <%
        Map map = new HashMap();
        map.put("name","name");
        map.put("age",20);

        request.setAttribute("Map",map);
    %>
    <p>获取Map值</p>
    ${requestScope.Map.name}
    ${requestScope.Map["age"]}
</body>

输出结果为

获取Map值

name 20

同样的,如果Map中也存放了对象,同样可以使用key和属性名来获取对象的属性值

JSTL

JavaServer Page Tag Library JSP标准标签库

由Apache提供的开源JSP标签,用于简化和替换JSP中的Java代码

步骤
  1. 导入JSTL jar包
  2. 使用taglib指令引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  1. 使用标签
常用的JSTL标签
① if

相当于Java中的if语句

属性

test:必须属性,接受boolean表达式,如果表达式为true则显示内容,为false则不显示内容

<body>
    <c:if test="true">
        显示内容
    </c:if>
    <c:if test="false">
        不显示内容
    </c:if>
</body>

一般情况下,test的属性值会结合EL表达式一起使用

② choose

相当于Java中的switch语句

相关标签

① when :相当于case

② otherwise:相当于default

<body>
    <%
        request.setAttribute("num",5);
    %>
    <c:choose>
        <c:when test="${num == 3}">3</c:when>
        <c:otherwise>other</c:otherwise>
    </c:choose>
</body>

输出结果为 other

③ foreach

相当于Java中的 for语句

属性

begin:起始值

end:结束值

var:临时变量

step:步长

varStatus:循环状态对象,存在属性index—索引,count—循环次数

iteam:容器对象

作用
  1. 完成重复操作,如
for(int i = 1; i <= 5; i++){
    System.out.print("1");
}

JSTL实现

<body>
    <c:forEach begin="1" end="5" var="i" step="1">
        1
    </c:forEach>
</body>
  1. 遍历,如
for(int i : array){
    System.out.print(i);
}

JSTL实现

<body>
    <%
        int[] array = {1,2,3,4,5};
        request.setAttribute("array",array);
    %>
    <c:forEach items="${array}" var="i">
        ${i}
    </c:forEach>
</body>

三层架构

三层架构是一种软件设计架构,为了符合“高内聚,低耦合”思想

界面层(表示层 / web层)

用户看到的界面,用户可以通过界面上的组件和服务器进行交互,接受用户参数,封装数据,调用业务逻辑层

业务逻辑层(service层)

用来处理业务逻辑,组合DAO层中的简单方法,形成复杂功能(业务逻辑操作)

数据访问层(操作层 / DAO层)

用来操作数据,存储文件,只定义了对于数据库最基本的CRUD操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值