JavaWeb学习的第十六天(JSP_MVC开发模式_EL表达式_JSTL的使用)

一、案例引入

1.通过Servlet实现连接数据库,响应查询的内容给浏览器

package com.bianyiit.servlet;

import com.bianyiit.dao.UserDao;
import com.bianyiit.domian.User;

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.List;

@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*1.查询所有的用户信息
        * 2.遍历用户集合,生成表格,响应到浏览器中*/
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        UserDao userDao = new UserDao();
        List<User> userList = userDao.findAll();
        response.getWriter().println("<!DOCTYPE html>\n" +
                "<html lang=\"en\">\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <title>数据展示</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "    <table border='1px' width='200px'>\n" +
                "        <tr>\n" +
                "            <td>id</td>\n" +
                "            <td>username</td>\n" +
                "            <td>password</td>\n" +
                "        </tr>\n");
        for (User user : userList) {
            response.getWriter().println("<tr>");
            response.getWriter().println("<td>"+ user.getId()+"</td>");
            response.getWriter().println("<td>"+ user.getUsername()+"</td>");
            response.getWriter().println("<td>"+ user.getPassword()+"</td>");
            response.getWriter().println("</tr>");
        }
        response.getWriter().println("    </table>\n" +
                "</body>\n" +
                "</html>");
    }

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

2.结果截图

3.Sevlet的缺点:处理逻辑能力强,但是数据展示并不方便

4.快捷键:同时修改多行的值:按住alt可以选择特定的一列东西进行修改

二、JSP的学习

1.JSP出现的根本原因:用来解决Servlet数据展示不方便的问题
2.JSP的概述

2.1 什么是JSP:
	Java Server Pages(Java服务器端的页面)
	而html属于前端页面
2.2 为什么要学习JSP:
	SUN公司推出的Servlet自身有缺陷,没有办法与ASP,PHP进行竞争.推出了动态网页开发技术JSP.
2.3 使用JSP:JSP = HTML + Java代码 + JSP自身的东西.
2.4 执行JSP的过程:
	JSP翻译成Servlet,编译这个Servlet的类,生成class文件.得到执行.

3.JSP的基本原理

Tomcat_8_5_50_JavaWeb01_6\work\Catalina\localhost\jsp\org\apache\jsp-->userlist_jsp.java  userlist_jsp.class
JSP本质上是一个Servlet,它只是基于Servlet做了一些封装,项目中的JSP页面在用户第一次访问的时候
会被翻译成java类,这个java类(org.apache.jasper.runtime.httpjspbase)会继承httpservlet


JSP页面翻译之后的userlist_jsp类

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.50
 * Generated at: 2020-01-02 10:42:29 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import com.bianyiit.dao.UserDao;
import com.bianyiit.domian.User;
import java.util.List;

public final class userlist_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = new java.util.HashSet<>();
    _jspx_imports_classes.add("com.bianyiit.domian.User");
    _jspx_imports_classes.add("java.util.List");
    _jspx_imports_classes.add("com.bianyiit.dao.UserDao");
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html lang=\"en\">\r\n");
      out.write("<head>\r\n");
      out.write("    <meta charset=\\\"UTF-8\\\">\r\n");
      out.write("    <title>数据展示</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("    <table border='1px' width='200px'>\r\n");
      out.write("            <tr>\r\n");
      out.write("                <td>id</td>\r\n");
      out.write("                <td>username</td>\r\n");
      out.write("                <td>password</td>\r\n");
      out.write("           </tr>\r\n");
      out.write("        ");

            UserDao userDao = new UserDao();
            List<User> userList = userDao.findAll();
            for (User user : userList) {
                out.println("<tr>");
                out.println("<td>"+ user.getId()+"</td>");
                out.println("<td>"+ user.getUsername()+"</td>");
                out.println("<td>"+ user.getPassword()+"</td>");
                out.println("</tr>");
            }
        
      out.write("\r\n");
      out.write("    </table>\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

4.JSP的执行翻译过程

在浏览器中范围/userlist.jsp,如果是用户第一次访问jsp,此时tomcat会根据访问目录找到jsp页面,tomcat会去找一个tomcat的jsp引擎
jsp引擎会将jsp翻译成java类,这个java类(org.apache.jasper.runtime.httpjspbase)会继承httpservletservlet类,然后去编译成class文件,最后去执行java类,最后由这个servlet去响应给浏览器
第二次访问jsp的时候,如果发现tomcat已经翻译成java类了,就直接从项目中去找到翻译好的class文件,不需要再次通过jsp引擎去将jsp翻译成java类了


5.JSP的脚本(了解)

<%!   %>  声明脚本  	:翻译成Servlet中的成员内容. 定义变量,方法,类. -- 不建议.
<%    %>  代码块脚本	:翻译成Servlet中service方法内部的内容. 定义类,变量 
<%=   %>  输出脚本	:翻译成Servlet中service方法中out.print();

6.JSP的注释

HTML的注释:  <!-- 注释 -->  
Java代码的注释:  // 单行注释 /*多行注释*/ /** 文档注释 */
JSP的注释:  <%-- JSP的注释 --%>
注意:HTML和JSP两种注释的区别:(面试题)
	html注释不能注释jsp的代码脚本,只能注释一些html元素
	html注释在jsp翻译的时候会被翻译到servlet代码中使用输出语句输出到浏览器中
	jsp注释内容不会被jsp引擎翻译,只在写源代码的过程中给程序员看的,当翻译成java类的时候这些jsp注释就不存在了

7.JSP的指令(重点)

7.1 指令的语法:
	系统默认的指令--<%@ page contentType="text/html;charset=UTF-8" language="java" %>
	<%@ 指令名称 属性名称=”属性值” 属性名称=”属性值” ...%>

7.2 JSP中有三个指令:page指令, include指令, taglib指令

7.3 JSP中page指令:<%@ page %> -- 设置JSP的.
	 language		:JSP脚本中使用的语言.现在只能写java.
	 contentType	:设置浏览器打开这个JSP的时候采用的默认的字符集的编码.
	 pageEncoding	:设置文件保存到本地硬盘,以及生成Servlet后,Servlet保存到硬盘上的编码.
	 import			:在JSP中引入类对象.但是import可以出现多次.
	 isELIgnored	:设置在JSP中是否忽略EL表达式.默认值是false不忽略.
	 errorPage		:设置错误友好页面的提示.指定当前页面出错之后跳转的错误页面
	 isErrorPage	:通过这个设置显示JSP的错误信息.  如果值设置成true,那么在这个页面中可以直接使用一个execption对象获取错误信息 <%= exception.getMessage()>
	 buffer         :指定缓冲区对应的大小一般是8kb
	 
7.4 JSP中的include指令:指示JSP包含其他的页面---如果多个界面有相同的头部,可以通过这个方法引入
	<%@ include file="logo.jsp" %>
	<%@ include file="menu.jsp" %>
	<h1>BODY部分</h1>
	<%@ include file="footer.jsp" %>

7.5 JSP中的taglib指令:指示JSP引入第三方的标签库(在JSTL中会很频繁的使用)
	<%@ taglib uri="标签的URI的路径" prefix="标签的别名" %>

8.JSP的内置对象(重点)

扫描二维码关注公众号,回复: 8577961 查看本文章
8.1 JSP的内置对象:在jsp中不需要创建就可以直接使用的对象
8.2 JSP中有9大内置对象:这些对象全部会被翻译到service里面
	//1234为四个域对象,能够在对应的作用范围内共享数据
	1.pageContext:
	   jsp里面特有的,域对象,作用范围:最小的,在当前页面中才能共享数据
	   能够获得其他的8个内置对象,当前页面的运行环境信息
	   pageContext.getRequest();
	   pageContext.getSession();
	2.request: 一次请求范围内
	3.session: 一次会话范围内
	4.application:ServletContext对象,整个web项目范围内
	5.response:
	
	6.page::真实对象是Object,就是JSP翻译成Servlet后的类的引用.
	7.out:输出内容对象
	8.exception:错误对象
	9.config:ServletConfig对象,Servlet初始化参数

9.面试题:out和response.getWriter是不是同一个对象?区别是什么?

out:输出内容对象 类型是JSPWriter  调用println();
response.getWriter:响应对象  调用println();
两个对象各有一个缓冲区,最后输出的是response响应给浏览器,out中的内容先在out的缓冲区中
然后在输出到浏览器的时候将这些内容转移到response缓冲区,然后response缓冲区原来的内容永远在最前面


10.产生了新的问题:前端html代码和服务器代码严重耦合到一起,项目难以维护

三、MVC开发模式

1.JSP开发模式一: jsp(接收请求,响应请求,展示数据)+javabean(处理业务逻辑)

javaBean:可复用的java组件 -user -userDao
自己写的普通java类都可以称之为javaBean
user    实体bean,用来封装对象用的
userDao 业务bean,专门用来处理业务逻辑的

2.JSP开发模式二:Servlet(接收请求,转发request传递数据)+jsp(展示数据,响应给浏览器)+javaBean(处理业务逻辑)
3.JSP开发模式二的处理过程:

Servlet接收请求,调用javaBean处理业务,将业务处理结果返回给Servlet,然后Servlet转发request传递数据给JSP,最后JSP展示数据,并响应给浏览器

4.MVC模式结合JavaWeb进行开发的一套标准模型

M(Model模型) ---javaBean
V(View视图)  ---jsp
C(Controller控制器) ---servlet

5.使用MVC开发模式怎么去做??

//将数据保存到request域对象中,并转发到jsp页面(一次请求范围内)
   request.setAttribute("userList",userList);
   request.getRequestDispatcher("/userList.jsp").forward(request,response);
//jsp只取出数据展示出来
   List<User> userList=(List<User>)request.getAttribute("userlist");
   //遍历输出
   for (User user : userList) {
       out.println("<tr>");
       out.println("<td>"+ user.getId()+"</td>");
       out.println("<td>"+ user.getUsername()+"</td>");
       out.println("<td>"+ user.getPassword()+"</td>");
       out.println("</tr>");
   }

最后:MVC模式虽然没有从根本上解决jsp中包含java代码的问题,但是整个逻辑已经变得清晰明了

四、EL表达式

1.什么是EL表达式

EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。

2.为什么学习EL

简化JSP的代码,而且减少<%%>的使用,事实证明最后使用编写JSP页面时除了在头部使用<%%>指令外,一般展示数据都是使用EL表达式结合JSTL来动态展示数据

3.使用EL表达式

语法格式:${EL表达式}

4.EL的常用功能之一:获取数据

注意:El表达式只能获取域对象中的数据
	PageContext
	Request
	Session
	Application(ServeltContext)
1.存取是普通的单值数据
	request.setAttribute("username","tom");
	request.getSession().setAttribute("password","123");
	request.getServletContext().setAttribute("email","[email protected]");
	request.getRequestDispatcher("/el.jsp").forward(request,response);
	//获取域中数据
	${requestScope.username}
	${sessionScope.password}
	${applicationScope.email}
	注意:
	1.1 通过域对象调用方法如果值没有获取的是null对象,El表达式获取数据如果没有获取到返回””
	1.2 ${name}类似findAttribute("name") 先从pageContext域中查找,没找到去request域中查询,没有找到去session域中找,没有找到就去application域中找 
	1.3 域对象中查找数据的顺序pageScope--->requestScope--->sessionScope--->applicationScope
2.获取数组(List集合)的数据
	${ arrs[0] }
	${ arrs[1] }
	${ arrs[2] }
	${ arrs[3] }
3.获取Map集合的数据
	//遍历方式一
	   ${map["username"]}<br>
	   ${map["age"]}<br>
	   ${map["email"]}<br>
	//遍历方式二:用的比第一种方式多
	   ${map.username}<br>
	   ${map.age}<br>
	   ${map.email}<br>
4.获取对象的数据
	${user.id}<br>
	${user.username}<br>
	${user.password}<br>
	注意:el表达式获取对象属性值的时候,如果属性找不到,会直接报错
5. 获取对象的集合的数据
<%
	User user1 = new User(1,"aaa","123");
	User user2 = new User(2,"bbb","123");
	User user3 = new User(3,"ccc","123");
	
	List<User> userList = new ArrayList<User>();
	userList.add(user1);
	userList.add(user2);
	userList.add(user3);
	
	pageContext.setAttribute("userList", userList);
%>

${ userList[0].id } - ${ userList[0].username } - ${ userList[0].password }<br/>
${ userList[1].id } - ${ userList[1].username } - ${ userList[1].password }<br/>
${ userList[2].id } - ${ userList[2].username } - ${ userList[2].password }<br/>

6.由于EL表达式可以获取所有的域对象中存储的数据,因此可以简写成${username}

5.EL的常用功能之二:执行运算

1. EL执行算数运算
	<%
		pageContext.setAttribute("n1", "10");
		pageContext.setAttribute("n2", "20");
		pageContext.setAttribute("n3", "30");
		pageContext.setAttribute("n4", "40");
	%>
	${ n1 + n2 + n3 }
2. EL执行逻辑运算
	${ n1 < n2 } - ${ n1 lt n2 }    less than
	${ n1 > n2 } - ${ n1 gt n2 } 	great than
	${ n1 <= n2 } - ${ n1 le n2 }   less equal
	${ n1 >= n2 } - ${ n1 ge n2 } 	 great equal
	${ n1 == n2 } - ${ n1 eq n2 }    equal

3. EL执行关系运算
	${ n1<n2 && n3 < n4 } - ${ n1<n2 and n3 < n4 }<br/>
	${ n1<n2 || n3 < n4 } - ${ n1<n2 or n3 < n4 }<br/>
	${ !(n1 < n2) } - ${ not(n1<n2) }

4. EL执行三元运算
	${ n1 < n2 ? "正确":"错误" }

5. empty运算
	${ user == null } - ${ empty user }
	${ user != null } - ${ not empty user }

6.EL操作WEB开发的常用对象11个

7.pageContext---用来获取request对象 在jsp页面中动态获取项目的虚拟路径

<a href="${pageContext.request.contextPath}/servletDemo1">servletDemo1</a>

五、JSTL的学习

1.JSTL的概述

JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范
它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。
开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。

2.为什么学习JSTL

JSTL和EL结合 替换页面中<% %>

3.JSTL版本

JSTL1.0			:不支持EL表达式.
JSTL1.1 和 1.2	:支持EL表达式.

4.JSTL的标签库:包含了五类标签

core(核心标签),fmt(国际化标签),xml(XML标签),sql(SQL标签),fn(JSTL提供EL函数库)

5.使用JSTL的步骤

//1.需要导两个jar包 ---一个标准规范,一个具体实现 
	链接:https://pan.baidu.com/s/1yrKdjOvotJKBdHiQKBinSQ 
	提取码:xrz7 
	复制这段内容后打开百度网盘手机App,操作更方便哦

//2.在jsp的头部引入第三方的标签库 <%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl1/core" %>

//3.在jsp中使用JSTL的标签来替代java代码

6.JSTL的核心标签的用法

//判断用户名是否传递过来
<c:if test="${not empty username}">
    //如果用户名存在就执行这里的代码
    welcome ${username}
<c:if>
//JSTL里面没有else这个标签
<c:if test="${empty username}">
    用户名为空,请重新登录
<c:if>

//循环
    普通的循环 fori
    增强的循环 iter
<c:forEach var="i" start="0" end="10" step="2">
    ${i}<br>
</c:forEach>
//varStatus="status"---用来记录当前变量的状态
<c:forEach var="u" items="${userList}" varStatus="status">
    ${status.count} //记录当前遍历的次数从1开始
    ${status.index} //记录当前遍历元素在集合中的索引
    ${u.id}<br>
    ${u.username}<br>
</c:forEach>

7.JSTL的提供EL的函数库

实现功能和EL表达式结合(绝大部分都与String操作相关)
    1.引入函数库<%@ taglib prefix="fn" uri="http://java.sum.com/jsp/jstl/function" %>
    2.${fn:toUpperCase("aaa")}  //AAA
    
<h1>JSTL提供的EL的函数库</h1>
${ fn:contains("Hello World","Hello") }
${ fn:length("HelloWorld") }
${ fn:toLowerCase("ABCDE") }
<c:forEach var="i" items='${ fn:split("a-b-c-d","-") }'>
	${ i }
</c:forEach>

六、案例演示

使用MVC开发模式实现数据库查询并显示在浏览器
1.MVC之控制器--Servlet

package com.bianyiit.servlet;

import com.bianyiit.dao.UserDao;
import com.bianyiit.domian.User;

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.List;

@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        UserDao userDao = new UserDao();
        List<User> userList = userDao.findAll();
        request.setAttribute("userList",userList);
        request.getRequestDispatcher("/userList.jsp").forward(request,response);
    }

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

2.MVC之模型---JavaBean

package com.bianyiit.dao;

import com.bianyiit.domian.User;
import com.bianyiit.util.DruidUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class UserDao {
    public List<User> findAll(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidUtils.getDataSource());
        String sql="select * from message";
        List<User> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
        return query;
    }
}

3.MVC之视图---userList.jsp

<%@ 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="1px" width="400px">
        <tr>
            <td>id</td>
            <td>username</td>
            <td>password</td>
        </tr>
        <c:forEach var="user" items="${userList}">
            <tr>
                <td>${user.id}</td>
                <td>${user.username}</td>
                <td>${user.password}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

演示结果截图:


源码下载

链接:https://pan.baidu.com/s/1XH9NBNevU21ja_F7Z0POmA 
提取码:pb67

注意细节:

发布了73 篇原创文章 · 获赞 11 · 访问量 2437

猜你喜欢

转载自blog.csdn.net/weixin_43908333/article/details/103809264