当前位置: 首页 > 工具软件 > JSTL-FN-PRO > 使用案例 >

JavaWeb 第6-7章 深入JSP技术与JSTL标签库

谢叶五
2023-12-01

6.1 JSP简介

 

什么是JSP:

JSP全名为Java Server Page 是为了简化servlet的工作而出现的替代品。
在JSP中java代码与HTML共同存在,其中HTML代码用于展示静态的内容,java代码用来展示动态的内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>home</title>
</head>
<body>
<h2>我是网站的首页,欢迎访问</h2>
</body>
</html>
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "HTMLServlet",urlPatterns = "/html")
public class HTMLServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.write("<!DOCTYPE html>");
        writer.write("<html lang=\"en\">");
        writer.write("<head>");
        writer.write("<meta charset=\"UTF-8\">");
        writer.write("<title>home</title>");
        writer.write("</head>");
        writer.write("<body>");
        writer.write("<h2>网站首页</h2>");
        writer.write("</body>");
        writer.write("</html>");



    }
}

6.2 JSP运行原理

 

jsp在第一次被访问时会被Web容器翻译成servlet,jsp本质上就是Servlet。

过程:
第一次访问----->helloServlet.jsp------>helloServlet_jsp.java------->编译运行
被翻译后的servlet在Tomcat的work目录中可以找到,使用IDEA会单独为项目维护一个目录。
通过观察发现jsp会转化为java文件,并且间接的继承了HttpServlet,实现了其中的主要方法,init、service、destory,并且将html代码通过java方式输出给浏览器。
 

6.3 JSP脚本与注释

 

JSP脚本:

  1. <%java代码%>
  2. <%=java变量或表达式%>
  3. <%!java代码%>

JSP注释:

  1. Html注释:<!--注释内容-->
  2. java注释://单行注释 /*多行注释*/
  3. jsp注释:<%--注释内容--%>

 

6-4 JSP指令

 


jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:

taglib指令:
在jsp页面中引入标签库(jstl标签库,structs2标签库);
格式:<%@ taglb url=“标签库地址” prefix=""%>;
 


page指令-----属性最多的指令(实际开发中page指令默认),属性最多的一个指令,根据不同的属性,指导整个页面特性格式:<%@ page 属性名1=“属性值1” 属性名2=“属性值2”…%>
常用属性如下:
language:jsp脚本可以嵌入的语言种类;
contentType:response.setContentType(text/html.charset=UTF-8);
session:是否jsp在翻译时自动创建session;
import:导入java的包;
errorPage:当当前页面出错后跳转到哪个页面;


include指令:
页面包括(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中;
格式:<%@ include file=“被包含的文件地址”%>;

 

<%@include file="/include.jsp" %>
<%@taglib uri="xxx" prefix="c"%>

 

6-7 JSP九大隐式对象-pageContext

 

1.pageContext对象:

pageContext对象就是jsp页面的上下文对象。

 

2.pageContext是一个域对象:

 

  • setAttribute(String name,Object obj)
  • getAttribute(String name)

 

3.pageContext可以向指定的其他域中存取数据:

setAttribute(String name,Object obj,int scape)
getAttribute(String name,int scape)
removeAttribute(String name,int scape)
findAttribute(String name)//获取顺序依次从pageContext域,request域,session域,application域中获取属性
 

<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    //    pageContext.setAttribute("name","xiaoming");

//    pageContext.setAttribute("name","zhangsan",PageContext.REQUEST_SCOPE);
    pageContext.setAttribute("name","lisi",PageContext.SESSION_SCOPE);
    pageContext.setAttribute("name","wangwu",PageContext.APPLICATION_SCOPE);
%>
<%=pageContext.getAttribute("name",PageContext.REQUEST_SCOPE)%>
<%=pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE)%>

<%=
pageContext.findAttribute("name")
%>

</body>
</html>

 

四大作用域的区别:
page域:当前jsp页面范围。
request域:一次请求。
session域:一次会话。
application域:整个web应用。

 

6-8 JSP标签

 

  • 页面包含(动态包含):<jsp:include page=“被包含的页面”/>
  • 请求转发:<jsp:forward page=“要转发的资源”>

 

7.1 EL表达式获取域中数据

 

EL表达式:
EL 全名为Expression Language,它提供了在JSP中简化表达式的方法,让JSP的代码更加简化,可以嵌入在jsp页面内部,减少jsp脚本的编写

 

EL从域中取数据:
jsp脚本:<%=request.getAttribute(name)%>
EL表达式替代上面的脚本:${requestScope.name}
EL最主要的作用是获得四大域中的数据,格式:
${EL表达式}
EL获得pageContext域中的值:${pageScope.key}

EL获得request域中的值:${requestScope.key}

EL获得session域的值:${sessionScope.key}

EL获得application域中的值:${applicationScope.key}

 

pageContext可以向指定的其他域中存取数据:

setAttribute(String name,Object obj,int scape)
getAttribute(String name,int scape)
removeAttribute(String name,int scape)
findAttribute(String name)//获取顺序依次从pageContext域,request域,session域,application域中获取属性
可以获得其他8大隐式对象:
如:pageContext.getRequest()
pageContext.getSession()
 

7-2 EL的内置对象

 

EL的内置对象:
pageScope,requestScope,sessionScope,applicarionScope-------获取JSP中域中的数据


param,paramValues ----接收参数。相当于request.getParameter() request.getParameterValues()


header.headerValues -----获取请求头信息。 相当于request.getHeader(name)


initParam -----获取全局初始化参数。相当于this.getServletContext().getInitParameter(name)


cookie -----WEB开发中cookie。相当于request.getCookies()---->cookie.getName()------>cookie.getValue()


pageContext —WEB开发中的pageContext。

pageContext获取其他八大对象。
 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--假如http请求中传入了一个username的参数--%>
<%
    request.getParameter("userName");

%>

<%--EL的内置对象--%>
${param.userName}
${header.host}

<%--获取项目路径--%>
${pageContext.request.contextPath}

<%--JSP主要用来展示数据,sevlet主要用来处理数据--%>
</body>
</html>

 

7-3 EL的执行表达式

 

<%--EL表达式从区域中获取数据的方式--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}

${name}
${user.name}
${list[0].name}

<%--EL执行表达式--%>
${1+1}
<%--关系运算--%>
${2>1}
${2 eq 2}
<%--逻辑运算--%>
${2>1 || 3>2}
<%--三元表达式--%>
${3>2 ? true:false}
${3>2 ? "正确":"呜呜"}
<%--判断对象是否为空--%>
${empty name}

 

 

7-4 JSTL的简介与基本配置

JSTL:

JSTL,JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能,jstl出现的目的同EL一样也是要代替jsp页面中的脚本代码,jstl标准标准标签库有5个子库,但随着发展,目前常使用的是它的核心库。

 

 

7-5 JSTL-if标签

 

jstl的标签:
<c:if>标签专门用于完成JSP界面中的条件判断
<c:if test=“表达式”>
//表达式成立执行语句
</c:if>
其中test是返回boolean的条件

FollowServlet:

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;

@WebServlet(name = "FollowServlet",urlPatterns = "/follow")
public class FollowServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String follow=request.getParameter("follow");
            request.setAttribute("follow",follow);
            request.getRequestDispatcher("/jstl/jstl.jsp").forward(request,response);
    }
}

jstl/jstl.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--使用JSTL的时候需要配合EL表达式--%>
<c:if test="${requestScope.follow eq 1}">
   取消关注
    <%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
    关注
    <%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
</body>
</html>

 

7-6 JSTL-forEach标签

JSTL的forEach标签:
<c:forEach>用来循环遍历集合对象中的元素,如List、Map、数组等和java代码中的for循环一样,它也有两种形式

<%@ page import="net_zixue.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--<c:if test="1+1==2">
    表达式成立,执行内部语句
</c:if>--%>
<%--使用JSTL的时候需要配合EL表达式--%>
<%--jstl标签不能独自执行运算--%>
<%--<c:if test="${1+1==2}">
    表达式成立,执行内部语句
</c:if>--%>
<c:if test="${requestScope.follow eq 1}">
<%--    字符串等于用eq--%>
<%--    没有else标签--%>
    取消关注
    <%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
    关注
    <%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>


<%
    List<User> list=new ArrayList<>();
    User user1=new User();
    user1.setName("小强");
    user1.setSex("男");
    User user2=new User();
    user2.setName("小丽");
    user2.setSex("女");

    list.add(user1);
    list.add(user2);
//    第一种遍历输出
    for (int i = 0; i < list.size(); i++) {
        System.out.println(i);
    }
    request.setAttribute("list",list);//把list加入到一个域对象里

    for (User user : list) {
        System.out.println(user.getName());
    }

%>
<%--var变量的意思--%>
<c:forEach begin="0" end="${list.size()-1}" var="i">
    <%--    el表达式--%>
    ${list[i].name}

</c:forEach>

<%--items代表的是一个集合或者是数组--%>
<%--var代表集合里面的每一个元素--%>
<c:forEach items="${list}" var="user">
    ${user.name}
</c:forEach>


</body>
</html>

 

 

 

 

7-7 案例:实现商品列表展示

PhoneListServlet:

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(name = "PhoneListServlet",urlPatterns = "/phonelist")
public class PhoneListServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过servlet从数据库中获取数据,我们这里暂时通过手动创建数据
        Phone phone=new Phone();//鼠标放在Phone上Alt+Enter快捷键建立Phone类
        phone.setName("iphone6");
        phone.setId(001);
        phone.setImage("https://img10.360buyimg.com/n7/jfs/t277/193/1005339798/768456/29136988/542d0798N19d42ce3.jpg");
        phone.setPrice("3900");

        Phone phone1=new Phone();
        phone1.setName("坚果pro");
        phone1.setId(002);
        phone1.setPrice("1799");
        phone1.setImage("https://img13.360buyimg.com/n7/jfs/t5377/56/1578379545/209772/32105f74/5911bcbdN7afa707b.jpg");

        Phone phone2=new Phone();
        phone2.setName("vivo x9");
        phone2.setPrice("2345");
        phone2.setId(003);
        phone2.setImage("https://img12.360buyimg.com/n7/jfs/t6067/340/2101390376/231820/750cc50e/593aa83fN8b0829fc.jpg");

        Phone phone3=new Phone();
        phone3.setName("oppo A57");
        phone3.setId(004);
        phone3.setPrice("1399");
        phone3.setImage("https://img10.360buyimg.com/n7/jfs/t4978/185/135948089/78285/f6a84203/58db6fa4N354322d9.jpg");

        Phone phone4=new Phone();
        phone4.setName("诺基亚6");
        phone4.setId(005);
        phone4.setPrice("1699");
        phone4.setImage("https://img11.360buyimg.com/n7/jfs/t4930/86/192598423/86027/36a57ccf/58dcbfa5N5c41cbfd.jpg");

        Phone phone5=new Phone();
        phone5.setName("小米MIX");
        phone5.setId(006);
        phone5.setPrice("3999");
        phone5.setImage("https://img13.360buyimg.com/n7/jfs/t4264/215/455518113/309855/38fe41f1/58b4fc81N1d924112.jpg");

        List<Phone> list=new ArrayList<>();
        list.add(phone);
        list.add(phone1);
        list.add(phone2);
        list.add(phone3);
        list.add(phone4);
        list.add(phone5);

        request.setAttribute("list",list);

        request.getRequestDispatcher("/phone_list.jsp").forward(request,response);
    }
}

Phone.java:

public class Phone {
    private int id;
    private  String name;
    private String image;
    private String price;
    //Art+Ins快捷键加入get,set方法
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }
}

 

phone_list.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>商品列表</title>

</head>
<body>
        <c:forEach items="${list}" var="phone">
                        <div class="col-md-2" style="height:250px">
                            <img src="${phone.image}" width="170" height="170" style="display: inline-block;">
                            </a>
                            <p>
                                <a href="product_info.html" style='color: green'>${phone.name}</a>
                            </p>
                            <p>
                                <font color="#FF0000">商城价:&yen;${phone.price}</font>
                            </p>
          </c:forEach>
</div>
</body>
</html>

 

 类似资料: