关于JSP(Java Server Pages)

1.什么是JSP?

JSP是Sun 公司指定的一种服务器端动态页面技术的组件规范,Jsp是以“.jsp”为后缀的文件。重点是呈现,也就是前端处理,所以可以理解为在HTML中的JAVA代码,实现动态页面处理。(刚好与Servlet相反,Servlet可以理解为在JAVA代码中写HTML,注重的是业务逻辑)

2.JSP和Servlet的区别

☆JSP 以源文件形式部署到容器中。而 Servlet 需要编译成 class 文件后部署到容器中。

☆JSP 部署到 web 项目的根目录下或根目录下的其他子目录和静态同资源位于相同位置。 而 Servlet 需要部署到 WEB-INF/classes 目录中。

☆JSP 中的 HTML 代码会被 JSP 引擎放入到 Servlet 的 out.write()方法中。而在 Servlet 中我们需要自己通过对字符流输出流的操作生成响应的页面。

☆JSP 更擅长表现于页面显示,Servlet 更擅长于逻辑控制。

3.JSP的内置对象

JSP的内置对象说明
requestHttpServletRequest类型的对象
responseHttpServletResponse类型的对象
sessionHttpSession类型的对象(只有在包含session = "true"的页面中才可以被使用,解释这句话:因为session创建时候有true和false 系统默认设置为true 就是当你页面没有session对象时自动生成一个session对象,如果设置了false那么就算没有也不会自动生成,页面就没有session对象,当然就获取不到session了)
application

ServletContext类型的对象

outJspWriter类型对象
configServeltConfig类型对象
pageContextPageContext类型对象,通过这个对象可以获取jsp中别的对象(request,session等),可以直接使用。(上下文对象)
pageJSP本身
exception错误对象,当程序错了的时候显示异常信息,只有包含在 isErrorPage= "true" 的页面中才可以被使用

4.JSP的四大作用域对象

作用域:“数据共享的范围”,也就是说数据能够在多大的范围内有效。
对象名称作用范围(根据3中说明的对象类型理解)
application整个应用都有效
session当前会话(当客户端)有效
request当前请求中有效
page当前页面有效

5.请求转发

这里先提一个概念 请求转发 为什么要这个呢,因为一个项目由大大小小的组件共同完成,其中有涉及MVC模式(可以简单理解为术业有专攻),JSP擅长页面处理,Servlet擅长业务逻辑,那么先在Servlet中处理属性,然后再放到JSP中继续别的处理。

        request.getRequestDispatcher("/test.jsp").forword(request,response);

6.JSP的使用

6.1JSP的三种原始标签

<%! %> 声明标签

        声明标签用于在 JSP 中定义成员变量与方法的定义。标签中的内容会出现在 JSP 被编译 后的 Servlet 的 class 的{}中。

<% %>  脚本标签

        脚本标签用于在 JSP 中编写业务逻辑。标签中的内容会出现在 JSP 被编译后的 Servlet 的_jspService 方法体中。

<%= %>赋值标签

        赋值标签用于在 JSP 中做内容输出。标签中的内容会出现在_jspService 方法的 out.print() 方法的参数中。注意我们在使用赋值标签时不需要在代码中添加 “;”。

6.2JSP的指令标签

JSP指令标签的作用是声明JSP页面的一些属性动作

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

指令:page(只要声明JSP页面的一些属性)  include(静态包含)  taglib(导入标签库)

每个指令标签都有不同的属性和动作,因为很多不常用,就不罗列了

eg. 用idea创建一个jsp文件时,它会在开头自动生成一段代码 如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

        这就是page中的contentType(设置响应类型和编码),language(当前JSP可以嵌套的语言)属性。

6.3JSTL标签库

        JSTL(Java server pages standarded tag library,即 JSP 标准标签库)JSTL 标签是基于 JSP 页面的。这些标签可以插入在 JSP 代码中,本质上 JSTL 也是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用标签时,就等于调用了封装起来的功能。JSTL 的目标是 使 JSP 页面的可读性更强、简化 JSP 页面的设计、实现了代码复用、提高效率。 在 JSP2.0 版本后开始支持 JSTL 标签库。在使用 JSTL 标签库时需要在 JSP 中添加对应的 taglib 指令标签。

核心标签

                        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
这个标签库需要到官网下载,我就不介绍了,下载完记得IDEA也要配置约束文件。参考文章
Ctrl+Shift+Alt+s打开项目结构

 

 找到这两个包选中导入,然后

在setting中设置配置文件

 

URI填的是http://java.sun.com/jsp/jstl/core

File选择包中的c.tld

 

然后再jsp文件中添加

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
就可以用标签库中c标签了(核心标签)

格式化标签

JSTL 格式化标签用来格式化并输出文本、日期、时间、数字。
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

SQL标签

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

XML标签

<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

JSTL函数

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

 7.EL表达式

7.1 什么是EL表达式      

         EL(Expression Language)是一种表达式语言。是为了使 JSP 写起来更加简单,减少 java 代码,可以使得获取存储在 Java 对象中的数据变得非常简单。在 JSP2.0 版本后开始支持 EL 表达式。

7.2 语法结构

${ 表达式 }
${ 对象 . 属性名 }

7.3 表达式操作符

7.4 表达式隐含对象

 

使用EL表达式取出作用域中的值

${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}

 

获取作用域中的数据时,也可以只写属性名,EL表达式会根据作用域从小到大的顺序查找该属性的值。

${name}

 7.5 标签使用示例

7.5.1核心库标签

<%--
  Created by IntelliJ IDEA.
  User: ShadoweI
  Date: 2021/12/7
  Time: 17:44
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:if test="true">
    执行力
</c:if>

<%--从上到下获取 获取到 true 就输出 下面的不会再输出 如果没有符合的 输出otherwise--%>
<c:choose>
    <c:when test="${1==1}">
        执行了when1
    </c:when>
    <c:when test="${1==1}">
        执行了when2
    </c:when>
    <c:otherwise>
        执行了otherwise
    </c:otherwise>
</c:choose>
<hr/>
    <c:forEach begin="0" end="10" step="2" varStatus="var">
<%--        current 返回迭代因子 这里是循环的数字 以后集合中就是输出当前数字下标的元素 吧--%>
        Foreach....${var.begin},${var.first},${var.last},${var.current}<br/>
<%--        Foreach....0,true,false,0
Foreach....0,false,false,2
Foreach....0,false,false,4
Foreach....0,false,false,6
Foreach....0,false,false,8
Foreach....0,false,true,10--%>
    </c:forEach>
</body>
</html>

格式化标签

①Servlet

@WebServlet("/format.do")
public class formatServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("date",new Date());
        req.setAttribute("number",2323565.23);
        req.getRequestDispatcher("format.jsp").forward(req,resp);
    }
}

②jsp

<%--
  Created by IntelliJ IDEA.
  User: ShadoweI
  Date: 2021/12/9
  Time: 21:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd"/>
<%--  货币符号根据当前浏览器的语言选择  会四舍五入--%>
  <fmt:formatNumber value="${requestScope.number}" type="currency"/>
</body>
</html>

test:

 

8.使用Foreach迭代map

需求:

创建Users对象,含有 userid,username属性。

创建一个Servlet,在Servlet中创建多个Users对象放到Map集合中,在jsp文件的页面中显示所有的USers对象的信息。

User类:

package javaClass;

public class User {
    private int userid;
    private String username;

    public User() {
    }

    public User(int userid, String username) {
        this.userid = userid;
        this.username = username;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getUserid() {
        return userid;
    }

    public String getUsername() {
        return username;
    }
}

 Servlet:

@WebServlet("/findUsers2.do")
public class findUsersServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String, User> map = new HashMap<>();
        User user1 = new User(1,"xdw");
        User user2 = new User(2,"edg");
        User user3 = new User(3,"fpx");
        map.put("key1",user1);
        map.put("key2",user2);
        map.put("key3",user3);
        req.setAttribute("map",map);
        req.getRequestDispatcher("showUsers2.jsp").forward(req,resp);
    }
}

JSP:

<%--
  Created by IntelliJ IDEA.
  User: ShadoweI
  Date: 2021/12/9
  Time: 21:13
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <table border="1" align="center">
        <tr>
            <th>KEY</th>
            <th>用户ID</th>
            <th>用户名</th>
        </tr>
        <c:forEach items="${requestScope.map}" var="map">
        <tr>
            <td>${map.key}</td>
            <td>${map.value.userid}</td>
            <td>${map.value.username}</td>
        </tr>
        </c:forEach>
</body>
</html>

启动Tomcat 运行

结果:

9.MVC模式

User类,Servlet,Jsp 这三个就是典型的MVC模式:

        MVC 模式:Model、View、Controller 即模型、视图、控制器。是软件的一种架构模式 (Architecture pattern)。MVC 要实现的目标是将软件的用户界面和业务逻辑分离,可提高 代码可扩展性、可复用性、可维护性、以及灵活性。 View(视图):用户的操作界面。如:html、jsp。 Model(模型):具体的业务模型与数据模型。如:service、dao、pojo。 Controller(控制):处理从视图层发送的请求,并选取模型层的业务模型完成响应的业务 实现,并产生响应。如:Servlet 。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值