web核心 6-jsp 技术 el标签 jstl标签 mvc设计思想

内容介绍

1.jsp
2.el标签
3.jstl标签
4.mvc设计思想

jsp

在这里插入图片描述

概述

jsp:Java Server Pages --java服务器端的页面技术

html代码+java代码+jsp代码的组合 后缀名:.jsp 存放位置: 和html一致

总结:jsp就是能写java代码的html页面

作用

servlet对于数据的展示过于麻烦
jsp:接受服务器端servlet产生的各种数据(map/数组/list/对象),进行数据展示的    

jsp的使用

jsp本质上就是一个servlet

Servlet本质上是一个java类
java类:具有.java  .class (work目录)

jsp的执行原理:(理解和面试题)
1:根据请求的页面去当前项目下找到指定的jsp 没找到会报404
2:找到对应的jsp文件后.将jsp文件变成java文件.并调用编译器编译成class文件,最终放在了work目录下
3.编译后的class文件会被服务器当做Servlet执行,生成动态的内容,将动态的内容返回给服务器
4.服务器拿到生成的内容,组装成响应信息,返回给浏览器
5.浏览器收到响应,展示内容

jsp的语法:

1 注释 <%-- --%>

 jsp中可以写html注释,但是jsp的注释不会显示在源码上,更加安全。

在这里插入图片描述

2 三种方式编写java代码 <% %> <%= %> <%! %>

<% %> :java程序片段 
定义在它里面的java代码,在生成的servlet源码文件的service方法里面有一份

在这里插入图片描述

<%= %>:页面输出表达式 (JspWriter:是jsp的输出流 专门页面输出数据的  PrintWriter:servlet)
(了解)定义在它里面的java代码,在生成的servlet源码文件的service方法里面有一份 做输出

在这里插入图片描述

<%! %>:定义成员
(了解)定义在它里面的java代码,在生成的servlet源码文件成员位置上有一份

需求:使用jsp接收servlet产生的数据(字符串,集合,数组,map等等)并且展示

public class ServletDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	response.setContentType("text/html;charset=utf-8"); //解码
        	// 从数据库获取到了数据封装到了list集合中
        List list=new ArrayList<>();
        list.add("jack");
        list.add("男");
        list.add("18");
        	// 将查到的数据在页面展示
        response.getWriter().print("你好");

        	// servlet的字符输出流
        PrintWriter out = response.getWriter();


			 // 数据库获取--简单数据 (String  int long...)
         String msg="abcd/12345";
        	 // 带给jsp (servletContext request session)
        request.setAttribute("key1",msg);
        request.getSession().setAttribute("key1",msg);
        ServletContext servletContext = getServletContext();
        servletContext.setAttribute("key1",msg);
        // 跳到demo3.jsp页面(请求转发  重定向)
        request.getRequestDispatcher("/jsps/demo3.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
    }
}

jsps/demo3.jsp 页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>接收servlet的各种数据且展示</title>
</head>
<body>
        <h2>接收简单数据且显示</h2>
        老方式1: <%=request.getAttribute("key1")%> <br>
        老方式2: <%=request.getSession().getAttribute("key1")%> <br>
        老方式3: <%=application.getAttribute("key1")%> <br>
        <hr>
        el方式1: ${requestScope.key1} <br>
        el方式1: ${sessionScope.key1} <br>
        el方式1: ${applicationScope.key1} <br>
		     <%--
                el:一种标签表达式
                这个el标签表达式可以直接在jsp中使用
                使用方式:${表达式}
                作用:
                    1 获取3大域中的数据(重要)
                             提供了三个内置对象:可以直接在el表达式中使用的对象
                             requestScope === request域中获取
                             aplicationScaope===ServletContext域中获取
                             sessionScope===session域中获取
                             ps:这三个对象唯一作用:可以从对应的域对象中获取是数据
                    2 可以做元素
            --%>

</body>
</html>

el标签

概述

el:Expression Language

能够嵌套到jsp页面中,代替jsp的脚本标签<% %>,使jsp中的java代码写起来更加的简化

作用

1 通过el标签在jsp页面中获取Servlet的3大域中的数据 (重点)

1 获取简单数据(String  int..)
2 获取复杂数据 (数组 list  map)
3 获取对象属性的数据 (对象)

2 通过el标签做一些运算 + - * / && || > < 三元运算(了解)

el的使用

el的书写格式:${el的表达式}

el获取域中的数据

el对域中简单数据的获取:

${requestScope||sessionScope||applicationScope.key名}

在这里插入图片描述

public class ServletDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // 数据库获取--简单数据 (String  int long...)
         String msg="abcd/12345";
         // 带给jsp (servletContext request session)
        //request.setAttribute("msg",msg);
        //request.getSession().setAttribute("msg",msg);
        ServletContext servletContext = getServletContext();
        servletContext.setAttribute("msg",msg);
        // 跳到demo3.jsp页面(请求转发  重定向)
        request.getRequestDispatcher("/jsps/demo3.jsp").forward(request,response);


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
    }
}

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>接受servlet的各种数据且展示</title>
</head>
<body>
            <h2>接受简单数据且展示</h2>
            老方式:<%=application.getAttribute("msg") %><br/>
            el表达式:${applicationScope.msg}<br/>
            <%--
                el:一种标签表达式
                这个el标签表达式可以直接在jsp中使用
                使用方式:${表达式}
                作用:
                    1 获取3大域中的数据(重要)
                             提供了三个内置对象:可以直接在el表达式中使用的对象
                             requestScope === request域中获取
                             pplicationScaope===ServletContext域中获取
                             sessionScope===session域中获取
                             ps:这三个对象唯一作用:可以从对应的域对象中获取是数据
                    2 可以做元素
            --%>
</body>
</html>

el对域对象中复杂数据获取:

数组和list集合 ${requestScope||sessionScope||applicationScope.key名[角标]}
map集合:${requestScope||sessionScope||applicationScope.key名.map的key名}

在这里插入图片描述


public class ServletDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // 数据库获取--复杂数据 (数组)
         String[] arr={"aaa","bbb","cccc","dddd"};
        // 数据库获取--复杂数据 (list集合)
         List<String> list = new ArrayList<>();
         list.add("aaaaa");
         list.add("bbbbb");
         list.add("ccccc");
         list.add("ddddd");
        // 数据库获取--复杂数据 (map集合)
        Map<String, String> map = new HashMap<>();
        map.put("key1","aaaa");
        map.put("key2","bbbb");
        map.put("key3","cccc");
        map.put("key4","dddd");

        // 存入域对象带给jsp展示
        request.setAttribute("arr",arr);
        request.setAttribute("llist",list);
        request.setAttribute("map",map);
        request.getRequestDispatcher("/jsps/demo4.jsp").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
    }
}

在这里插入图片描述

<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>接受servlet的各种数据且展示</title>
</head>
<body>
            <h2>接受复杂数据且展示_数组(ccc)</h2>
            老方式:<%=((String[])request.getAttribute("arr"))[2]  %><br/>
            el表达式:${requestScope.arr[2]}
            <hr/>
            <h2>接受复杂数据且展示_list(ccc)</h2>
            老方式:<%=((List)request.getAttribute("llist")).get(2)  %><br/>
            el表达式:${requestScope.llist[2]}
            <hr/>
            <h2>接受复杂数据且展示_map(ccc)</h2>
            老方式:<%=((Map)request.getAttribute("map")).get("key1")  %><br/>
            el表达式:${requestScope.map.key1}
</body>
</html>

el对域中对象属性值的获取:

${requestScope||sessionScope||applicationScope.key名.对象属性名}
或${requestScope||sessionScope||applicationScope.key名[“对象属性名”]}

在这里插入图片描述

public class ServletDemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // 数据库获取--对象数据
        User user = new User();
        user.setUsername("jack");
        user.setPassword("aaaa");
        // 存储对象数据到jsp页面展示
        request.setAttribute("user",user);
        request.getRequestDispatcher("/jsps/demo5.jsp").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
    }
}

在这里插入图片描述

<html>
<head>
    <title>接受servlet的各种数据且展示</title>
</head>
<body>
            <h2>接受对象数据且展示_对象的属性</h2>
            老方式: <%=((User)request.getAttribute("user")).getUsername() %><br/>
            el表达式:${requestScope.user.username}<br/>
                     ${requestScope.user["password"]}<br/>
</body>
</html>

注意:

requestScope:el标签提供的一个内置对象
sessionScope:el标签提供的一个内置对象
applicationScope:el标签提供的一个内置对象
唯一作用:专门用来获取对应域中存储的数据

el的便捷方式:

el的便捷方式:依次从最小的域中开始查找,找到了直接返回 找不到继续找下一个 如果都没有 返回的是空内容
域的范围大小:request<session<application
缺点:可以避免,起名规范
1 在使用el的便捷方式的过程中,尽量保证多个域的属性名不同
2 如果域的键名有一些特殊的符号_,.,+等 el的便捷方式无法使用

在这里插入图片描述

<%@ page import="cn.itcast.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>接受servlet的各种数据且展示</title>
</head>
<body>
            <%
                session.setAttribute("msg1","aaa");
                request.setAttribute("msg2","bbb");
                application.setAttribute("msg3","ccc");
            %>

            el的标准获取:<br/>
            ${sessionScope.msg}<br/>
            ${requestScope.msg}<br/>
            ${applicationScope.msg}<br/>
            <hr/>
            el的便捷获取:依次从域中获取数据   按照域的作用大小来获取的 默认是从小到大
            request>session>ServletContext(application)>空内容<br/>
            ${msg2}<br/>
            ${msg1}<br/>
            ${msg3}<br/>
            <hr/>
            <%
                request.setAttribute("msgA","你好A");
                request.setAttribute("msg.a+b_c.d","你好B");
            %>
            ${msgA}<br/>
            ${requestScope["msg.B"]}
</body>
</html>

el做运算

特点:

在el做+ - * / 运算 不论运算符的后面是什么类型,只要能运算的全都做运算,不能运算的 一律报错  

在这里插入图片描述

el的表达式不仅支持做+,-,*,/  还支持做逻辑运算,比较运算和三元运算

在这里插入图片描述

empty(掌握)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

作用:可以判断一个容器的长度是否为0  可以判断一个对象是否为null
容器(list/map集合):
	    如果集合长度为0   true
	    如果集合长度不为0 false

对象(javabean):
	    如果对象为nulL   true
	    如果对象不为null false

取反值:!或 not
<%@ page import="cn.itcast.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<html>
<head>
    <title>el的运算</title>
</head>
<body>
            <%
               request.setAttribute("a",10);
               request.setAttribute("b",20);
               request.setAttribute("c","30");
               request.setAttribute("d","d");
            %>

            运算:<br/>
            ${a+b}<br>
            ${a+c}<br>
            ${c+c}<br>
           <%-- ${c+d}<br>--%>

            <hr/>

            <%
                request.setAttribute("e",true);
                request.setAttribute("f",false);
            %>
            ${e||f}  <%--true--%>

            <hr/>

            <%
                request.setAttribute("x",10);
                request.setAttribute("y",20);
            %>

            ${x>y?x:y}

</body>
</html>
<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<html>
<head>
    <title>el的运算_empty</title>
</head>
<body>
        <%--
            empty:可以用来判断容器的长度以及对象的非空
            结果:boolean类型  true: 容器长度为0/对象为null    false:容器长度不为0/对象不为null
            开发中:我们要取反值
        --%>
        <%
            List<String> list1 = new ArrayList<>();
            list1.add("aaaaa");
            List<String> list2 = new ArrayList<>();

            request.setAttribute("list1",list1);
            request.setAttribute("list2",list2);

            User user1 = new User();
            User user2 = null;
            application.setAttribute("user1",user1);
            application.setAttribute("user2",user2);

        %>

        判断容器长度:
        ${empty list1}  取反值:${!empty list1} --->${not empty list1}<br/>
        ${empty list2}
        <hr/>
        判断对象是否为空:
        ${!empty user1}<br/>
        ${not empty user2}
</body>
</html>

JSTL标签

概述

jstl不是jsp的内置标签,如果想要在jsp中使用这个标签
需要先在当前的jsp中,引入该标签

jstl的入门

1 导2个jar包
在这里插入图片描述

2 在哪个jsp页面使用,就需要在当前的jsp中通过jsp的指令tagLib引入
在这里插入图片描述

jstl的使用

在这里插入图片描述

jstl核心下一共有13组标签,咱们只玩2组
if :判断
foreach:循环

if判断

格式:	<c:if test="el表达式" [var="变量名"] [scope="保存的域"]>  
		   	条件成立的时候输出的内容
	    </c:if>

在这里插入图片描述

<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

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

<html>
<head>
    <title>jstl标签_if判断</title>
</head>
<body>
        <%--jstl标签:
                if
                foreach
           特点:不能在jsp上直接使用,jsp不支持
           使用:导jstl的jar包  哪个页面要用还得再那个页面导标签库(jsp指令)
        --%>

        <%--
                if(boolean){
                    ...
                }else{
                    ...
                }

        --%>

        <c:if test="${1>0}" var="i" scope="request">
            条件成立要输出的内容 哈哈哈哈
            ${i}
        </c:if>
        <c:if test="${1<0}">
            条件成立要输出的内容 哈哈哈哈
            ${i}
        </c:if>


</body>
</html>

foreach循环

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

格式1:<c:forEach begin="开始" end="结束" step="循环的间隔数" var="每次循环变量值" varStatus="记录循环状态">
		${变量名 }
</c:forEach>	
varStatus="记录循环状态"
		count:计数当前第几个
		first:判断是否是第一个
		last:判断是否是最后一个
	

格式2(掌握):
<c:forEach items="要遍历的list/map" var="每一次遍历的变量内容"></c:forEach>

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

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

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

<html>
<head>
    <title>jstl标签_foreach循环的简单运用</title>
</head>
<body>
        <%--
            for(int i=0;i<10;i++){
                sout(i);
            }

        --%>
        <c:forEach var="i" begin="0" end="10" step="2" varStatus="vs">
                ${i}--->${vs.count}-->${vs.first}--->${vs.last}<br/>
        </c:forEach>

</body>
</html>

public class ServletDemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // list<javabean>   map<javabean>
        ArrayList<User> list = new ArrayList<>();
        User user1 = new User();
        user1.setUsername("jack");
        user1.setPassword("aaaa");
        User user2 = new User();
        user2.setUsername("rose");
        user2.setPassword("bbbb");
        list.add(user1);
        list.add(user2);

        HashMap<String, User> map = new HashMap<>();
        map.put("keyaaaa",user1);
        map.put("keybbbb",user2);

        // 带到jsp页面展示list的集合数据
        request.setAttribute("list",list);
        request.setAttribute("map",map);
        request.getRequestDispatcher("/jsps/demo11.jsp").forward(request,response);


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
    }
}

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

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

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

<html>
<head>
    <title>jstl标签_foreach循环的高级运用</title>
</head>
<body>
           <h2>获取servlet的数据进行遍历展示</h2>
            list:<br/>
           <c:forEach items="${list}" var="u">
               ${u.username}-->${u.password}<br/>
           </c:forEach>
            <hr/>

           map:<br/>
            <c:forEach items="${map}" var="m">  <%--m:  键值对--%>
                ${m.key}--->${m.value.username}--->${m.value.password}<br/>
            </c:forEach>

</body>
</html>

综合案例:

mvc设计模式

servlet-缺点:编写页面响应信息麻烦
	|
jsp-缺点:维护起来麻烦
	|
jsp+javabean:  model1(过时了)
	       jsp:接受请求,处理请求(找到合适javabean去处理请求) 做展示
	|
	|
	

jsp+javabean+servlet:  model2(目前方式)

jsp:		收集servlet传递数据 展示数据
servlet:	接受页面请求 找到合适javabean去封装并处理
javabean:	封装业务,封装对数据的操作
   
 
	
MVC设计模式思想(面试题):	
核心思想:将业务逻辑 数据 和显示相分离的一种思想.让每一块都专注于做自己的事情
M:model 模型 封装数据 封装对数据的操作  javabean
V:view 	视图 展示数据(主要使用jsp)     jsp
C:ctrl(controller) 控制	接受请求并响应 servlet

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

1 list.jsp相关代码 (导2个与 jstl相关的包 )

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>Bootstrap模板</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
            text-align: center;
        }
    </style>
</head>

    <body>
    <div class="container">

        <h3 style="text-align: center">显示所有联系人</h3>

        <table border="1" class="table table-bordered table-hover">
            <tr class="success">
                <th>编号</th>
                <th>姓名</th>
                <th>性别</th>
                <th>年龄</th>
                <th>籍贯</th>
                <th>QQ</th>
                <th>邮箱</th>
                <th>操作</th>
            </tr>

            <c:if test="${not empty list}">
                <c:forEach items="${list}" var="contact">
                    <tr>
                        <td>${contact.id}</td>
                        <td>${contact.name}</td>
                        <td>${contact.sex}</td>
                        <td>${contact.age}</td>
                        <td>${contact.address}</td>
                        <td>${contact.qq}</td>
                        <td>${contact.email}</td>
                        <td>
                            <a class="btn btn-default btn-sm" href="#">修改</a>&nbsp;
                            <a class="btn btn-default btn-sm" href="#">删除</a>
                        </td>
                    </tr>
                </c:forEach>
            </c:if>



            <tr>
                <td colspan="8" align="center"><a class="btn btn-primary" href="添加联系人.html">添加联系人</a></td>
            </tr>
        </table>
    </div>
    </body>

</html>

2 ShowServlet相关代码

public class ShowServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 直接调用service
        ShowService showService = new ShowService();
        List<Contact> list = showService.show();
        // 存入到域中带给jsp展示
        request.setAttribute("list",list);
        request.getRequestDispatcher("/list.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

3 service层

public class ShowService {

    public List<Contact> show() {
        ShowDao showDao = new ShowDao();
        return showDao.show();
    }
}

4 Dao层

  • 1 准备好数据库表: contact
  • 2 准备好两个domain(存放javabean 类)文件夹存放User和Contact
  • 3 准备好工具类utils文件夹存放JDBCUtils,产生连接池 (导5个包+druid.properties存放在web项目下)

public class ShowDao {

    public List<Contact> show() {

        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from contact";
        List<Contact> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Contact.class));
        return list;
    }
}

在这里插入图片描述

三层架构

企业开发中,我们的主流开发方式都会选择三层架构的开发模式,根据不同的层做不同的处理

三层分别是:表示层、业务逻辑层、数据访问层。
表示层:又称为 web层,与浏览器进行数据交互的。 servlet
业务逻辑层:又称为service层,专门用于处理业务数据以及事务处理
数据访问层:又称为dao层,与数据库进行数据交换的。

包的命名规范:

web: 公司域名反转.web

service:公司域名反转.service

dao:公司域名反转.dao

domain: 专门放javabean

utils:专门放工具类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值