JSP

介绍

  • jsp(java server page):java服务器端页面(一个特殊的页面)
  • jsp基于BS架构
  • 我们开发的软件是服务端,用的是Tomcat服务器
  • 宏观理解:在HTML中嵌套java代码<%内容%>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  </body><p>你好jsp</p>
  <%
    System.out.println("你好,jsp。我是hello world");
  %>
</html>

内置对象

JSP含有9中内置对象

image-20211224203540187

EL表达式

概念:

Expression Language 表达式语言

作用:

替换和简化jsp页面中java代码的编写

语法:

${表达式}

注意:

jsp默认支持el表达式的。如果要忽略el表达式

  1. 设置jsp中page指令中 : isELIgnored="true"忽略当前jsp页面中所有的el表达式

  2. \ ${表达式} : 忽略当前这个el表达式

image-20211224203721181

运算符

  • 算数运算符: +, -, * , / (div), %(mod)

  • 比较运算符:>,<,>=,<=,==,!=

  • 逻辑运算符: &&(and) | |(or) !(not)

  • 空运算符: empty

      • 功能:用于判断字符串、集合、数组对象是否为nul1或者长度是否为0

      • ${empty list}

      • ${not empty list}

        • 取反
<h3>算术运算符</h3>
<p>${3+4}</p>
<p>${3/4}</p>
<p>${3 div 4}</p>
<p>${3%4}</p>
<p>${3 mod 4}</p>

<h3>比较运算符</h3>
<p>${3==4}</p>
<h3>逻辑运算符</h3>
<p>${3<=4&&5>=3}</p>
<p>${3<=4 and 5>=3}</p>
<h1>empty运算符<h1>

<%
String s = new String("avc");
List  b = new ArrayList();
List c = null;
request.setAttribute("s",s);
request.setAttribute("b",b);
request.setAttribute("c",c);
%>

${empty b}   true
${not empty c} false
${empty s}   false


获取值

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

语法

${域名称.键名} :从指定域中获取指定键的值

域名称:

  1. pageScope --> pageContext

  2. requestScope --> request

  3. sessionScope–> session

  4. applicationScope --> application (ServletContext)

获取字符串

举例:在request域中存储了name=张三

${requestScope . name}

${键名} :表示依次从最小的域中查找是否有该键对应的值,直到找到为止。(域的大小见域名城1-4)

  • 简化书写,适合四个域名所存的键都不一样的数据

注意:以上的这种方式只能获取字符串

//假如在jsp中往servlet中存储
<% session.setAttribute("name","李四");%>
<% request.setAttribute("name","张三");%>
<% session.setAttribute("age","18");%>

//获取
${requestScope.get("name")};   张三
${sessionScope.get("age")}     18
<%--不存在的--%>
${sessionScope.get("hahaha")}   什么都不显示
${name}   张三。如果想获取李四,还是要加上sessionScope
获取对象
  <%
            User user = new User();
            user.setName("张三");
          user.setAge(18);
          user.setBirthday(new Date());
          request.setAttribute("use",user);
        %>
<%--获取user对象。如果获取具体的对象的值,需要获取对象的属性。即set/get之后的名称--%>
        ${requestScope.use}     cn.itcast.doman.User@69dd90f2
        ${requestScope.use.name}   张三
        ${requestScope.use.birthday} Mon Jul 20 10:25:41 CST 2020
        ${requestScope.use.birStr}  2020-29-20 10:07:441
获取集合

List集合:

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

Map集合:

  1. ${域名称.键名. key名称}

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

<%
    User user = new User();
    user.setName("张展");
  user.setAge(18);
  user.setBirthday(new Date());
  request.setAttribute("use",user);
    List a  = new ArrayList();
    a.add("aaa");
    a.add("bbb");
    a.add("ccc");
    //添加对象到容器
    a.add(user);
    Map map = new HashMap();
    map.put("name","13");
    //添加对象到集合
    map.put("user",user);
    //添加到共享数据
    request.setAttribute("list",a);
    request.setAttribute("map",map);
%>
<h1>容器和集合</h1>
${list[0]}    aaa
${list[1]}    bbb
${list[2].name}   张展
${map.age}         13
${map["user"].name}张展
隐式对象

el表达式中有11个隐式对象

  • pageContext :获取jsp其他八个内置对象
  • ${pageContext . request . contextPath} :动态获取虚拟目录
<h1>动态获取虚拟目录,防止虚拟目录改变时,一步一步的更改虚拟目录</h1>
${pageContext.request.contextPath}
<form action="${pageContext.request.contextPath}" method="post">
</form>

JSTL标签

介绍

概念: JavaServer Pages Tag Library JSP标准标签库。是由Apache组 织提供的开源的免费的jsp标签 <标签>

作用:用于简化和替换jsp页面上的java代码

使用步骤:

  1. 导入jstl相关jar包

  2. 引入标签库: taglib指令: <%@ taglib %> <%@ taglib prefix=“curi=“http://java.sun.com/jsp/jstl/core” %>

  3. 使用标签

  4. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    

常用标签

if

属性:

test必须属性,接受boolean表达式

如果表达式为true,则显示if标签体内容,如果为false, 则不显示标签体内容

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

注意:

c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签

<%
    List array = new ArrayList();
    array.add("aa");
    request.setAttribute("array",array);
    request.setAttribute("number",3);
%>

<%--判断array是否为空,如果不为空,则显示遍历集合--%>
<c:if test="${not empty requestScope.array}">遍历集合</c:if>
<c:if test="${number%2==1}">
    <h1>number是奇数<h1>
</c:if>
    <c:if test="${number%2==0}">
    <h1>number是偶数<h1>
     </c:if>

举例:

<div class="layui-input-block">
                    <c:if test="${requestScope.movement.equals('look')}">
                        <textarea id="content" disabled="disabled" name="content" required lay-verify="required" placeholder="请输入" class="layui-textarea">${requestScope.blog.content}</textarea>
                    </c:if>
                    <c:if test="${requestScope.movement.equals('change')}">
                        <textarea name="content" required lay-verify="required" placeholder="请输入" class="layui-textarea">${requestScope.blog.content}</textarea>
                    </c:if>
                    <c:if test="${requestScope.movement.equals('write')}">
                        <textarea name="content" required lay-verify="required" placeholder="请输入" class="layui-textarea" >${requestScope.content}</textarea>
                    </c:if>

                </div>
choose

相当于switch

完成数字编号对应星期几案例

  1. 域中存储一数字

  2. 使用choose标签取出数字 相当于switch声明

  3. 使用when标签做数字判断 相当于 case

  4. otherwise标签做其他情况的声明 相当于default

<% request.setAttribute("number",1); %>
<c:choose >
    <c:when test="${number==1}">星期1</c:when>   //星期一
    <c:when test="${number==2}">星期2</c:when>
    <c:when test="${number==3}">星期3</c:when>
    <c:when test="${number==4}">星期4</c:when>
    <c:when test="${number==5}">星期5</c:when>
    <c:when test="${number==6}">星期6</c:when>
    <c:when test="${number==7}">星期7</c:when>
    <c:otherwise>输入有误</c:otherwise>
</c:choose>
foreach

相当于for循环

完成重复的操作

属性:

  1. begin:开始值
  2. end:结束值
  3. var:临时变量
  4. step:步长
  5. varStatus :循环状态对象
  6. index:容器中元素的索引,从o开始
  7. count :循环次数,从1开始
    <c:forEach begin="0" end="10" var="b" step="1" varStatus="s">
    ${b}  ${s.index} ${s.count};
    <br>
    </c:forEach>

遍历容器

List list;

for(User user : list){}

属性:

  1. items :容器对象
  2. var:容器中元素的临时变量
  3. varStatus :循环状态对象
  4. index :容器中元素的索引,从o开始
  5. count :循环次数,从1开始
<%
        List<String> list =new ArrayList<String>();
          list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="list" varStatus="s">
    ${s.index} ${s.count} ${list}
    </c:forEach>

image-20211224205426818

将数据写到表格

<%
    List list= new ArrayList();
    list.add(new User("张展",18,new Date()));
    list.add(new User("张文",17,new Date()));
    list.add(new User("张一闪",28,new Date()));
    request.setAttribute("list",list);
%>
<%--设置编号为奇数的背景颜色为黄色,偶数的背景颜色为红色--%>
<table border="2" width="500">

    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>出生日期</th>
    </tr>

<c:forEach items="${list}" var="list" varStatus="s">
    <c:if test="${s.count%2==0}">
        <tr bgcolor="red">
            <td>${s.count}</td>
            <td> ${list.name}</td>
            <td>${list.age}</td>
            <td>${list.birStr}</td>
        </tr>
    </c:if>
    <c:if test="${s.count%2!=0}">
        <tr bgcolor="green">
            <td>${s.count}</td>
            <td> ${list.name}</td>
            <td>${list.age}</td>
            <td>${list.birStr}</td>
        </tr>
    </c:if>

    <br>
</c:forEach>
</table>

举例

<c:forEach items="${pageSearch.blogs}" var="blog" varStatus="s">
                    <tr>
                        <td><input type="checkbox" id="${blog.id}" name="blogId" class="select-message" value="${blog.id}">${s.count}</td>
                        <td>${blog.title}</td>
                        <td>${blog.author}</td>
                        <td>${blog.upDate}</td>
                        <td><a href="/aishangboke/lookBlogServlet?id=${blog.id}&state=look&now=myblog">查看博客</a></td>

<%--                        单条记录的删除修改--%>
                        <td>
                            <button type="button" class="layui-btn"><a href="/aishangboke/lookBlogServlet?id=${blog.id}&state=change">修改</a></button>
                            <button type="button" class="layui-btn" id="delete-button"  >
<%--                                <a href="javascript:deleteMessage()">删除</a>--%>

    <a href="/aishangboke/deleteBlogServlet?id=${blog.id}&page=${pageSearch.page}&now=myblog">删除</a>
                            </button>
                        </td>

                    </tr>

                </c:forEach>

报错

[(103条消息) 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:http://java.sun.com/jsp/jstl/core]_m0_50804764的博客-CSDN博客

三层架构

image-20211224205720577

  1. View层:表现层,视图层。结构用户提交的请求(Controller)
  2. Service层:业务层,逻辑层。系统的主要逻辑
  3. Dao层:持久层,数据访问层。此操作数据库

Service和Dao使用的是面向抽象(接口)编程的思想。

上传对下层的使用是接口,下层对上层的服务是实现。

接口只有一个,但是实现类有多个,但是这些实现类都需要遵从这些接口规范。

MVC

image-20211224205758191
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  1. M model javabean对象

  2. V view html/jsp

  3. C controller Servlet

    1. 接收请求,javabean封装,调用业务层(service)处理,再访问数据库(dao)
    2. 业务层返回的数据,返回到javabean当中,通过jsp转发,在浏览器上响应
    3. 数据的传输使用的是model对象
    4. 中间的数据封装成model进行传输
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐