一、案例引入
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的内置对象(重点)
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
注意细节: