目录
1.技术要求
2.关于会话Session
生活例子
代码体现
1.存储到session
2.从session中拿出
3.完成登录功能
4.利用Session作追踪
关于jstl应用
关于EL表达式应用
注意
5.测试
1.技术要求
核心:
(1)Servlet项目的搭建
(2)JDBC的连接
(3)基本登录逻辑代码实现
(4)会话Seesion的应用
辅助:
(1)JSP页面中表格编写(html)
(2)JSTL与EL表达式的简单使用(如<c:if>和<c:each>)
2.关于会话Session
在Servlet中进行会话追踪通常涉及使用HTTPSession对象来保存和管理会话数据。对于登录功能,通常的做法是在用户成功登录后,创建一个
HttpSession
对象,将用户的相关信息存储在HttpSession
中,然后将HttpSession
的ID存储在用户的浏览器中,通常使用cookie来实现这一点。
生活例子
当我们使用学生卡来介绍Session时,可以类比为学生卡上存储了学生的个人信息,用于识别和管理学生的身份。让我们来看看具体的例子:
假设你是一名学生,学校为每位学生发放了一张学生卡,里面存储了你的姓名、学号、班级等个人信息。这张学生卡可以帮助学校和老师辨认你的身份,管理你的学习和其他事务。
现在我们将学生卡比作Session,在这个类比中:
-
登记过程:当你第一次进入学校时,学校登记了你的个人信息(相当于在服务器端创建了一个Session)。这个过程中,你被分配了一个唯一的学生卡号(Session ID),用来标识你的身份。
-
使用学生卡:在接下来的学习过程中,你需要频繁使用学生卡来证明自己的身份。老师和学校工作人员可以通过查看你的学生卡(Session ID)来确认你的个人信息(Session中的数据)。
-
过期与注销:如果你离开学校或学校识别出你的学生卡有问题,学生卡可能会被注销。类似地,在Web开发中,Session也有过期和失效的时间,一段时间没有活动或者用户注销登录时,Session会被清除。
代码体现
session作为会话,用于识别用户信息,便于在各个页面中(如jsp)和不同的Servlet(get或post请求)中使用,存取session中的属性。因此它是能够允许在不同的Servlet和jsp(jsp也是一种特殊的servlet)中共享的。
代码表现为:
1.存储到session
req.getSession().setAttribute("<标签名>", <具体内容>);
如下:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应内容类型为html或text页面
resp.setContentType("text/html");
// 设置响应字符类型识别为UTF-8 即中文
resp.setCharacterEncoding("UTF-8");
// 创建学生类集合
ArrayList<Student> students = new ArrayList<>();
Student student1 = new Student("张三", 20);
Student student2 = new Student("李四", 21);
students.add(student1);
students.add(student2);
// 获取HttpSession对象,将集合students存在session中,并打上标签名“students”
req.getSession().setAttribute("students", students);
}
如果是在jsp页面中,则为:<% session.setAttribute("<标签名>", <具体内容>);%>
如下:
<%@ page import="com.entity.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Student student = new Student("张三",23);
Student student1 = new Student("李四", 24);
ArrayList<Student> students = new ArrayList<>();
students.add(student);
students.add(student1);
System.out.println(students);
session.setAttribute("students",students);
// 将数据存储在session中
%>
</body>
</html>
2.从session中拿出
req.getSession().getAttribute("<标签名>");
如下:
req.getSession().setAttribute("students", students);
req.getAttribute("students");
如在jsp页面中,则为
<% session.getAttribute("<标签名>); %>
如下:
session.setAttribute("students",students);
// 将数据存储在session中
session.getAttribute("studenrts");
// 将数据从session中取出
3.完成登录功能
登录核心逻辑是,用户传来其账号和密码,服务器接收后通过和数据库中的用户信息表作比对,判断用户输入的内容是否存在表中,若存在,则说明是该网站的用户;反之则不存在,可以让用户重新登录或注册账号
核心代码:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
// 通过getParamter
try {
Connection connection = JDBCUtil.getConnection();
Statement statement = JDBCUtil.getStatement(connection);
ResultSet resultSet = statement.executeQuery("select * from user where username = '" + username + "' and password = '" + password + "'");
// 上述过程分别为获取连接、获取statement、执行查询语句、获取结果集
if(resultSet.next()){ // 如果结果集不为空,则表示查询到用户,将关键信息存在session中允许向其展示内容,跳转到首页
req.getSession().setAttribute("username",username);
resp.sendRedirect("/jsp/success.jsp");
}else{ // 如果结果集为空,则表示未查询到用户,跳转到错误页面或回到登录页面
resp.sendRedirect("/jsp/error.jsp");
}
} catch (SQLException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
将上述注册为一个Servlet,可以有两种方式:web.xml中配置或使用WebServlet注解
或
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.Demo1.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/zhan</url-pattern>
</servlet-mapping>
</web-app>
上述两个方式是等价的
4.利用Session作追踪
在上一步中,我们将一个提供正确账号密码的用户信息存储在session中,接下来便可以在任何其它页面中利用session里面的数据作快速判断,是否用户是带着登录信息到达该页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:if test="${sessionScope.username==null}">
<% response.sendRedirect("/jsp/error.jsp"); %>
</c:if>
<c:if test="${sessionScope.username!=null}">
<h1>你被识别为本网站用户,可查看数据!</h1>
</c:if>
</body>
</html>
上述用到了jstl标签库中的<c:if>以及EL表达式中的${}格式,这个极大程度上方便了java代码和html代码的结合
关于jstl应用
应用jstl标签库,你需要导入两个jar包到WEB-INF中的lib目录下
jstl的下载网址jstl jar包下载
选择该项:
解压文件后,在lib文件夹会获得两个jar包: standard.jar和jstl.jar
需要把这两个jar包导入到项目中,注意:
载入外来包,我们不介意采取:右击项目——Build Path方式,因为这样只是引入了一个jar包的link进来,如果把项目挪动位置或者把jar包删除了,则报错。所以我们推荐直接把要载入的文件复制到:项目——WebRoot\WEB-INF\lib里面,不要忘了把jar包选中——右键——Build Path----Add to Build Path。或直接将lib右键--Add as library,这样做可以让jar包随着项目走,绑在了一起。
关于EL表达式应用
EL表达式不需要引入额外jar包,在jsp页面中体现为"${}"形式,其中较为常用的是${sessionScope.<标签名>}与${requestScope.<标签名>} 其作用分别是取得session和request中对应标签名的数据
注意
有些配置可能会默认不开启EL表达式功能,这时候我们需要用代码显式表达在jsp页面中,告知该页面要启用EL表达式的识别功能
我们只需在jsp页面顶端添加代码即可:
<%@ page isELIgnored="false" %>
5.测试
首先我们未在登录页面进行验证的情况下,直接访问该网址:
此时页面就跳转到了失败页面
接下来我们在登录页面中提交信息
提交后到达核心数据页面