jsp技术知识点

本文详细介绍了JSP技术,包括JSP的三种原始标签(声明、脚本、赋值),指令标签如page指令的属性,内置对象的使用,请求转发的概念及区别,JSTL标签库的分类和应用,以及EL表达式的操作符和隐含对象。此外,还探讨了MVC模式,并提供了多个实战案例。
摘要由CSDN通过智能技术生成

什么是jsp

以 JSP 就是 HTML 与 Java 代码的复合体。JSP 技术可以快速的实现一个页面的开发,相比在 Servlet 中实现页面开 发将变得更加容易。

创建一个jsp项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加对应的jar包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样,一个项目创建完毕

jsp的三种原始标签

jsp的原始标签在任何版本内都可以使用

1.<%! %> 声明标签

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <%!
      int i = 10;
      int add(int a,int b){
        return a+b;
      }
    %>
    Welcome JSP
  </body>
</html>

再配置一下tomcat
在这里插入图片描述
运行:
在这里插入图片描述
我们查看jsp被编译后的Servlet的class的{}内容
在这里插入图片描述

2.<% %>脚本标签

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

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/24 0024
  Time: 17:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%!
    int i = 10;
    int add(int a,int b){
      return a+b;
    }
  %>
  <%
    int c = 20+10;
  %>
  Welcome JSP
  </body>
</html>

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

3.3<%= %>赋值标签

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

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/24 0024
  Time: 17:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%!
    int i = 10;
    int add(int a,int b){
      return a+b;
    }
  %>
  <%
    int c = 20+10;
  %>
  <%= i%>
  <%= c%>
  Welcome JSP
  </body>
</html>

在这里插入图片描述

4.JSP 原始标签的使用

实例:删除一个100以内的随机数,以20%的概率显示你中奖了

<%@ page import="java.util.Random" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%
    int flag = new Random().nextInt(100);
    if(flag <= 20){
  %>
  中奖了 <%=flag %>
  <% }else{%>
  没中奖 <%=flag %>
  <%}%>
  </body>
</html>

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

jsp的指令标签

JSP 指令标签的作用是声明 JSP 页面的一些属性和动作。
格式:
<%@指令名称 属性=“值” 属性=“值”%>

jsp的指令标签分类:

jsp指令标签分类

page:主要声明jsp页面的一些属性
include:静态包含
taglib:导入标签库

page指令标签

1.1 contentType 设置响应类型和编码。
1.2 pageEncoding 设置页面的编码。
1.3 import 导入所需要的包。
1.4 language 当前 JSP 页面里面可以嵌套的语言。
1.5 session 设置 JSP 页面是否获取 session 内置对象。
1.6 buffer 设置 JSP 页面的流的缓冲区的大小。
1.7 autoFlush 是否自动刷新。
1.8 extends 声明当前 JSP 的页面继承于那个类.必须继承的是 httpservlet 及其子类。
1.9 isELIgnored 是否忽略 el 表达式。
1.10 errorPage 当前 JSP 页面出现异常的时候要跳转到的 JSP 页面。
1.11 isErrorPage 当前 JSP 页面是否是一个错误页面。若值为 true,可以使用 JSP 页面的一个内置对象 exception。

jsp的内置对象

JSP 中一共预先定义了 9 个这样的对象,分别为:request、response、session、application、 out、pagecontext、config、page、exception。

请求转发

什么是请求转发

请求转发是服务端的一种请求方式,相当于在服务端中直接请求某个资源。
简写方式:
request.getRequestDispatcher("/test.jsp").forword(request,response);
在这里插入图片描述

请求转发和重定向的区别

  • 请求转发对于客户端浏览器而言是在一次请求与响应中完成,而重定向是在两次请求两次响应中完成
  • 请求转发并不会改变客户端浏览器的地址栏中的内容。而重定向会改变客户端浏览器地 址栏中的内容。
  • 请求转发可以使用 request 对象传递数据,而重定向不能使用 request 对象传递数据。
  • 如果是处理的 DML 操作,建议使用重定向方式为客户端浏览器产生响应,可以解决表 单重复提交现象。

请求转发的案例

需求:在 Servlet 中获取客户端浏览器所支持的语言,并通过 JSP 页面将客户端浏览器 所支持的语言响应给客户端浏览器。

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 需求:在 Servlet 中获取客户端浏览器所支持的语言,
 * 并通过 JSP 页面将客户端浏览器 所支持的语言响应给客户端浏览器
 */
@WebServlet("/language.do")
public class LanguageServlet 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 {
       String header =  req.getHeader("Accept-Language");

       req.setAttribute("key",header);

       req.getRequestDispatcher("showMsg.jsp").forward(req,resp);
    }
}

我们创建一个jsp页面,用于显示获取到的信息

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/25 0025
  Time: 14:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--从request对象内获取数据,并在这里接收--%>
    <%
       String value = (String)request.getAttribute("key");
    %>
    <%--在浏览器端响应--%>
    当前支持的语言为:<%= value%>
</body>
</html>

在谷歌浏览器内,启动:
在这里插入图片描述
获取到当前浏览器客户端支持的语言

JSP 中的四大作用域对象

作用域:“数据共享的范围”,也就是说数据能够在多大的范围内有效
(排序方式按作用范围从大到小排列的)
在这里插入图片描述

JSTL标签库

什么是JSTL标签库

JSTL 标签是基于 JSP 页面的。这些标签可以插入在 JSP 代码中,本质上 JSTL 也是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用标签时,就等于调用了封装起来的功能。JSTL 的目标是 使 JSP 页面的可读性更强、简化 JSP 页面的设计、实现了代码复用、提高效率。

在使用 JSTL 标签库时需要在 JSP 中添加对应的 taglib 指令标签。
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

JSTL 标签分类

核心标签

最常用、最重要,也是最基本的标签

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

在这里插入图片描述

格式化标签

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 标签

创建和操作 XML 文档的标签

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

在这里插入图片描述

JSTL 函数

JSTL 包含一系列标准函数,大部分是通用的字符串处理函数

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

在这里插入图片描述

EL表达式

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

语法结构

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

EL 表达式中的操作符

在这里插入图片描述

EL 表达式的隐含对象

在这里插入图片描述

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

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

获取作用域属性中的数据时,也可以只写属性名,EL 表达式会按照 pageScope、 requestScope、sessionScope、applicationScope 的顺序查找该属性的值。
${name}

JSTL标签库和EL表达式的使用

JSTL标签库的使用步骤

添加 jstl.jar 与 standard.jar。
在 Idea 中添加 JSTL 标签的约束文件(DTD)。
在 JSP 页面中添加 taglib 指令标签。

1. 导入jar包

我们选中jar包
在这里插入图片描述
在这里插入图片描述
这里添加到jstl包下
在这里插入图片描述
之后点击apply,还需要查看Artifacts内的
在这里插入图片描述
这里的Available Elements下有没有jstl存在
有的话,右击选中
在这里插入图片描述
这样,jstl jar包就会被放到项目内

在这里插入图片描述

2. 在idea内添加JSTL镖旗的约束文件(DTD)

我们添加一个c标签的约束文件
c标签的url为 http://java.sun.com/jsp/jstl/core
在这里插入图片描述

在 JSP 页面中添加 taglib 指令标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入c标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:if test="true">
        执行了
    </c:if>
</body>
</html>

在这里插入图片描述
同时,我们也可以使用EL表达式去进行判断


<body>
    <c:if test="${1==1}">
        执行了
    </c:if>
</body>

在这里插入图片描述

c标签的choose标签的使用

除了上面的c标签使用
我们还可以进行判断


<body>
    <c:if test="${1==1}">
        执行了
    </c:if>

    <c:choose>
        <c:when test="${1==1}">
            when执行
        </c:when>
        <c:otherwise>
            otherwise执行
        </c:otherwise>
    </c:choose>
</body>

在这里插入图片描述

<c:forEach>的使用

迭代器,用于迭代集合
在这里插入图片描述
varStatus 属性
current: 当前这次迭代的(集合中的)项
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: 用来表明当前这轮迭代是否为第一次迭代的标志
last: 用来表明当前这轮迭代是否为最后一次迭代的标志
begin: 属性值
end: 属性值
step: 属性值

实例:

<body>
    <c:forEach begin="0" end="9">
        ForEEach...<br/>
    </c:forEach>
</body>

在这里插入图片描述


<body>
    <c:forEach begin="0" end="9" step="3" varStatus="var">
        ForEEach...${var.count},${var.first},${var.last},${var.current}<br/>
    </c:forEach>
</body>

在这里插入图片描述

如何使用ForEach迭代List

需求:
创建Users对象,含有userid,uaername属性
床架一个Servlet,在Servlet创建多个User对象并放到List集合内,在showUsers.jsp的页面内显示所有的Users对象的信息

创建一个user.java

package pojo;

public class Users{
    private Integer userid;

    //一个有参的构造方法
    public Users(Integer userid, String username) {
        this.userid = userid;
        this.username = username;
    }

    public Users() {
        super();
    }


    @Override
    public String toString() {
        return "Users{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                '}';
    }

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

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

    private String username;

    public Integer getUserid() {
        return userid;
    }

    public String getUsername() {
        return username;
    }


}

创建一个servlet

package servlet;

import pojo.Users;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/findUser.do")
public class FindUsersServlet 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 {
        List<Users> list = new ArrayList<>();
        Users users1 = new Users(1,"Oldlu");
        Users users2 = new Users(2,"Kevin");
        list.add(users1);
        list.add(users2);
        req.setAttribute("list",list);
        req.getRequestDispatcher("showUsers.jsp").forward(req,resp);
    }
}

创建一个jsp页面

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/25 0025
  Time: 22:34
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%--导入c标签库--%>
<%@ 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>用户id</th>
            <th>用户名</th>
        </tr>
        <%--<c:forEach items="${list}">--%>
        <c:forEach items="${requestScope.list}" var="user">
            <tr>
                <td>${user.userid}</td>
                <td>${user.username}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

在这里插入图片描述

使用 ForEach 迭代 Map

需求:
创建 Users 对象,含有 userid,username 属性。
创建一个 Servlet,在 Servlet 中创建多个 Users 对象并放到 Map 集合中,在 showUsers2.jsp 的页面中显示所有的 Users 对象的信息。

Users对象的创建,参考上面的user类

创建一个 Servlet:

package servlet;

import pojo.Users;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/findUser2.do")
public class FindUsers2Servlet 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, Users> map = new HashMap<>();
        Users users1 = new Users(1,"Oldlu2");
        Users users2 = new Users(2,"Kevin2");
        //将两个users对象放入到map内
        map.put("users1",users1);
        map.put("users2",users2);
        //将map对象放到req对象内,通过请求转发的方式跳转到jsp页面
        req.setAttribute("map",map);
        req.getRequestDispatcher("showUsers2.jsp").forward(req,resp);
    }
}

在 showUsers2.jsp 的页面中显示所有的 Users 对象的信息

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/25 0025
  Time: 22:34
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%--导入c标签库--%>
<%@ 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>map的key</th>
            <th>用户id</th>
            <th>用户名</th>
        </tr>
        <%--<c:forEach items="${list}">--%>
        <c:forEach items="${map}" var="map">
            <tr>
                <td>${map.key}</td>
                <td>${map.value.userid}</td>
                <td>${map.value.username}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

在这里插入图片描述

JSTL 格式化标签的使用

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

对日期的格式化处理

<fmt:formatDate value="${data}" pattern="yyyy-MM-dd"/>

对数字的格式化处理

<fmt:formatNumber value="${balance}" type="currency"/>

不进行格式化处理,输出的样式是:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

/**
 * 先产生一个系统当前时间,然后将其放到request对象,
 * 通过请求转发的方式,将其转发到一个名为format.jsp的页面内
 * 在这个页面内,我们对这个日期进行一个格式化处理
 *
 */
@WebServlet("/format.do")
public class FormatServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("date",new Date());
        //做一个页面的请求转发
        req.getRequestDispatcher("format.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/26 0026
  Time: 16:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入JSTL 格式化标签--%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   ${date}
</body>
</html>

在这里插入图片描述
对日期的格式化处理:


<body>
    <fmt:formatDate value="${date}" pattern="yyyy-MM-dd"/>
</body>

在这里插入图片描述
对数字的格式化处理:


    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("date",new Date());
        //对数字进行格式化
        req.setAttribute("balance",2334233.323);
        //做一个页面的请求转发
        req.getRequestDispatcher("format.jsp").forward(req,resp);
    }
<body>
    <fmt:formatDate value="${date}" pattern="yyyy-MM-dd"/>
    <%--currency:货币类型 currencySymbol:货币符号(默认¥)--%>
    <fmt:formatNumber value="${balance}" type="currency" currencySymbol="$"/>
</body>

在这里插入图片描述

MVC 模式

什么是 MVC 模式

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

实例

https://www.runoob.com/design-pattern/mvc-pattern.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值