一.整个系统的结构图
首先确认登录系统的框架如下:注册可以是和登录同级的,注册功能比较单一所有主要重心放在登录页面上
登录成功将添加Session可用于后续获取是否登录状态从而进行拦截等操作,注销则删除Session删除数据库中的数据,查询则需要用到jstl和el表达式打印在页面上,而注销需要在数据库增加用户输入的数据
二.实现步骤
1.JSP页面编写
首先写出首页,即登录页面,使用form标签编写表单获取用户输入的数据,action即该表单映射的servlet文件,通俗来说例如:servlet文件写了/a,jsp文件中的表单也写了/a则这个servlet可以编写一些代码来操控jsp,method则是返回的方法,如我这里是post,那我们就可以在servlet中的dopost方法获取表单的数据或编写某些程序,如果没有声明则会默认在doget方法。
按钮中的type:"submit"意思是提交表单,则是运行所映射的servlet文件,而注册的跳转则是使用a标签,因为注册页面是可以和登录同级,并不需要做拦截之类的操作。
接下来就是登录失败的页面
这是登录成功的页面,要实现以上修改密码、查询用户、注销的分支操作
这里所映射的路径为 “/true” ,登录成功嘛顾名思义就是true,统一返回post,提交按钮要设置一个名字,因为这三个操作是同级的所有起同样的名字,但是要给他们设置不一样的值可以供servlet判断,从而进行不同的操作,就像人可以有相同的名字但是不能有同样的爹妈。
2.servlet的编写
首先要注册servlet即 @WebServlet(JSP所映射的路径),然后继承HttpServlet,如下:
@WebServlet("/login")
public class login extends HttpServlet {
}
然后点击快捷键 Ctrl+O重写继承下来的doGet和doPost方法
public class login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
注意:要删除父类的方法,即super
@WebServlet("/login")
public class login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);//删除此行
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);//删除此行
}
}
然后在doPost方法中使用封装好的JDBC类,这里要用try–catch语句抛出异常
try {
Connection connection= jdbclib.getConnection();
Statement statement=jdbclib.getStatement(connection);
ResultSet resultSet=jdbclib.resultSet(statement);
//方法里面有查询功能
//封装的jdbc代码
while (resultSet.next()){
String u= resultSet.getString("userid");
String p= resultSet.getString("userpa");
//这里的userid和userpa是数据库里面的字段名
}
jdbclib.Close(resultSet,statement,connection);
//关闭数据库,释放内存
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
}
获取用户输入的数据,核心代码
String us= req.getParameter("uu");
String pa= req.getParameter("pp");
//获取用户输入的数据(账号,密码)
注意是getParameter不是getAttribute,很多人会搞错
既然能获取用户输入的数据那接下来就可以独自创作,我这里是创建一个HashMap集合存储数据库里面的数据,用于和用户输入的数据进行比较若是账号密码都符合就设置Session值(用于进行拦截,判断用户状态等功能), 随之跳转到登录成功页面
以下是doPost方法的代码
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String us= req.getParameter("uu");
String pa= req.getParameter("pp");
//获取用户输入的数据(账号,密码)
HashMap<String,String>hashMap=new HashMap<>();
//创建一个hashmap集合存储数据库里面的数据
try {
Connection connection= jdbclib.getConnection();
Statement statement=jdbclib.getStatement(connection);
ResultSet resultSet=jdbclib.resultSet(statement);
//封装的jdbc代码
while (resultSet.next()){
String u= resultSet.getString("userid");
String p= resultSet.getString("userpa");
hashMap.put(u,p);
//while循环将数据放入hashmap集合
}
jdbclib.Close(resultSet,statement,connection);
//关闭数据库,释放内存
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
}
//以下判断账号密码是否正确,跳转页面
if (us.length()>0&&us.length()<6&&pa.length()>0&&pa.length()<6) {
if (hashMap.containsKey(us)) {
if (hashMap.get(us).equals(pa)) {
req.getSession().setAttribute("Suserid",us);
req.getSession().setAttribute("Spassword",pa);
//设置Session值
req.getSession().setAttribute("founduser",hashMap.keySet());
req.getRequestDispatcher("/JSP/win.jsp").forward(req, resp);
} else {
req.getRequestDispatcher("/JSP/lost.jsp").forward(req, resp);
}
} else {
req.getRequestDispatcher("/JSP/lost.jsp").forward(req, resp);
}
}else {
req.getRequestDispatcher("/JSP/notsystem.jsp").forward(req,resp);
}
}
实现跳转的核心代码
req.getRequestDispatcher("要跳转的文件路径").forward(req,resp);
接下来就是编写以上jsp所映射的/true的servlet类(登录成功页面)按照以上的方法注册servlet和继承重写,该类所映射的路径为上面Jsp里面的/ture,在Post里面判断用户点击的是哪个按钮,从而跳转相对应的页面
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String a= req.getParameter("x");
if (a.equals("1")){
req.getRequestDispatcher("/JSP/signOut.jsp").forward(req,resp);
}
if (a.equals("2")){
req.getRequestDispatcher("/JSP/founduser.jsp").forward(req,resp);
}
if (a.equals("3")){
req.getRequestDispatcher("/JSP/setpa.jsp").forward(req,resp);
}
}
这里获取的是jsp里面按钮的value值,然后进行判断,接下来的功能就是JDBC的增删改查
3.用户查询功能(这里需要用到jstl和el表达式)
这个功能需要把所有用户循环输出给用户
首先在jsp文件里面顶处输入
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
来声明引用jstl用for循环打印数据,body里面的代码为
<body>
<c:forEach var="a" items="${sessionScope.founduser}">
<h2>${a}</h2>
<br>
</c:forEach>
</body>
此处的$符号则是引用el表达式,sessionScope即是获取上级的Session
4.如何实现拦截,什么是拦截?
1.什么是拦截?
拦截就是为了不让用户通过直接输入访问的方式直接访问如登录成功等类似的页面,比如用户还没有登录就直接访问登录成功的页面从而使用登录后才有的功能,因此则需要在用户访问的时候进行拦截
2.如何实现拦截
直接访问没有声明返回的方法是post,则默认使用doget方法,因此需要在doget方法里面编写拦截器,说白了就是在登录成功的时候添加Session,然后在doget方法判断Session是否为空,如果为空则拦截用户,不让用户访问,代码如下:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if (req.getSession().getAttribute("Suserid")==null||req.getSession().getAttribute("Spassword")==null){
req.getRequestDispatcher("/JSP/lost.jsp").forward(req,resp);
}else {
req.getRequestDispatcher("/JSP/win.jsp").forward(req,resp);
}
}
这里是拦截的话直接跳转登录失败页面
三.致谢
在此向传奇撰稿人@螺蛳粉好不好吃老师,致以最崇高的敬意,我从他的身上学到了许多。