1、JSP

1、JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,页面的动态资源使用java代码,页面静态资源使用html标签
2、可以在html标签中嵌套java代码
3、JSP本质上是一个Servlet,jsp页面运行时,会先生成一个java文件,必须进行编译,再去执行

jsp脚本:

<%代码%>:脚本片段,生成在service方法中,每次请求的时候都会执行
<%!代码%>:声明片段,在java代码中声明成员,放在jsp生成java文件中的成员位置
<%=代码%>:输出脚本,输出到jsp页面,相当于out.print(“代码”)方法

jsp注释:

html注释: JSP源码可见 java源码可见 html源码可见
JSP注释:<%—注释所有—%> JSP源码可见 java源码可见 html源码不可见
java注释:JSP脚本内使用 JSP源码可见 java源码不可见 html源码不可见

jsp指令:

  1. page指令:
  2. errorPage
  3. 当前页面报错后,跳转指定错误提示页面
  4. isErrorPage
  5. 声明当前jsp页面是一个异常处理页面,打开异常开关
  6. `false`:(默认)
  7. `true`:可以操作exception异常对象
  8. include指令:
  9. <%@include file="xxx.jsp"%>
  10. 页面包含的,导入页面的资源文件
  11. 也就是在一个页面中指定区域显示另一个页面的内容
  12. taglib指令:
  13. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  14. 导入资源,prefix为自定义前缀

jsp内置对象:

在JSP页面中不需要获取和创建,可以直接使用的对象
pageContext对象:当前页面中共享数据(域对象)
当前页面的域对象,可回去其他八个内置对象
request对象:一次请求中共享数据(域对象)
接收用户请求(参数)和获取一次请求中的域对象
session对象:一次会话中共享数据(域对象)
application对象:整个web应用共享数据(域对象)
response对象:响应对象
设置响应:字节流和字符流
page(this)对象:当前页面(servlet)对象
out:输出对象
专门在jsp处理字符流,print可输出一切类型,write只能输出字符类型
config:servlet配置对象
exception:异常对象(默认关闭)

MVC模式:

M:model(模型)JavaBean,处理业务逻辑,封装实体
V:view(视图)Jsp,展示数据
C:controller(控制器),Servlet,接收请求,调用模型,转发视图

  1. 1. 早期只有servlet,只能使用response输出标签数据,非常麻烦
  2. servlet+javaBean
  3. 2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,有写html的,造成难于维护,难于分工协作
  4. servlet + jsp + javaBean
  5. 3. 再后来,javaweb开发,借鉴mvc开发模式(C/S),使得程序的设计更加合理性

优点:
1、降低耦合性,方便维护和拓展,利于分工协作
2、可重用高
缺点:
使项目架构变得复杂

2、EL表达式

${表达式}
主要是从域对象中查找指定的数据

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="404.jsp" %>
  2. <html>
  3. <head>
  4. <title>index</title>
  5. <style type="text/css"> </style>
  6. </head>
  7. <body>
  8. <h1>从域中获取数据:</h1>
  9. <h3>获取字符串:</h3>
  10. str${str} <br />
  11. <h3>获取数组:</h3>
  12. 数组值1${strs[0]} <br />
  13. 数组值2${strs[1]} <br />
  14. 数组值3${strs[2]} <br />
  15. <h3>获取对象:</h3>
  16. ${user} <br />
  17. 对象名:${user.name} <br />
  18. 年龄:${user.age} <br />
  19. <h3>获取list集合:</h3>
  20. list集合值1${list[0]} <br />
  21. list集合值2${list[1]} <br />
  22. list集合值3${list[2]} <br />
  23. <h3>获取map集合:</h3>
  24. map集合kye1${map.mapKey1} <br />
  25. map集合kye2${map.mapKey2} <br />
  26. map集合kye3${map.mapKey3} <br />
  27. <script type="text/javascript"> </script>
  28. </body>
  29. </html>
  30. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  31. package com.yunhe.servlet;
  32. import com.yunhe.domain.User;
  33. import javax.servlet.ServletException;
  34. import javax.servlet.annotation.WebServlet;
  35. import javax.servlet.http.HttpServlet;
  36. import javax.servlet.http.HttpServletRequest;
  37. import javax.servlet.http.HttpServletResponse;
  38. import java.io.IOException;
  39. import java.lang.reflect.Array;
  40. import java.util.ArrayList;
  41. import java.util.HashMap;
  42. import java.util.List;
  43. import java.util.Map;
  44. @WebServlet("/useELServlet")
  45. public class UseELServlet extends HttpServlet {
  46. @Override
  47. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  48. request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
  49. response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
  50. //存字符串到域中
  51. request.setAttribute("str","字符串");
  52. //存数组到域中
  53. String[] strs = {"数组值1","数组值2","数组值3",};
  54. request.setAttribute("strs",strs);
  55. //存对象到域中
  56. User user = new User("张三",13);
  57. request.setAttribute("user",user);
  58. //存list集合到域中
  59. List list = new ArrayList();
  60. list.add("list集合值1");
  61. list.add("list集合值2");
  62. list.add("list集合值3");
  63. request.setAttribute("list",list);
  64. //存map集合到域中
  65. Map<String,Integer> map = new HashMap();
  66. map.put("mapKey1",1);
  67. map.put("mapKey2",2);
  68. map.put("mapKey3",3);
  69. request.setAttribute("map",map);
  70. //转发到jsp页面
  71. request.getRequestDispatcher("/index.jsp").forward(request,response);
  72. }
  73. @Override
  74. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  75. this.doPost(request, response);
  76. }
  77. }

EL运算符:

空运算符:empty
用于判断字符串,集合,数组对象是否为null或者长度是否为0

  1. <%--
  2. 相当于 if(user != null)
  3. --%>
  4. 返回boolean类型,可用于判断用户是否登录
  5. user对象: ${not empty user} <br> 用户名不为空:提示欢迎语句
  6. user对象: ${empty user} <br> 用户名为空:提示登录登录

EL隐式对象:

el表达式中有11个隐式对象
pageContext可以获取其他八个隐式对象

  1. 常用的EL隐式对象:
  2. ${pageContext.request.contextPath}
  3. 表示项目名
  4. ${cookie.JSESSIONID.value}
  5. 获取Cookie的值

JavaBean:

1、所有的字段(成员变量)为private修饰
2、提供无参构造
3、提供get,set方法
4、实现Serializable接口(可序列化)

3、JSTL

1、导包
2、引入标签库

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

JSTL常用标签库:

  1. if语句:
  2. 属性test --》必须属性,接收boolean表达式
  3. 和空运算符配合使用,判断用户是否登录
  4. <c:if test= "${empty user}">您好,请登录</c:if> 若为真,显示标签内内容
  1. foreach语句:
  2. 属性begin --》开始值
  3. end ==》结束值
  4. var ==》临时变量
  5. step ==》步长
  6. <c:forEach begin="1" end="10" step="1" var="i">
  7. ${i}: helloword <br>
  8. </c:forEach>
  9. 增强foreach语句:
  10. items ==》要遍历的对象
  11. var ==》临时变量
  12. varStatus ==》循环状态对象,index容器中元素的索引,从零开始,count循环次数,从1开始
  13. <c:forEach items="${list}" var="user" varStatus="v">
  14. 索引值:index: ${v.index}
  15. 循环次数:count:${v.count}
  16. 用户名:${user.username},年龄:${user.age},密码:${user.password}<br>
  17. </c:forEach>
  1. choose语句:
  2. choose标签:相当于switch声明
  3. when标签:相当于case+break
  4. otherwise标签:相当于default
  5. <c:choose>
  6. <c:when test="${money == 7000}">
  7. 单身狗........
  8. </c:when>
  9. <c:when test="${money == 8000}">
  10. 屌丝........
  11. </c:when>
  12. <c:when test="${money == 15000}">
  13. 可以撩小妹妹........
  14. </c:when>
  15. <c:when test="${money >= 30000}">
  16. 来三个........
  17. </c:when>
  18. <c:otherwise>
  19. 想发家致富吗? 来找我,这不是梦想....
  20. </c:otherwise>
  21. </c:choose>

4、三层架构

表现层:

又称web层,与浏览器进行数据交互(控制器和视图)

业务逻辑层:

又称service层,处理业务数据

数据访问层:

又称dao层,与数据库进行交互,将数据持久化操作

5、小Demo

前端源码:

  1. <%--Date: 2021/6/16 Time: 16:49--%>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  4. <html>
  5. <head>
  6. <title>index</title>
  7. <link rel="stylesheet" href="css/mylayui.css">
  8. <%--引入layui的核心css--%>
  9. <link rel="stylesheet" href="layui/css/layui.css">
  10. <style type="text/css">
  11. td, th {
  12. text-align: center;
  13. }
  14. div{
  15. width: 80%;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div align="center">
  21. <a
  22. href="/userServlet" style="text-decoration:none;font-size:33px;color: #1E9FFF">查询所有用户信息
  23. </a>
  24. </div>
  25. <div class="layui-fluid">
  26. <table class="layui-table" lay-size="sm" lay-even >
  27. <tr>
  28. <th>编号</th>
  29. <th>姓名</th>
  30. <th>性别</th>
  31. <th>年龄</th>
  32. <th>籍贯</th>
  33. <th>QQ</th>
  34. <th>邮箱</th>
  35. <th>操作</th>
  36. </tr>
  37. <c:forEach items="${users}" var="user" varStatus="v">
  38. <tr>
  39. <td>${v.count}</td>
  40. <td>${user.name}</td>
  41. <td>${user.gender}</td>
  42. <td>${user.age}</td>
  43. <td>${user.address}</td>
  44. <td>${user.qq}</td>
  45. <td>${user.email}</td>
  46. <td><a class="layui-btn layui-btn-sm" href="">修改</a>&nbsp;<a class="layui-btn layui-btn-sm layui-btn-danger" href="">删除</a></td>
  47. </tr>
  48. </c:forEach>
  49. <tr>
  50. <td colspan="8" align="center"><a class="layui-btn layui-btn-normal" href="add.html">添加联系人</a></td>
  51. </tr>
  52. </table>
  53. </div>
  54. <%--嵌入一个页面到当前页面--%>
  55. <%@include file="/time.jsp"%>
  56. <%--引入layUI的核心js--%>
  57. <script src="layui/layui.js"></script>
  58. <script type="text/javascript">
  59. </script>
  60. </body>
  61. </html>

UserServlet源码:

  1. package com.yunhe.demo.web;
  2. import com.yunhe.demo.daomain.User;
  3. import com.yunhe.demo.service.UserService;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. import java.util.List;
  11. @WebServlet("/userServlet")
  12. public class UserServlet extends HttpServlet {
  13. @Override
  14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
  16. response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
  17. UserService userService = new UserService();
  18. //获取用户信息
  19. List<User> listUsers = userService.findUsers();
  20. request.setAttribute("users",listUsers);
  21. request.getRequestDispatcher("/userlist.jsp").forward(request,response);
  22. }
  23. @Override
  24. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  25. this.doPost(request, response);
  26. }
  27. }

UserService源码:

  1. package com.yunhe.demo.service;
  2. import com.yunhe.demo.dao.UserDao;
  3. import com.yunhe.demo.daomain.User;
  4. import java.util.List;
  5. public class UserService {
  6. UserDao userDao = new UserDao();
  7. //获取所有的用户信息
  8. public List<User> findUsers() {
  9. return userDao.findUsers();
  10. }
  11. }

UserDao源码:

  1. package com.yunhe.demo.dao;
  2. import com.yunhe.demo.daomain.User;
  3. import com.yunhe.demo.utils.JDBCUtils;
  4. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  5. import org.springframework.jdbc.core.JdbcTemplate;
  6. import java.util.List;
  7. public class UserDao {
  8. private static JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  9. public List<User> findUsers() {
  10. String sql = "SELECT * FROM USER";
  11. try {
  12. List<User> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
  13. return query;
  14. }catch (NullPointerException e){
  15. return null;
  16. }
  17. }
  18. }

User源码:

  1. public class User {
  2. private int id;
  3. private String name;
  4. private String gender;
  5. private int age;
  6. private String address;
  7. private String qq;
  8. private String email;
  9. //省略get,set,有参,无参,toString方法
  10. }