1.回顾
1. jsp中9大内置对象:
out: 输出对象
request: 请求对象
response: 响应对象
session: 会话对象
========================================
application: 应用对象
pageContext: 上下文对象。 通过这个对象可以获取其他八个对象。
page:对象 this
exception:异常对象
config: 配置对象
2. jsp的4大域对象. ---存储到这个四个对象的数据,它的作用范围不同/
pageContext: 只在当前页面有效。
request: 同一个请求内有效。
session: 同一个会话【用户】
application: 同一个应用。 setAttribute(key,value) getAttribute(key);
3. 页面跳转 【1】重定向跳转 【2】请求转发跳转。
response.sendRedirect("地址");
request.getRequestDispacther("地址").forward(request,response);
2. 重定向和请求转发的区别
重定向:
请求转发:
区别:
1. 重定向地址栏会发生改变,而且会产生新的请求对象。无法获取request保存的数据。
2. 请求转发地址栏不会发生改变,而且用的是同一个请求对象。可以获取request保存的数据。
保存周期越长,占用的资源时间也就越长。 一般我们在开发时大部分数据习惯保存到request对象中。 只要少量的数据保存到session会话中。比如登录时用户的信息保存到session会话中。
3.jstl标签库和EL表达式
3.1.EL表达式
EL表达式-->作用: 获取四大域对象中数据。
语法: ${xxxScope.key}
我们原来通过xxx.getAttribute(key)也可以获取到四大域中的数据,为什么还要使用EL表达式,因为EL表达式语法更加简洁。而且后期可以与我们的jstl标签库一起使用。如果EL表达式没有找到对于的key,则返回空字符串 "".
EL表达式属于jsp或者后面讲解thymeleaf的语法
<%--
Created by IntelliJ IDEA.
User: ykq
Date: 2022/5/16
Time: 14:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//往四大域存储数据
pageContext.setAttribute("name","pageContext的内容");
request.setAttribute("name","request的内容");
session.setAttribute("name","session的内容");
application.setAttribute("name","application的内容");
%>
<hr>
通过getAttribute()获取四大域对象的内容<br>
<%=pageContext.getAttribute("name")%><br>
<%=request.getAttribute("name")%><br>
<%=session.getAttribute("name")%><br>
<%=application.getAttribute("name")%><br>
<hr>
通过el表达式获取四大域对象的内容<br>
${pageScope.name}<br>
${requestScope.name}<br>
${sessionScope.name}<br>
${applicationScope.name}<br>
</body>
</html>
el表达式 还可以省略scope ${key} 那么它会从哪个对象中获取数据。默认从pageContext扫描有没有对于的key,如果有则不继续往下扫描了,如果没有则继续往下扫描request, 以此类推。
不指定范围<br>
${name}<br>
${name}<br>
${name}<br>
${name}<br>
3.2 jstl标签库
里面提供了一些常用的标签---比如: 循环标签 判断标签。
使用这些标签的作用是为了减少jsp中java脚本代码的添加。 企业不建议大家在jsp中使用太多的<%%> 这样会使得网页比较乱。 这时就有人提供了JSTL标签库。
如何使用jstl标签库:
(1)web工程中引入jstl标签库的依赖
(2)在使用jstl标签的jsp网页上引入该标签库
<%--jsp网页的头部引入jstl核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
(3)使用
<%@ page import="com.ykq.entity.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: ykq
Date: 2022/5/16
Time: 15:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--jsp网页的头部引入jstl核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//这里保存数据的目标就是为了操作方便。这些数据都是从数据库中查询。
List<User> list=new ArrayList<>();
list.add(new User(1,"张胜男","北京",25,0));
list.add(new User(2,"李四","杭州",35,1));
list.add(new User(3,"王五","上海",15,1));
list.add(new User(4,"赵六","郑州",55,1));
request.setAttribute("users",list);//把集合保存到request对象中了。
%>
<table border="1" width="500">
<tr>
<td>编号</td>
<td>姓名</td>
<td>地址</td>
<td>年龄</td>
<td>性别</td>
</tr>
<!--使用jstl标签库循环遍历request中保存的集合
forEach遍历:
items:表示要遍历的集合或数组
var: 表示遍历集合时,把集合中每个元素的只赋值给该变量
-->
<%--
if: 条件判断
test:表示条件。如果条件成立则if语句块被执行。
--%>
<c:forEach items="${users}" var="u">
<tr>
<td>${u.id}</td>
<td>${u.name}</td>
<td>${u.address}</td>
<td>${u.age}</td>
<c:if test="${u.sex==0}">
<td>男</td>
</c:if>
<c:if test="${u.sex==1}">
<td>女</td>
</c:if>
</tr>
</c:forEach>
</table>
</body>
</html>
4. servlet 控制层
4.1.什么是servlet?
就是java类代码。它可以接收前端页面传递的数据,同时也可以把后端查询的结果响应给前端,以供前端能把数据展示到jsp网页。
MV:模式 只有视图层(view)--jsp和模型层(model) [dao+entity] 。存在的问题: 因为很多java代码都写在网页里面,随着现在技术的不断发展,view视图不仅有pc视图,还有手机视图,平板视图,智能ai视图。 这些在jsp中插入的java代码需要在别的视图再写一遍。
MVC模式: 视图(view ) 模型(dao+entity) 控制层(servlet)
4.2.为什么使用servlet
4.3 如何使用servlet
(1) 引入servlet-api.jar包
(2) 创建一个类并继承HttpServlet父类
public class HelloServlet extends HttpServlet {
}
(3) 重写HttpServlet中service方法。---进行业务处理的
//可以接受前端传递的参数 也可以把后端查询的数据保存并让前端获取
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
(4) 把自定义servlet配置到web.xml文件中
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--注册我们自定义的servlet. 表示该servlet交于tomcat容器帮你创建对象了。
HelloServlet helloServlet =new HelloServlet();//容器创建
-->
<servlet>
<servlet-name>helloServlet</servlet-name> //servlet的名称可以自定义只要不重名
<servlet-class>com.ykq.servlet.HelloServlet</servlet-class>
</servlet>
<!--配置请求路径与servlet的映射关系-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
测试:
4.4 通过servlet完成了登录功能
跟之前的登录一样,无非把处理页面 换为 servlet 然后配置web.xml