一、Cookie
1.1 会话介绍
- 会话: 浏览器和服务器之间的多次请求和响应。
- 为了实现一些功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器、到了过期时间)。这期间产生的多次请求和响应加在一起就称之为浏览器和服务器之间的一次会话。
- 会话过程中所产性的一些数据,可以通过会话技术( Cookie和Session )保存。
1.2 Cookie介绍
- Cookie :客户端会话管理技术
把要共享的数据保存到客户端。
每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享! - 作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率!
1.3 Cookie属性
1.4 Cookie的方法
1.5 Cookie的添加和获取
1.6 Cookie的使用
- 需求说明
通过Cookie记录最后访问时间,并在浏览器上显示出来。 - 最终目的.
掌握Cookie的基本使用,从创建到添加客户端,再到从服务器端获取。 - 实现步骤
1.通过响应对象写出一一个提示信息。
2.创建Cookie对象,指定name和value。
3.设置Cookie最大存活时间。
4.通过响应对象将Cookie对象添加到客户端。
5.通过请求对象获取Cookie对象。
6.将Cookie对象中的访问时间写出。
package com.itjc.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;
/*
Cookie的使用
*/
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.通过响应对象写出提示信息
resp.setContentType("text/html;charset=UTF-8");
PrintWriter pw = resp.getWriter();
pw.write("欢迎访问本网站,您的最后访问时间为: <br>");
//2.创建Cookie对象,用于记录最后访问时间
Cookie cookie = new Cookie("time", System.currentTimeMillis() + "");
//3.设置最大存活时间
cookie.setMaxAge(3600);
//4.将cookie对象添加到客户端
resp.addCookie(cookie);
//5.获取ookie
Cookie[] cookies = req.getCookies();
for (Cookie c : cookies) {
System.out.println(c);
if ("time".equals(c.getName())) {
// 6、获取cookie中的value
String value = c.getValue();
// System.out.println(value);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pw.write(sdf.format(new Date(Long.parseLong(value))));
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
1.7 Cookie的细节
- 数量限制
每个网站最多只能有20个Cookie
,且大小不能超过4KB。所有网站的Cookie
总数不能超过300个。 - 名称限制
Cookie
的名称只能包含ASCII
码表中的字母、数字字符。不能包含逗号、分号、空格,不能以$开头。
Cookie
的值不支持中文。 - 存活时间限制
setMaxAge()
方法接收数字
负整数:当前会话有效,浏览器关闭则清除。
0 :立即清除。
正整数:以秒为单位设置存活时间。 - 访问路径限制
默认路径:取自第一次访问的资源路径前缀。 只要以这个路径开头就能访问到。
设置路径:setPath()
方法设置指定路径。
二、Session
2.1 HttpSession介绍
- HttpSession :服务器端会话管理技术
本质也是采用客户端会话管理技术。
只不过在客户端保存的是一个特殊标识,而共享的数据保存到了服务器端的内存对象中。
每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享!
是Servlet规范中四大域对象之一-的会话域对象。 - 作用:可以实现数据共享
2.2 HttpSession常用方法
2.3 HttpSession获取
- HttpSession实现类对象是通过
HttpServletRequest
对象来获取。
2.4 HttpSession的使用
- 需求说明
通过第一个Servlet设置共享数据用户名,并在第=个Servlet获取到。 - 最终目的
掌握HttpSession的基本使用,如何获取和使用。 - 实现步骤
1.在第一个Servlet
中获取请求的用户名。
2.获取HttpSession
对象。
3.将用户名设置到共享数据中。
4.在第1个Servlet
中获取HttpSession
对象。
5.获取共享数据用户名。
6.将获取到用户名响应给客户端浏览器。
package com.itjc.servlet;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取请求的用户名
String username = req.getParameter("username");
//2.获取Ht tpSession的对象
HttpSession session = req.getSession();
System.out.println(session);
System.out.println(session.getId());
session.setAttribute("username", username);
//3.将用户名信息添加到共享数据中
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.itjc.servlet;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.SimpleDateFormat;
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取Ht tpSession的对象
HttpSession session = req.getSession();
System.out.println(session);
System.out.println(session.getId());
//2. 获取共享数据
Object username = session.getAttribute("username");
// 3、响应给浏览器
resp.getWriter().write(username + "");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.5 HttpSession的细节
- 唯一标识的查看
- 浏览器禁用Cookie
方式一:通过提示信息告知用户,大部分网站采用的解决方式。(推荐)
方式二:访问时拼接jsessionid
标识,通过encodeURL()
方法重写地址。(了解) - 钝化和活化
- 什么是钝化和活化
钝化:序列化。把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上。
活化:相反的状态。 - 何时钝化
第一种情况:当访问量很大时,服务器会根据getLastAccessTime来进行排序,
对长时间不用,但是还没到过期时间的HttpSession进行序列化。
第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对其进行序列化。 - 注意
HttpSession的序列化由服务器自动完成,我们无需关心。
访问servletDemo01
和servletDemo02
输出的结果
package com.itjc.servlet;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//1.获取Ht tpSession的对象
HttpSession session = req.getSession(false);
if (session == null) {
resp.getWriter().write("对不起,请解除对cookie的禁用再次尝试!");
} else {
System.out.println(session);
System.out.println(session.getId());
//2. 获取共享数据
Object username = session.getAttribute("username");
// 3、响应给浏览器
resp.getWriter().write(username + "");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
方式二:访问时拼接jsessionid
标识,通过encodeURL()
方法重写地址。(了解)
package com.itjc.servlet;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取请求的用户名
String username = req.getParameter("username");
//2.获取Ht tpSession的对象
HttpSession session = req.getSession();
System.out.println(session);
System.out.println(session.getId());
//3.将用户名信息添加到共享数据中
session.setAttribute("username", username);
//实现url重写 相当于在地址栏中拼接了一个jessionid
resp.getWriter().write("<a href='" + resp.encodeURL("http://localhost:8989/session/servletDemo03") + "'>go ServletDemo03</a>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
1、request.setAttribute 作用域是请求和被请求页面之间。
request.setAttribute()是只在此action的下一个forward需要使用的时候使用 ;
request.setAttribute()可存放的参数是String和Object。
2、session.setAttribute 作用域是整个会话期间,在所有的页面都使用这些数据的时候使用。会话期间指的是浏览器打开该页面,到关闭。 一般用于存放用户信息。
request.setAttribute()可存放的参数是String和Object。
三、Jsp
3.1 JSP介绍
- JSP(Java Server Pages) :是- -种动态网页技术标准。
- JSP 部署在服务器上,可以处理客户端发送的请求,并根据请求内容动态的生成HTML、XML 或其他格式文档的Web网页,然后再响应给客户端。
- JSP 是基于Java语言的,它的本质就是Servlet。
3.2 JSP快速入门
1.创建 一个web
项目。
2.在web目录下创建一个index.jsp
文件。
3.在文件中写一句内容为:这是我的第一个jsp
。
4.部署并启动项目。
5.通过浏览器测试。
3.3 JSP执行过程
3.4 JSP文件内容介绍
index_jsp
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.31
* Generated at: 2021-09-18 03:51:35 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.*;
public final class index_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 = null;
}
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("\n");
out.write("\n");
out.write("<html>\n");
out.write("<head>\n");
out.write(" <title>$Title$</title>\n");
out.write("</head>\n");
out.write("<body>\n");
out.write("<h1>第一个jsp页面</h1>\n");
out.write("</body>\n");
out.write("</html>\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);
}
}
}
HttpJspBase
package org.apache.jasper.runtime;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.HttpJspPage;
import org.apache.jasper.compiler.Localizer;
public abstract class HttpJspBase extends HttpServlet
implements HttpJspPage
{
private static final long serialVersionUID = 1L;
public final void init(ServletConfig config)
throws ServletException
{
super.init(config);
jspInit();
_jspInit();
}
public String getServletInfo()
{
return Localizer.getMessage("jsp.engine.info");
}
public final void destroy()
{
jspDestroy();
_jspDestroy();
}
public final void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
_jspService(request, response);
}
public void jspInit()
{
}
public void _jspInit()
{
}
public void jspDestroy()
{
}
protected void _jspDestroy()
{
}
public abstract void _jspService(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse)
throws ServletException, IOException;
}
3.5 Jsp语法
- JSP注释
< %--注释的内容--%>
- Java 代码块
<%
System. out. printIn( "He11o JSP");//普通输出语句,输出在控制台
out. printIn("He11o JSP");
//out是JspWriter对象,输出在页面上
%>
- JSP 表达式
<%="He11o"%> //相当于out. print1n("He11o");
- JSP声明
< %!声明变量或方法%>
//如果加!代表的是声明的是成员变量 方法一定要加!
//如果不加!代表的是声明的是局部变量
3.6 JSP指令
- page 指令
<%@ page属性名=属性值属性名=属性值... %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="/error.jsp" %>
- include 指令:可以包含其他页面
<%@ include file=包含的页面%>
<%@include file="include.jsp" %> //使用其他页面的变量
- taglib 指令:可以引入外部标签库
<%@ taglib uri=标签库的地址 prefix =前缀名称%>
3.7 JSP细节
- 九大隐式对象
- PageContext 对象
是JSP独有的, Servlet中没有。
是四大域对象之一的页面域对象,还可以操作其他3三个域对象中的属性。
还可以获取其他八个隐式对象。
生命周期是随着JSP的创建而存在,随着JSP的结束而消失。每个JSP页面都有一个PageContext对象。
- 四大域对象
3.8 MVC模型
- M(Model) :模型。用于封装数据,封装的是数据模型!
- V(View) :视图。用于显示数据,动态资源用JSP页面,静态资源用HTML页面!
- C(Controller) :控制器。用于处理请求和响应,例如Servlet !
四、学生管理系统
4.1 案例效果
4.2 登录功能实现
1.创建一个web项目。
2.在web目录下创建一个index:jsp.
3.在页面中获取会话域中的用户名,获取到了就显示添加和查看功能的超链接,没获取到就显示登录功能的超链接。
4.在web目录下创建一个loginjsp.实现登录页面。
5.创建LoginServlet ,获取用户名和密码。
6.如果用户名为空,则重定向到登录页面。
7.如果不为空,将用户名添加到会话域中,再重定向到首页。
创建一个web项目,在 web 目录下创建一个 index.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生管理系统首页</title>
</head>
<body>
<%--
获取会话域中的数据
如果获取到了则显示添加和查看功能的超链接
如果没获取到则显示登录功能的超链接
--%>
<% Object username = session.getAttribute("username");
if(username == null) {
%>
<a href="/stu/login.jsp">请登录</a>
<%} else {%>
<a href="/stu/addStudent.jsp">添加学生</a>
<a href="/stu/listStudentServlet">查看学生</a>
<%}%>
</body>
</html>
在 web 目录下创建一个 login.jsp。实现登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生登录</title>
</head>
<body>
<form action="/stu/loginStudentServlet" method="get" autocomplete="off">
姓名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
<button type="submit">登录</button>
</form>
</body>
</html>
3.1.3 创建 LoginStudentServlet,获取用户名和密码
package com.itheima.servlet;
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;
/*
学生登录
*/
@WebServlet("/loginStudentServlet")
public class LoginStudentServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取用户名和密码
String username = req.getParameter("username");
String password = req.getParameter("password");
//2.判断用户名
if(username == null || "".equals(username)) {
//2.1用户名为空 重定向到登录页面
resp.sendRedirect("/stu/login.jsp");
return;
}
//2.2用户名不为空 将用户名存入会话域中
req.getSession().setAttribute("username",username);
//3.重定向到首页index.jsp
resp.sendRedirect("/stu/index.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
4.3 添加功能实现
在 web 目录下创建一个 addStudent.jsp,实现添加学生的表单项
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加学生</title>
</head>
<body>
<form action="/stu/addStudentServlet" method="get" autocomplete="off">
学生姓名:<input type="text" name="username"> <br>
学生年龄:<input type="number" name="age"> <br>
学生成绩:<input type="number" name="score"> <br>
<button type="submit">保存</button>
</form>
</body>
</html>
创建 AddStudentServlet,获取学生信息并保存到文件中
package com.itheima.servlet;
import com.itheima.bean.Student;
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.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/*
实现添加功能
*/
@WebServlet("/addStudentServlet")
public class AddStudentServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取表单中的数据
String username = req.getParameter("username");
String age = req.getParameter("age");
String score = req.getParameter("score");
//2.创建学生对象并赋值
Student stu = new Student();
stu.setUsername(username);
stu.setAge(Integer.parseInt(age));
stu.setScore(Integer.parseInt(score));
//3.将学生对象的数据保存到d:\\stu.txt文件中
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\stu.txt",true));
bw.write(stu.getUsername() + "," + stu.getAge() + "," + stu.getScore());
bw.newLine();
bw.close();
//4.通过定时刷新功能响应给浏览器
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("添加成功。2秒后自动跳转到首页...");
resp.setHeader("Refresh","2;URL=/stu/index.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
4.4 查看学生功能
创建 ListStudentServlet,读取文件中的学生信息到集合中
1、将集合添加到会话域中
2、重定向到 listStudent.jsp 页面上
package com.itheima.servlet;
import com.itheima.bean.Student;
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.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
/*
实现查看功能
*/
@WebServlet("/listStudentServlet")
public class ListStudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建字符输入流对象,关联读取的文件
BufferedReader br = new BufferedReader(new FileReader("d:\\stu.txt"));
//2.创建集合对象,用于保存Student对象
ArrayList<Student> list = new ArrayList<>();
//3.循环读取文件中的数据,将数据封装到Student对象中。再把多个学生对象添加到集合中
String line;
while((line = br.readLine()) != null) {
//张三,23,95
Student stu = new Student();
String[] arr = line.split(",");
stu.setUsername(arr[0]);
stu.setAge(Integer.parseInt(arr[1]));
stu.setScore(Integer.parseInt(arr[2]));
list.add(stu);
}
//4.将集合对象存入会话域中
req.getSession().setAttribute("students",list);
//5.重定向到学生列表页面
resp.sendRedirect("/stu/listStudent.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
在 web 目录下创建一个 listStudent.jsp
<%@ page import="com.itheima.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>查看学生</title>
</head>
<body>
<table width="600px" border="1px">
<tr>
<th>学生姓名</th>
<th>学生年龄</th>
<th>学生成绩</th>
</tr>
<% ArrayList<Student> students = (ArrayList<Student>) session.getAttribute("students");
for(Student stu : students) {
%>
<tr align="center">
<td><%=stu.getUsername()%></td>
<td><%=stu.getAge()%></td>
<td><%=stu.getScore()%></td>
</tr>
<%}%>
</table>
</body>
</html>