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指令:
page指令:errorPage当前页面报错后,跳转指定错误提示页面isErrorPage声明当前jsp页面是一个异常处理页面,打开异常开关`false`:(默认)`true`:可以操作exception异常对象include指令:<%@include file="xxx.jsp"%>页面包含的,导入页面的资源文件也就是在一个页面中指定区域显示另一个页面的内容taglib指令:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>导入资源,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. 早期只有servlet,只能使用response输出标签数据,非常麻烦servlet+javaBean2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,有写html的,造成难于维护,难于分工协作servlet + jsp + javaBean3. 再后来,java的web开发,借鉴mvc开发模式(C/S),使得程序的设计更加合理性
优点:
1、降低耦合性,方便维护和拓展,利于分工协作
2、可重用高
缺点:
使项目架构变得复杂
2、EL表达式
${表达式}
主要是从域对象中查找指定的数据
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="404.jsp" %><html><head><title>index</title><style type="text/css"> </style></head><body><h1>从域中获取数据:</h1><h3>获取字符串:</h3>str:${str} <br /><h3>获取数组:</h3>数组值1:${strs[0]} <br />数组值2:${strs[1]} <br />数组值3:${strs[2]} <br /><h3>获取对象:</h3>${user} <br />对象名:${user.name} <br />年龄:${user.age} <br /><h3>获取list集合:</h3>list集合值1:${list[0]} <br />list集合值2:${list[1]} <br />list集合值3:${list[2]} <br /><h3>获取map集合:</h3>map集合kye值1:${map.mapKey1} <br />map集合kye值2:${map.mapKey2} <br />map集合kye值3:${map.mapKey3} <br /><script type="text/javascript"> </script></body></html>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~package com.yunhe.servlet;import com.yunhe.domain.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.lang.reflect.Array;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@WebServlet("/useELServlet")public class UseELServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");// 处理post请求乱码问题response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法//存字符串到域中request.setAttribute("str","字符串");//存数组到域中String[] strs = {"数组值1","数组值2","数组值3",};request.setAttribute("strs",strs);//存对象到域中User user = new User("张三",13);request.setAttribute("user",user);//存list集合到域中List list = new ArrayList();list.add("list集合值1");list.add("list集合值2");list.add("list集合值3");request.setAttribute("list",list);//存map集合到域中Map<String,Integer> map = new HashMap();map.put("mapKey1",1);map.put("mapKey2",2);map.put("mapKey3",3);request.setAttribute("map",map);//转发到jsp页面request.getRequestDispatcher("/index.jsp").forward(request,response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}
EL运算符:
空运算符:empty
用于判断字符串,集合,数组对象是否为null或者长度是否为0
<%--相当于 if(user != null)--%>返回boolean类型,可用于判断用户是否登录user对象: ${not empty user} <br> 用户名不为空:提示欢迎语句user对象: ${empty user} <br> 用户名为空:提示登录登录
EL隐式对象:
el表达式中有11个隐式对象
pageContext可以获取其他八个隐式对象
常用的EL隐式对象:${pageContext.request.contextPath}表示项目名${cookie.JSESSIONID.value}获取Cookie的值
JavaBean:
1、所有的字段(成员变量)为private修饰
2、提供无参构造
3、提供get,set方法
4、实现Serializable接口(可序列化)
3、JSTL
1、导包
2、引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL常用标签库:
if语句:属性test --》必须属性,接收boolean表达式和空运算符配合使用,判断用户是否登录<c:if test= "${empty user}">您好,请登录</c:if> 若为真,显示标签内内容
foreach语句:属性begin --》开始值end ==》结束值var ==》临时变量step ==》步长<c:forEach begin="1" end="10" step="1" var="i">${i}: helloword <br></c:forEach>增强foreach语句:items ==》要遍历的对象var ==》临时变量varStatus ==》循环状态对象,index容器中元素的索引,从零开始,count循环次数,从1开始<c:forEach items="${list}" var="user" varStatus="v">索引值:index: ${v.index}循环次数:count:${v.count}用户名:${user.username},年龄:${user.age},密码:${user.password}<br></c:forEach>
choose语句:choose标签:相当于switch声明when标签:相当于case+breakotherwise标签:相当于default<c:choose><c:when test="${money == 7000}">单身狗........</c:when><c:when test="${money == 8000}">屌丝........</c:when><c:when test="${money == 15000}">可以撩小妹妹........</c:when><c:when test="${money >= 30000}">来三个........</c:when><c:otherwise>想发家致富吗? 来找我,这不是梦想....</c:otherwise></c:choose>
4、三层架构
表现层:
业务逻辑层:
数据访问层:
5、小Demo
前端源码:
<%--Date: 2021/6/16 Time: 16:49--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head><title>index</title><link rel="stylesheet" href="css/mylayui.css"><%--引入layui的核心css--%><link rel="stylesheet" href="layui/css/layui.css"><style type="text/css">td, th {text-align: center;}div{width: 80%;}</style></head><body><div align="center"><ahref="/userServlet" style="text-decoration:none;font-size:33px;color: #1E9FFF">查询所有用户信息</a></div><div class="layui-fluid"><table class="layui-table" lay-size="sm" lay-even ><tr><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>籍贯</th><th>QQ</th><th>邮箱</th><th>操作</th></tr><c:forEach items="${users}" var="user" varStatus="v"><tr><td>${v.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="layui-btn layui-btn-sm" href="">修改</a> <a class="layui-btn layui-btn-sm layui-btn-danger" href="">删除</a></td></tr></c:forEach><tr><td colspan="8" align="center"><a class="layui-btn layui-btn-normal" href="add.html">添加联系人</a></td></tr></table></div><%--嵌入一个页面到当前页面--%><%@include file="/time.jsp"%><%--引入layUI的核心js--%><script src="layui/layui.js"></script><script type="text/javascript"></script></body></html>
UserServlet源码:
package com.yunhe.demo.web;import com.yunhe.demo.daomain.User;import com.yunhe.demo.service.UserService;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 {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");// 处理post请求乱码问题response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法UserService userService = new UserService();//获取用户信息List<User> listUsers = userService.findUsers();request.setAttribute("users",listUsers);request.getRequestDispatcher("/userlist.jsp").forward(request,response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}
UserService源码:
package com.yunhe.demo.service;import com.yunhe.demo.dao.UserDao;import com.yunhe.demo.daomain.User;import java.util.List;public class UserService {UserDao userDao = new UserDao();//获取所有的用户信息public List<User> findUsers() {return userDao.findUsers();}}
UserDao源码:
package com.yunhe.demo.dao;import com.yunhe.demo.daomain.User;import com.yunhe.demo.utils.JDBCUtils;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class UserDao {private static JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());public List<User> findUsers() {String sql = "SELECT * FROM USER";try {List<User> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));return query;}catch (NullPointerException e){return null;}}}
User源码:
public class User {private int id;private String name;private String gender;private int age;private String address;private String qq;private String email;//省略get,set,有参,无参,toString方法}
