blog
原创

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页面中不需要创建获取,可以直接使用的对象

变量名 真实类型 作用
request HttpServletRequest 请求对象
response HttpServletResponse 响应对象
out JspWriter 输出流对象,与response.getWriter()相似
pageContext pageContext 当前页面共享数据,还可以获取其他8个内置对象
session HttpSession 一次会话的多个请求件共享数据
application ServletContext 所有用户之间共享数据
page Object 当前页面对象
config ServletConfig Servlet的配置对象
exception Throwable 异常对象

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. ${域名称.键名} 从指定的域中获取指定键的值
域名称 获取值的对象
pageScope pageContext
requestScope request
sessionScope session
applicationScope application(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 属性名
setName Name name

即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操作

Java Web
  • 作者:Melonico
  • 发表时间:2021-03-15 17:54
  • 更新时间:2021-03-15 17:54

评论

暂无评论,快来发表第一个评论吧!
留言
TOP