用 JSP 技术搞出个假 优快云
关键词:软件工程课设、网页设计与网站建设(JSP)实验、网页设计与网站建设(JSP)课设、课程设计、完整源码,可运行,运行截图。
课程设计名称
CPPSDN 仿 优快云 实现一个在线技术社区。
需求
完成 CPPSDN 在线平台,让技术爱好者和专业人士可以分享知识、交流经验和互相学习。通过这个网站,用户可以发布技术文章、参与讨论等活动,以扩展自己的技术知识和技能。
目的
通过 CPPSDN 实践,深入了解 JSP 技术的基本概念、原理和应用。提高自己的编程能力和 Web 应用开发技能,加深对 Web 技术的理解和应用。通过实现具体的 CPPSDN 网站,掌握 JSP 技术的基本要素,如 Servlet 和 JSP 页面的交互方式、JSP 标签、表达式和脚本等。同时,JSP 实验还可以让学生了解 JSP 技术与其他 Web 技术,如 HTML、CSS、JavaScript、JDBC 和 SQL 等的关系和配合使用。
概要设计
用户管理
用户登录与退出:系统应该提供用户名和密码验证机制,用于验证用户的身份。实现用户鉴权登录和退出。
用户界面设计:系统应该提供友好的用户界面,让用户能够轻松使用各种功能。
文章管理
文章发布:系统应该允许用户发布文章,包括标题、内容、作者等信息。
文章修改:系统应该允许文章的作者对已发布的文章进行修改和编辑。
文章查询:系统应该提供查询文章的功能,包括按关键词等条件查询文章。
用户界面设计:系统应该提供友好的用户界面,让用户能够轻松使用各种功能。
详细设计
用户管理
- 用户登录与退出
用户登录首先从请求参数中获取用户名和密码,然后使用 JDBC API 连接 MySQL 数据库,查询指定用户名的用户记录。如果找到对应的记录并且密码匹配,则将用户信息保存到会话(Session)中,并返回一个成功的结果,否则返回一个失败的结果。最后,将结果对象设置到请求属性中,转发请求到 “/frame/toast.jsp” 页面。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
var username = req.getParameter("username");
var password = req.getParameter("password");
var found = false;
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/csdn", "root",
"123456")) {
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, username);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
if (username.equals(rs.getString("username")) && password.equals(rs.getString("password"))) {
req.getSession().setAttribute("user",
new BeanUser(rs.getInt("id"), username, password, rs.getString("avatar")));
found = true;
break;
}
}
} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
}
if (!found) {
req.setAttribute("rsp", new BeanResult("-1", "账号或密码错误"));
} else {
req.setAttribute("rsp", new BeanResult("0", ""));
}
req.getRequestDispatcher("/frame/toast.jsp").forward(req, resp);
}
用户登录退出从会话(Session)中移除名为 “user” 的属性,然后获取请求头中的 “referer” 属性,将其转换为 URL 对象,并从中获取路径信息。最后,使用 sendRedirect 方法将请求重定向到获取到的路径。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().removeAttribute("user");
var url = new URL(req.getHeader("referer"));
resp.sendRedirect(url.getPath());
}
- 用户界面设计
首页使用 JSP 标签引入了一个名为 header.jsp 的页面,该页面用于展示页面头部,例如网站名称、导航菜单等。使用 HTML 5 中的 section 元素来定义一个文章列表的区域,并定义一个名为 articles 的表单,用于向服务器请求文章列表的数据。
如果用户未登录,则显示登录链接。当点击登录链接时,弹出登录模态框,用户可以输入用户名和密码进行登录。当用户点击登录时,表单会提交到 “/login” 这个 URL,并在 “frame-login” 这个 iframe 中进行提交。在表单的下方,还有一个 “忘记密码” 的链接。当用户点击 “忘记密码” 时,可以执行一些 JavaScript 代码来进行密码找回等操作。
如果用户已经登录,则显示用户头像和下拉菜单,包含个人中心、内容管理、退出等链接。
文章管理
- 文章发布与修改
从当前用户的 session 中获取 BeanUser 对象,以确定当前用户的身份。然后,从 HTTP 请求中获取文章的标题、内容和 ID(如果有的话)。使用 JDBC 连接到 MySQL 数据库,将更新或创建文章的 SQL 语句作为 PreparedStatement 对象创建,并使用用户提供的数据填充占位符。最后,通过执行 SQL 语句更新或创建文章。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
var user = (BeanUser) req.getSession().getAttribute("user");
var content = req.getParameter("content").replaceAll("`", "\\\\`");;
var id = req.getParameter("id");
var title = req.getParameter("title");
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/csdn", "root",
"123456")) {
if (id != null && !id.isEmpty()) {
String sql = "UPDATE articles SET content = ?, title = ? WHERE user_id = ? AND id = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, content);
stmt.setString(2, title);
stmt.setLong(3, user.getId());
stmt.setString(4, id);
stmt.executeUpdate();
} else {
String sql = "INSERT INTO articles (title, content, user_id) VALUES (?, ?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, title);
stmt.setString(2, content);
stmt.setLong(3, user.getId());
stmt.executeUpdate();
}
} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
}
resp.sendRedirect("/mp_blog/manage/article");
}
- 文章查询
创建一个空的文章列表,然后使用JDBC连接到MySQL数据库,并执行一个SELECT语句来查询数据库中的所有文章。查询结果将存储在ResultSet对象中,通过循环遍历ResultSet,将每个文章的id、标题、内容和用户id封装成一个BeanArticle对象,并添加到文章列表中。最后,将查询结果和文章列表添加到请求对象的属性中,转发到"/frame/article.jsp"页面进行展示。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<BeanArticle> articles = new ArrayList<>();
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/csdn", "root",
"123456")) {
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM articles");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
long id = rs.getLong("id");
String title = rs.getString("title");
String content = rs.getString("content");
Long userId = rs.getLong("user_id");
articles.add(new BeanArticle(id, title, content, userId));
}
} catch (SQLException e) {
req.setAttribute("rsp", new BeanResult("-1", "查询文章失败"));
System.out.println("SQLException: " + e.getMessage());
req.getRequestDispatcher("/frame/article.jsp").forward(req, resp);
}
req.setAttribute("rsp", new BeanResult("0", ""));
req.setAttribute("articles", articles);
req.getRequestDispatcher("/frame/article.jsp").forward(req, resp);
}
- 用户界面设计
发布和更改包含一个表单,分为左右两边,左边输入,右边预览。通过发布文章按钮提交表单。
文章查询页面是一个简单的博客文章列表,其中每篇文章都有一个标题和“编辑”和“浏览”链接,用户可以单击这些链接以编辑或浏览文章。<c:if>
标签测试请求方法是否为“POST”,如果是,则显示“编辑”链接,其中onclick属性是一个JavaScript函数,将页面重定向到URL“/md?id=article.id”。
心得
独立完成了 CPPSDN 在线平台的编写,深入了解 JSP 技术的基本概念、原理和应用。提高自己的编程能力和 Web 应用开发技能,加深对 Web 技术的理解和应用。通过实现具体的 CPPSDN 网站,掌握 JSP 技术的基本要素,如 Servlet 和 JSP 页面的交互方式、JSP 标签、表达式和脚本等。同时,JSP 实验还可以让学生了解 JSP 技术与其他 Web 技术,如 HTML、CSS、JavaScript、JDBC 和 SQL 等的关系和配合使用。