javaweb期末大作业

发布时间 2023-12-21 12:46:57作者: E_sheep

本次代码总共包括22个jsp页面15个sevlet文件

image

image

核心框架: JSP+Servlet+JavaBean+DAO

本项目也是MVC架构,JavaBean(M),JSP(v),Servlet(C),并且加入了DAO模式。
DAO 模式实现了把数据库表的操作转化成对Java类的操作,即利用关系数据库实现数据库的操作,对于Java语言或JSP,在实现数据库操作时,可以采用将数据库表和普通的Java类映射,将数据表转换 类(对象),然后利用对象实现对数据库的操作,从而提高了程序的可读性以及实现了更改数据库的方便性。

DAO 模式是进行Java 数据库开发的最基本的设计模式,就是把对数据库表的操作转化为对Java类的操作。
DAO 模式最多是与JDBC、SQL、Hibernate 等数据库应用技术结合在一起一同使用。其架构图如下:
image

在系统设计中,采用 DAO 模式的主要优点如下:
1)抽象出数据访问方式(增、删、改、查等),在访问数据源(数据库)时,完全感觉不到数据源(数据库)的存在。
2)将数据访问集中在独立的一层,所有数据访问都由DAO 代理,从而将数据访问的实现与系统的其余部分

JavaWeb项目主要使用了以下技术:

后端:
Java Servlet:用于处理客户端请求并生成动态的Web内容。
Java Server Pages (JSP):用于创建动态的Web页面。
Java Database Connectivity (JDBC):用于在Java程序中连接和操作数据库。
JavaBean:用于封装数据和业务逻辑的Java类。
Java Filter:用于在请求处理过程中拦截和处理请求。
Java Listener:用于监听和处理JavaWeb应用程序中的事件。
Java Standard Tag Library (JSTL):用于简化JSP页面中的标签操作。
前端:
bootstarp 前端框架 : 更快速、更便捷地构建美观的网站和 Web 应用程序
JSTL 技术: 用于简化JSP页面中的标签操作
Ajax 技术: 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

创新点:

  1. 不同服务向的页面,有着不同风格的背景音乐,给用户沉浸式的体验
  2. 响应式布局,手机画面内容自动缩放
  3. 实现了同一登录界面,不同用户登录,看到的界面不同
  4. 使用方便,动画丰富,简洁明了

核心代码介绍

JavaBean

JavaBean 目录下的 guanliyuan.java 和 Student.java:定义了两个JavaBean类,分别用于表示管理员和学生的信息。

guanliyuan.java

image

Student.java

image

DAO

Dao 文件夹下的 basedao.java、guanliyuandao.java 和 studentdao.java:定义了与数据库交互的相关操作,包括连接数据库、查询、插入、更新和删除等。

basedao.java

image
用于作为数据库连接的组件,包含连接数据库和关闭数据库连接的方法。其中getConnection()方法用于建立与数据库的连接,closeAll()方法用于关闭ResultSet、PreparedStatement和Connection对象。

guanliyuandao.java

image
image

该代码是一个用于管理用户的DAO类,其中包含了两个方法:getList和add。getList方法用于获取用户列表,它通过执行SQL查询语句获取数据库中的用户信息,并将其存储在一个List集合中返回。而add方法用于增加用户信息,它将用户信息插入到数据库中的指定表中。在这两个方法的实现中,通过数据库连接、预处理语句和结果集来操作数据库。

studentdao.java

名为StudentDao的Java类,是一个用于操作学生信息的数据库访问层。该类中包含了多个静态方法,用于实现对学生的增删改查操作。

  1. getList()方法:该方法通过调用PreparedStatement的executeQuery()方法,执行SELECT查询语句,从数据库中获取学生信息列表。通过循环遍历ResultSet,将查询结果转化为Student对象,并添加至List中,最后返回该列表。
    image

  2. add(Student stu)方法:该方法通过调用PreparedStatement的setInt()和executeUpdate()方法,执行INSERT语句,将给定的学生信息插入数据库中。
    image

  3. delete(int id)方法:该方法通过调用PreparedStatement的setInt()和executeUpdate()方法,执行DELETE语句,根据传入的学生ID从数据库中删除对应的学生信息。
    image

  4. getStudent(int id)方法:该方法通过调用PreparedStatement的setInt()和executeQuery()方法,执行SELECT查询语句,根据给定的学生ID从数据库中获取单个学生信息。通过遍历ResultSet,将查询结果赋值给对应的Student对象属性,最后返回该对象。

image

  1. updateStudent(Student student)方法:该方法通过调用PreparedStatement的setInt()和executeUpdate()方法,执行UPDATE语句,根据给定的学生对象中的ID更新数据库中的对应学生信息。

image

  1. getStudentList(int id)方法:该方法通过调用PreparedStatement的setString()和executeQuery()方法,执行SELECT查询语句,根据给定的学生ID的前缀进行模糊查询,获取所有符合条件的学生信息列表。遍历ResultSet,将查询结果转化为Student对象,并添加至List中,最后返回该列表。

image

  1. getStudentList2()方法:该方法直接创建了一个包含一个Student对象的List,对象的ID、姓名和年龄都是固定的。该方法的目的是用于单元测试,验证其他方法的正确性。最后返回包含固定Student对象的List。
    image

这些方法的实现使用了JDBC的PreparedStatement和ResultSet类,通过调用getConnection()方法获取数据库连接,使用getConnection.prepareStatement()方法创建PreparedStatement对象,通过调用setInt()和setString()等方法为PreparedStatement对象的参数赋值,然后调用executeQuery()和executeUpdate()方法执行相应的SQL语句进行数据库操作。最后通过ResultSet对象遍历获取查询结果或执行更新操作。

filter

Filter 目录下的 EncodingFilter.java、filter1.java、LoginFliter.java 和 PrivateFilter.java:定义了不同的过滤器,用于处理字符编码、IP地址限制、用户登录验证和用户权限控制等。

EncodingFilter

image

这个Java函数是一个实现了Filter接口的类,名为EncodingFilter。在该类中,有一个私有的静态变量encoding,用于存储在初始化过程中从web.xml配置文件中获取的字符编码。EncodingFilter类实现了Filter接口中的三个方法:destroy()、doFilter()和init()。 - destroy()方法在过滤器被销毁时被调用,可以在该方法中进行一些资源的释放操作,但是在这个函数中没有进行任何操作。

在该方法中,首先通过config.getInitParameter("CharsetEncoding")从web.xml配置文件中获取初始化参数"CharsetEncoding"的值,并将其赋给encoding变量。
然后通过调用request.setCharacterEncoding(encoding)和response.setCharacterEncoding(encoding)设置请求和响应的字符编码。
最后,通过调用chain.doFilter(request, response)将请求和响应传递给下一个过滤器或目标处理器来处理。 - init()方法在过滤器被初始化时被调用,用于接收web.xml配置文件中的初始参数。
在这个函数中,通过调用config.getInitParameter("CharsetEncoding")从web.xml配置文件中获取初始化参数"CharsetEncoding"的值,并将其赋给encoding变量。 综上所述,EncodingFilter类用于对请求和响应进行字符编码的转换,通过初始化参数"CharsetEncoding"可以指定要使用的字符编码。

filter1

image

这个Java函数是一个基于Servlet的过滤器类,用于在请求到达目标资源之前进行拦截和处理。它实现了Filter接口,并使用@WebFilter注解进行配置,将filterName设置为"performance",将urlPatterns设置为"/*",表示过滤所有的URL请求。它还包含一个initParams属性,其中包含一个名为"IP"的参数,其值为"172.11"。在doFilter方法中,它首先获取请求的IP地址,并检查是否为本机IP。如果是本机IP,则设置请求和响应的字符编码,并继续处理过滤器链。如果不是本机IP,则返回一个403错误响应。在init方法中,它从FilterConfig对象中获取名为"IP"的参数,并将其赋值给类成员变量IP。如果"IP"参数不存在,则将其设置为默认值"localhost"。

LoginFliter

image
image

主要用于对Web应用进行过滤操作。在该类中,有三个成员变量:sessionKey、redirectUrl和uncheckedUrls,分别表示从配置文件中获取的sessionKey、重定向URL和未检查的URL列表。
在初始化方法init中,通过getInitParameter方法获取配置文件中的参数值,并将其赋给相应的成员变量。
在doFilter方法中,首先将ServletRequest和ServletResponse强制转换为HttpServletRequest和HttpServletResponse,以获取请求的URL。然后,根据uncheckedUrls列表判断请求的URL是否属于不需要进行过滤的URL之一,如果是,则调用filterChain.doFilter方法放行请求;否则,从session中获取username属性,如果不存在,则重定向到redirectUrl页面;如果存在,则调用filterChain.doFilter方法放行请求。

PrivateFliter

image

它首先获取FilterConfig对象,然后在doFilter方法中对ServletRequest和ServletResponse进行强制转换,以获取HttpServletRequest和HttpServletResponse对象,以及FilterChain对象。在该方法中,它通过获取会话中的name属性来判断用户是否已经登录。如果没有登录,则重定向到登录页面;如果已经登录,则转发到主页。最后,在destroy方法中不会执行任何操作。

listener

listener 文件夹下的 listener.java:实现了一个HttpSessionListener,用于监听和处理HttpSession的创建和销毁事件,以统计在线用户数量。

listener.java

image

这个Java函数是一个会话监听器,用于跟踪在线用户数量。当session创建时,onlineCount增加;当session销毁时,onlineCount减小。可以通过调用getOnlineCount方法获取当前在线用户数量

Servlet

Servlet 文件夹下的 FindSeverlet.java 和 SearchSevlet.java:定义了两个Servlet,分别用于处理查找学生信息的请求。

FindSeverlet

image

这个Sevlet是一个基于Servlet的Java函数,使用@WebServlet注解进行路径映射,路径为"/find"。它继承了HttpServlet类,并重写了doPost方法来处理HTTP POST请求。
在doPost方法中,首先将请求的字符编码设置为UTF-8,然后将响应的输出内容类型设置为text/html;charset=UTF-8。接下来,它通过req.getParameter("id")方法从请求中获取一个名为id的参数,并将其转换为整数类型。然后,它调用StudentDao的getStudentList方法,将id作为参数传递进去,获取与该id对应的Student对象的列表。
接下来,它将获取到的列表通过req.setAttribute("list", list)方法设置为请求的属性,以便在后续的处理中使用。最后,它将请求转发到searchStudent.jsp页面进行显示,通过req.getRequestDispatcher("searchStudent.jsp").forward(req, resp)方法进行转发。

这个函数的作用是根据请求中的id参数,从数据库中获取到与该id对应的Student对象的列表,并将列表传递到searchStudent.jsp页面进行显示。

SearchSevlet

image

这个Sevlet是一个基于Servlet的搜索功能的实现。它被注解@WebServlet注解标记为路径为/search的Servlet。它从HTTP请求中获取一个名为id的参数,并调用StudentDao的getStudentList方法来获取与id对应的Student对象的列表。然后,它将列表传递给searchStudent.jsp页面进行显示。在处理请求时,它使用req.setCharacterEncoding和resp.setContentType方法来设置请求和响应的字符编码为UTF-8。它还使用req.getRequestDispatcher方法来转发请求到searchStudent.jsp页面进行处理。这个类重写了HttpServlet的doGet和doPost方法来处理HTTP GET和POST请求。

checkcode

checkcode 文件夹下的 checkcode.java:定义了一个Servlet,用于生成随机的验证码图像。

image
image
这个Sevlet是一个基于Servlet的验证码生成类。它使用了javax.imageio.ImageIO和java.awt包中的类来生成和输出验证码图片,使用了javax.servlet.http包中的HttpServletRequest和HttpServletResponse来获取请求和响应对象,使用了java.io包中的ByteArrayOutputStream和ServletOutputStream来将图片输出到响应中。在处理POST和GET请求时,它首先设置响应内容类型为image/jpeg,然后创建一个指定大小的内存图像并获得其图形上下文。接着,它产生随机验证码,并在图像上分别绘制这4个验证码字符。之后,它设置响应头,防止浏览器缓存此图片。然后,它将图像输出到客户端的响应中,并将生成的验证码以字符串形式存储在客户端的会话中,以便其他页面使用。最后,它释放资源并返回。

这些代码共同构成了一个简单的JavaWeb应用程序,用于处理用户请求、与数据库交互、实现用户验证和权限控制等功能。

前端代码简介

起始中转环节

  1. 为了鼓励用户去注册之后登录,再看到真正的页面
  2. 营造一种神秘感和仪式感,就像珍贵的礼物总是先看到外面精美的包装一样

start.jsp

image
image
image

登录注册环节

firstlogin.jsp

首次登录时的界面
image

login.jsp

注册界面
image
image

该JSP页面是一个登录界面。页面中包含两个表单,一个是登录表单,一个是注册表单。登录表单中包含学号和密码和验证码的输入框,以及一个登录按钮。页面还使用了一个JavaScript函数condition(),用于在点击登录按钮时判断学号和密码和验证码是否为空,并返回相应的结果。如果学号或密码为空,则弹出提示框并返回false,否则返回true。
并且将表单的结果返回给checklogin界面
image

还会智能检测提交格式是否正确:

image

还有使用Ajax异步的存储密码

image
image

checkLogin.jsp

image
image
image
用于处理用户登录信息的验证。首先,通过request.getParameter()方法获取用户在登录界面填写的id和密码信息。然后,连接到数据库并执行查询操作,将查询结果与用户输入的id和密码进行比较。如果验证成功,根据登录id的不同将用户重定向到不同的页面。如果验证失败,则将用户重定向到登录失败页面。页面中使用了Java的数据库连接池技术来连接数据库,以提高性能和稳定性。整体而言,这段代码实现了用户登录信息的验证功能。
image

loginfail.jsp

登录失败就是注册界面,
image
页面中包含一个表单,用户可以输入用户名和密码,并点击“注册”按钮进行提交。在提交时,会调用名为condition的JavaScript函数进行条件判断。如果用户名或密码为空,则会弹出提示框,并返回false,否则返回true。这是为了确保用户填写了有效的用户名和密码。
image

registerCheck.jsp

image

这个JSP页面,用于处理用户在add.jsp页面上提交的注册表单。页面首先设置请求字符编码为UTF-8,然后获取表单中的email和password参数。接着,创建一个guanliyuan对象,将获取到的email和password设置为对象的属性,并调用guanliyuanDao的add方法将对象添加到数据库中。添加完成后,通过response.sendRedirect方法将用户重定向到zhuceSuccess.jsp页面。最后,页面输出id和password的值。

zhuceSuccess.jsp

image
image
image

管理员登录成功-后端管理系统

admin.jsp

image

用于展示学生信息的表格。页面导入了Student和StudentDao类以及List和Iterator类。在页面的链接中包含增加学生和查询学生的功能。表格中展示了学生列表,包括学号、姓名和年龄,并提供删除和修改学生的链接。删除链接中包含了学生id参数,修改链接中也包含了学生id参数,用于在对应的JSP或Servlet中进行删除或修改操作。
image

JSTL技术显示出每个用户的信息

image

增加模块

add.jsp

image
用于添加学生信息。表中包含了学号、姓名和年龄的输入框。在提交表单之前,会调用一个JavaScript函数condition(),该函数会检查输入框的值是否符合要求,如果不符合要求则会弹出提示框并返回false,否则返回true。如果返回false,表示输入不符合要求,表单不会被提交;如果返回true,表示输入符合要求,表单将被提交到指定的页面addCheck.jsp进行处理。

addCheck.jsp

image
用于处理用户在add.jsp页面上提交的表单数据。页面首先设置请求字符编码为UTF-8,然后获取表单中的id、name和age参数。接着,创建一个Student对象,将获取到的id、name和age设置为对象的属性,并调用StudentDao的add方法将对象添加到数据库中。添加完成后,通过response.sendRedirect方法将用户重定向到admin.jsp页面。

查询模块

search.jsp

image
image
image

用于查询学生信息的JSP页面。页面包含一个表单,用户可以输入学号来查询学生信息。查询结果会以表格的形式展示出来。页面还包含一个JavaScript函数f(),用于判断用户是否输入了学号。如果用户未输入学号,会弹出提示框并阻止表单提交。

删除模块

delete.jsp

image
用于删除学生信息。首先获取请求参数中的id,然后调用StudentDao的delete方法,传入id作为参数,实现删除操作。最后使用response.sendRedirect方法进行页面跳转,跳转到admin.jsp页面。

修改模块

update.jsp

image
image

updateCheck.jsp

image
用于修改学生信息。首先获取请求参数中的id、name和age,然后创建一个Student对象,设置其属性为获取到的值,最后调用StudentDao的updateStudent方法更新学生信息。更新完成后,使用response.sendRedirect方法进行页面跳转,跳转到admin.jsp页面。

普通用户登录成功-幻想乡主界面

index.jsp

image
image
image
image

监听器检测当前在线人数

image

image

blog.jsp

image
image

page.jsp

image
image

总结和未来改进方向

还有部分功能未实现,部分接口可以优化,未来会持续改进,并发布在互联网上