实验( 四 )
|
实验名称 |
基于MVC的留言本 |
|
实验目的 : | |
|
通过本实验,使学生掌握MVC设计模式的运用,掌握使用Servlet+JSP+JDBC实现较复杂的Java Web应用,熟练使用简易web框架 | |
|
实验环境: | |
|
1、硬件要求:计算机一台 2、软件要求:Chrome浏览器、IE11浏览器、Firefox浏览器 3.深入掌握HTML/CSS/JavaScript。 4.深入掌握dbutils,EL,JSTL在项目中的使用。 5.掌握简易Web开发框架的使用,并理解开发框架的实现原理。 6.留言本系统的需求分析和设计。 7.实现留言本系统的功能,包括:发表留言,回复留言,留言维护功能。 | |
|
实验步骤和内容: | |
|
1.数据库建立 建立一个名为test4的数据库,数据库中包含user、comments和messages三个表。 user表如图3-1所示。
图3-1 user表 comments表如图3-2所示。
图3-2 comments表 messages表如图3-3所示。
图3-3 messages表 2.数据库连接 在druid.properties中进行数据库配置,确保数据库连接成功。数据库连接配置如图3-4所示。
图3-4 数据库连接配置 3.dao层编写 (1)BasicDAO编写 public class BasicDAO<T>:这是一个泛型类,使用泛型 T,表示这个 DAO 可以操作的对象类型。 private QueryRunner queryRunner = new QueryRunner();:在类的成员变量中创建了一个 QueryRunner 对象,QueryRunner 是 Apache Commons DbUtils 库中的一个工具类,用于执行 SQL 查询和更新操作。 public int update(String sql, Object... parameters):这是一个更新方法,用于执行数据库的 DML(数据操作语言)操作,如 INSERT、UPDATE、DELETE 等。它接收一个 SQL 语句和可变数量的参数,执行更新操作并返回受影响的行数。 public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters):这是一个查询方法,用于执行数据库查询操作,返回多个对象。它接收一个 SQL 语句、一个 Class 对象(用于指定返回的对象类型),以及可变数量的参数,执行查询操作并返回查询结果的列表。 public T querySingle(String sql, Class<T> clazz, Object... parameters):这是一个查询方法,用于执行数据库查询操作,返回单个对象。它接收一个 SQL 语句、一个 Class 对象(用于指定返回的对象类型),以及可变数量的参数,执行查询操作并返回查询结果的单个对象。 try、catch、finally:每个方法中都有一个异常处理结构,使用 try-catch-finally 来捕获可能抛出的 SQLException 异常,并在 finally 块中关闭数据库连接,以确保资源得到正确释放。 核心代码如图3-5所示。
图3-5 BasicDAO核心代码 (2)CommentsDAO层编写 queryCommentsByMessageId(Integer messageId): 这个方法用于根据留言的 ID 查询所有相关的评论。构建了一个 SQL 查询语句,通过 message_id 来过滤评论,并调用了 queryMulti 方法执行查询操作,将查询结果映射为 Comments 类的对象列表,并返回该列表。 insertComment(Comments comments): 这个方法用于插入一条新的评论。构建了一个 SQL 插入语句,将评论对象的属性作为参数传入,并调用了 update 方法执行插入操作。如果插入成功,则返回 true,否则返回 false。 delCommentByCommentId(Integer commentId): 这个方法用于根据评论的 ID 删除评论。构建了一个 SQL 删除语句,通过 comment_id 进行过滤,并调用了 update 方法执行删除操作。如果删除成功,则返回 true,否则返回 false。 核心代码如图3-6所示。
图3-6 CommentsDAO核心代码 (3)UserDAO编写 public boolean queryUserByUsernameAndPassword(User user) {: 这是一个公有方法,返回布尔类型值,用于查询用户是否存在,方法接受一个User对象作为参数。 String sql = "select * from user where username = ? and password = ?";: 这里定义了一个 SQL 查询语句,用于在数据库中查询用户信息。这个查询语句使用了两个占位符?,分别用来表示用户名和密码。 User user1 = querySingle(sql, User.class, user.getUsername(), user.getPassword());: 这一行代码调用了一个叫做querySingle的方法来执行 SQL 查询,并将结果存储在一个User对象中。这个方法可能是一个数据库访问对象(DAO)中的一个方法,它的作用是执行查询并返回单个结果。 if (user1 != null) { return true; } else { return false; }: 这个条件语句检查了querySingle方法返回的结果。如果返回的user1对象不为null,意味着在数据库中找到了符合条件的用户,则返回true;否则返回false,表示未找到符合条件的用户。 核心代码如图3-7所示。
图3-7 UserDAO核心代码 (4)MessagesDAO编写 queryAllMessages() 方法用于查询所有留言。它构建了一个 SQL 查询语句,选择了留言表中的所有字段,并且使用了别名来映射到 Messages 类中的属性。然后调用了父类的 queryMulti() 方法,该方法执行 SQL 查询并将结果映射为 Messages 类的对象列表,最后将结果返回。 queryMessageById(Integer messageId) 方法根据留言的 ID 查询留言。它构建了一个带有参数的 SQL 查询语句,使用了 WHERE 子句来限制查询结果只返回指定 ID 的留言。然后调用了父类的 querySingle() 方法,该方法执行 SQL 查询并将结果映射为 Messages 类的对象,最后将结果返回。 insertMessage(Messages messages) 方法用于插入一条新的留言。它构建了一个插入语句,然后调用父类的 update() 方法来执行 SQL 插入操作。如果插入成功(影响行数大于等于 1),则返回 true,否则返回 false。 delMessage(Integer messageId) 方法用于删除指定 ID 的留言。它构建了一个带有参数的 SQL 删除语句,然后调用父类的 update() 方法来执行 SQL 删除操作。如果删除成功(影响行数大于等于 1),则返回 true,否则返回 false。 这些方法使用了数据库操作工具类中的一些方法,例如查询和更新方法,这些方法能够执行 SQL 语句并处理结果集。同时,这些方法也通过将 SQL 查询结果映射到 Java 核心代码如图3-8所示。
图3-8 MessagesDAO核心代码 4.bean层编写 (1)Comments编写 类声明:public class Comments { ... },定义了一个名为 Comments 的公共类。 成员变量:类中包含了五个私有成员变量,分别是: commentId:评论的唯一标识符,类型为 Integer。 messageId:评论所属消息的唯一标识符,类型为 Integer。 commentUsername:评论者的用户名,类型为 String。 commentContent:评论的内容,类型为 String。 commentTime:评论的时间戳,类型为 Timestamp。 构造函数:类中定义了一个构造函数 public Comments(Integer commentId, Integer messageId, String commentUsername, String commentContent, Timestamp commentTime),用于创建 Comments 对象。构造函数接收五个参数,分别是评论的各个属性值,然后将这些值赋给对应的成员变量。 Getter 和 Setter 方法:对于每个成员变量,都提供了对应的 Getter 和 Setter 方法,用于获取和设置成员变量的值。例如,getCommentId() 方法用于获取评论的ID,setCommentId(Integer commentId) 方法用于设置评论的ID。 toString() 方法:覆盖了父类 Object 的 toString() 方法,以便以字符串形式返回 Comments 对象的属性值。 核心代码如图3-9所示。
图3-9 Comments核心代码 (2)User编写 public class User {:定义了一个名为 User 的类。 private Integer id;、private String username;、private String password;:这三行声明了该类的私有属性,分别表示用户的ID、用户名和密码。 public User() { }:无参构造方法,用于创建一个空的 User 对象。 public User(Integer id, String username, String password) { }:带参数的构造方法,用于创建一个具有指定ID、用户名和密码的 User 对象。 public Integer getId() { }、public void setId(Integer id) { }、public String getUsername() { }、public void setUsername(String username) { }、public String getPassword() { }、public void setPassword(String password) { }:这些是公有的 getter 和 setter 方法,用于获取和设置 User 对象的属性值。 @Override:这是 Java 中的注解,表示下面的方法是对父类(Object 类)中的方法进行了重写。 public String toString() { }:重写了 toString() 方法,以便在将 User 对象转换为字符串时,能够得到包含对象属性值的可读性较好的字符串表示形式。 核心代码如图3-10所示。
图3-10 User核心代码 (3)Messages编写 类名:Messages,用于表示消息对象。 成员变量: messageId:消息的唯一标识符,类型为 Integer。 messageUsername:消息的用户名,类型为 String。 messageTopic:消息的主题,类型为 String。 messageContent:消息的内容,类型为 String。 commentsNumber:消息的评论数量,类型为 Integer。 构造方法: public Messages(Integer messageId, String messageUsername, String messageTopic, String messageContent, Integer commentsNumber):构造方法用于初始化 Messages 类的对象,传入消息的各个属性值。 Getter 和 Setter 方法: Getter 方法用于获取成员变量的值。 Setter 方法用于设置成员变量的值。 toString() 方法: 重写了 Object 类的 toString() 方法,以便将 Messages 对象转换为字符串表示形式。该方法返回一个包含消息对象各个属性值的字符串。 核心代码如图3-11所示。
图3-11 Messages核心代码 5.utlis层编写 JDBCUtilsByDruid编写 private static DataSource dataSource;:声明一个静态的数据源对象,用于获取数据库连接。 static 代码块: 在静态代码块中,首先创建一个 Properties 对象,用于加载数据库连接的配置信息。 使用 JDBCUtilsByDruid.class.getClassLoader().getResourceAsStream("druid.properties") 方法加载类路径下的名为 druid.properties 的配置文件。 调用 DruidDataSourceFactory.createDataSource(properties) 方法根据配置信息创建数据源对象,并将其赋值给 dataSource 变量。 public static Connection getConnection() throws SQLException 方法: 这是一个静态方法,用于获取数据库连接。 在方法中,通过 dataSource.getConnection() 方法从数据源中获取一个数据库连接,并将其返回。 public static void close(ResultSet resultSet, Statement statement, Connection connection) 方法: 这是一个静态方法,用于关闭数据库连接、语句和结果集。 方法接受三个参数:ResultSet resultSet、Statement statement 和 Connection connection,分别表示需要关闭的结果集、语句和连接。 在方法中,使用 close() 方法逐个关闭传入的结果集、语句和连接。在关闭之前,会先检查它们是否为 null,以避免空指针异常。 异常处理:如果在关闭过程中发生异常,会将异常包装成 RuntimeException 抛出。 核心代码如图3-12所示。
图3-12 JDBCUtilsByDruid核心代码 6.servlet层和监听器编写 (1)ManageFilter编写 @WebFilter("/views/manage/*"): 这是一个注解,指定了该过滤器拦截的 URL 模式。具体来说,它表示该过滤器会拦截所有以 "/views/manage/" 开头的 URL。 ManagerFilter 类声明了一个实现了 Filter 接口的过滤器类。 init(FilterConfig config) 方法:这是 Filter 接口的一个方法,用于初始化过滤器。在这里,该方法没有实际操作,因此留空。 destroy() 方法:同样是 Filter 接口的方法,用于销毁过滤器。在这里,该方法也没有实际操作,留空。 doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 方法:这是过滤器的主要方法,用于拦截请求并进行处理。在这里,该方法的实现是将请求重定向(forward)到 "/views/manager_login.jsp" 页面。 ServletRequest request:表示客户端发来的请求对象。 ServletResponse response:表示服务器响应客户端的响应对象。 FilterChain chain:过滤器链,用于将请求传递给下一个过滤器或目标资源。 核心代码如图3-13所示。
图3-13 ManageFilter核心代码 (2)BasicServlet编写 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {: 这是 doGet 方法的重写,用于处理 HTTP GET 请求。 req.setCharacterEncoding("utf-8");: 设置请求的字符编码为 UTF-8,确保正确处理中文等特殊字符。 System.out.println("BasicServlet被调用");: 打印一条日志,表示 BasicServlet 被调用了。 String action = req.getParameter("action");: 从请求中获取名为 "action" 的参数的值。 System.out.println("action = " + action);: 打印获取到的 action 值。 try { ... } catch (Exception e) { throw new RuntimeException(e); }: 这里使用了反射机制,通过获取 action 参数的值,动态调用当前对象(即继承了 BasicServlet 的子类)中与 action 值对应的方法。如果找不到对应的方法或者调用过程中出现异常,则将异常包装为 RuntimeException 抛出。 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }: 这是 doPost 方法的重写,用于处理 HTTP POST 请求。它简单地调用了 doGet 方法,将 POST 请求转发给 doGet 方法处理。 核心代码如图3-14所示。
图3-14 BasicServlet核心代码 (3)CommentsServlet编写 @WebServlet(urlPatterns = {"/commentsServlet"}): 这是一个Servlet注解,表示该Servlet将处理以"/commentsServlet"路径开始的HTTP请求。 public class CommentsServlet extends BasicServlet: CommentsServlet类继承自BasicServlet类,意味着它可以使用BasicServlet中的方法和属性。 private MessagesService messagesService = new MessagesService();: 创建了一个MessagesService对象,用于处理消息相关的服务。 private CommentsService commentsService = new CommentsService();: 创建了一个CommentsService对象,用于处理评论相关的服务。 protected void commentByMessageId(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ... }: 这是一个受保护的方法,用于处理根据消息ID获取评论的请求。它接收HttpServletRequest和HttpServletResponse对象作为参数,并可能抛出ServletException和IOException异常。在该方法中,它首先从请求参数中获取消息ID,然后使用messagesService获取消息对象和commentsService获取相关的评论列表。最后,它将这些数据设置为请求的属性,然后将请求转发到"/views/user_comments.jsp"页面进行展示。 protected void addComment(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ... }: 这是一个受保护的方法,用于处理添加评论的请求。它接收HttpServletRequest和HttpServletResponse对象作为参数,并可能抛出ServletException和IOException异常。在该方法中,它从请求参数中获取消息ID、评论用户名和评论内容,然后创建一个Comments对象。接着,它使用commentsService的方法将评论添加到数据库中。如果评论添加成功,它会重定向到评论页面。 核心代码如图3-14所示。
图3-14 CommentsServlet核心代码 (4)UserServlet编写 doGet 方法: 接收 HTTP GET 请求,用于用户提交登录表单。 首先设置请求的字符编码为 UTF-8,以确保正确处理中文字符。 从请求参数中获取用户名和密码。 创建一个 User 对象,将获取到的用户名和密码封装到该对象中。 调用 UserDAO 类的 queryUserByUsernameAndPassword 方法,查询数据库中是否存在该用户。 如果存在该用户(queryUserByUsernameAndPassword 返回 true): 将用户名存储到会话(Session)中,以便在用户的整个会话期间保持登录状态。 将请求重定向(redirect)到菜单页面(/views/managerServlet)。 如果不存在该用户(queryUserByUsernameAndPassword 返回 false): 在请求属性中设置错误消息(errormsg),提示用户账号或密码错误。 将用户名存储到请求属性中,以便在重新加载登录页面时填充用户名字段。 将请求转发(forward)到登录页面(/views/manager_login.jsp)。 doPost 方法: 重写了 doPost 方法,使其调用 doGet 方法,以便处理 POST 请求。这是为了在表单提交时统一处理逻辑,无论是 GET 还是 POST 请求。 核心代码如图3-15所示。
图3-15 UserServlet核心代码 (5)ManagerServlet编写 manageAllMessages(HttpServletRequest req, HttpServletResponse resp): 这个方法用于显示所有留言。它首先调用 messagesService 的 showAllMessages() 方法来获取所有留言的列表,然后将列表存储在请求属性中,并将请求转发到 /views/manage/manager_messages.jsp 页面进行显示。 manageCommentByMessageId(HttpServletRequest req, HttpServletResponse resp): 这个方法用于根据留言的ID管理相关评论。它首先从请求参数中获取留言ID,然后使用该ID从 messagesService 中获取对应的留言对象,并使用 commentsService 获取该留言的所有评论。最后,将留言ID、留言对象和评论列表存储在请求属性中,并将请求转发到 /views/manage/manager_comments.jsp 页面进行显示。 delComment(HttpServletRequest req, HttpServletResponse resp): 这个方法用于删除评论。它首先从请求参数中获取评论ID和留言ID,然后调用 commentsService 的 delComment() 方法来删除评论。如果删除成功,则重定向到 manageCommentByMessageId 方法,以重新加载相关留言的评论列表。 delMessage(HttpServletRequest req, HttpServletResponse resp): 这个方法用于删除留言。它首先从请求参数中获取留言ID,然后调用 messagesService 的 delMessage() 方法来删除留言。如果删除成功,则打印"删除成功"消息,并重定向到 manageAllMessages 方法,以重新加载所有留言列表。 核心代码如图3-16所示。
图3-16 ManagerServlet核心代码 (6)MessagesServlet编写 @WebServlet(urlPatterns = {"/messagesServlet"}): 这是一个Servlet注解,它将该Servlet映射到URL路径"/messagesServlet",这意味着当应用程序收到与该路径匹配的HTTP请求时,将调用该Servlet。 extends BasicServlet: 这个Servlet继承自BasicServlet类,这意味着它可能包含一些通用的处理逻辑或者是其他方法,而不仅仅是在这里显示的两个方法。 private MessagesService messagesService = new MessagesService();: 在Servlet内部创建了一个MessagesService的实例,用于处理留言相关的业务逻辑。 protected void showAllMessages(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ... }: 这是一个受保护的方法,用于显示所有留言。它首先调用messagesService的showAllMessages()方法来获取所有留言的列表,然后将列表存储在请求属性中,并将请求转发到"/views/user_messages.jsp"页面进行显示。 protected void addMessage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ... }: 这是一个受保护的方法,用于添加新留言。它从请求参数中获取留言的用户名、主题和内容,并创建一个新的Messages对象。然后调用messagesService的addMessage()方法尝试将留言添加到数据库中。如果添加成功,将重定向到"/messagesServlet?action=showAllMessages"路径,以显示新添加的留言。 核心代码如图3-17所示。
图3-17 MessagesServlet核心代码 7.jsp页面编写 (1)index.jsp编写 <title>首页</title>:指定页面的标题为“首页”。 <base href="<%=request.getContextPath() + "/"%>">:定义基准URL,用于解析页面上的相对URL。<%=request.getContextPath() + "/"%>这部分是JSP表达式,用于动态获取当前web应用的上下文路径。 <body>:文档的主体部分。 第一个 <form> 元素: action="messagesServlet":指定表单提交的目标URL为"messagesServlet",这通常是一个Servlet类的映射路径。 <input type="hidden" name="action" value="showAllMessages">:隐藏字段,将会随着表单一起提交到服务器端。它的作用是告诉服务器当前请求的动作是显示所有留言。 <input type="submit" value="由此进入留言本">:提交按钮,点击后将会触发表单提交动作。 第二个 <form> 元素: action="views/manager_login.jsp":指定表单提交的目标URL为"views/manager_login.jsp",这通常是另一个JSP页面的路径。 <input type="hidden" name="action" value="showAllMessages">:同样是隐藏字段,指示服务器要执行的动作。 <input type="submit" value="管理员界面">:另一个提交按钮,点击后将会跳转到管理员界面。 核心代码如图3-18所示。
图3-18 index.jsp核心代码 (2)manager_login.jsp编写 <form action="UserServlet" method="post">: 这个 <form> 元素定义了一个表单,它将数据提交到名为 "UserServlet" 的服务器端处理程序。method="post" 表示将使用 POST 方法提交表单数据。 <input type="hidden" name="action" value="manageAllMessages">: 这是一个隐藏的输入字段,它的名称为 "action",值为 "manageAllMessages"。这个字段通常用于标识表单的操作类型,这里可能表示要执行管理所有留言的操作。 管理员用户名: <input type="text" name="username" value="${requestScope.username}">: 这是一个文本输入字段,用于输入管理员的用户名。name 属性为 "username",它的值将作为表单数据的一部分提交到服务器。${requestScope.username} 是一个 JSP 表达式,它将显示在这个字段中的值,通常从请求的作用域中获取。 管理员密码: <input type="password" name="password" value="${requestScope.password}">: 这是一个密码输入字段,用于输入管理员的密码。与用户名输入字段类似,它的值将在表单提交时作为密码数据发送到服务器。${requestScope.password} 用于显示密码字段中的值。 <input type="submit" value="登录">: 这是一个提交按钮,点击它将提交表单中的数据到服务器进行处理。 <form action="index.jsp">: 这是另一个表单,用于返回到主页。它的 action 属性指定了提交的目标页面为 "index.jsp"。 <input type="hidden" name="action">: 这是一个隐藏的输入字段,但没有指定值。这可能是一个在提交到主页时,用于标识要执行的操作类型的字段。 <input type="submit" value="返回">: 这是另一个提交按钮,点击它将提交表单数据到 "index.jsp" 页面。 <span>${requestScope.errormsg}</span>: 这是一个用于显示错误消息的 HTML <span> 元素。${requestScope.errormsg} 是一个 JSP 表达式,用于显示在页面中的错误消息,通常从请求的作用域中获取。 核心代码如图3-19所示。
图3-19 manager_login.jsp核心代码 (3)user_add_message.jsp编写 <h1>欢迎添加留言</h1>:这是一个标题,显示在页面顶部,提示用户欢迎添加留言。 <form action="messagesServlet" method="get">:这是一个HTML表单开始的标签。action属性指定了表单提交的目标URL,即"messagesServlet",而method属性指定了使用HTTP GET方法提交表单数据。 <input type="hidden" name="action" value="addMessage">:这是一个隐藏的输入字段,用于指定操作类型。name属性为"action",value属性为"addMessage",表示提交表单时要执行添加留言的操作。 请输入留言用户名: <input type="text" name="messageUsername">:这是一个文本输入框,用于用户输入留言的用户名。name属性为"messageUsername",将在提交时作为参数名。 请输入留言主题: <textarea name="messageTopic" cols="60" rows="1" required></textarea>:这是一个文本区域输入框,用于用户输入留言的主题。name属性为"messageTopic",cols属性定义了文本框的列数,rows属性定义了文本框的行数,required属性表示此字段为必填项。 请输入留言内容: <textarea name="messageContent" cols="60" rows="8" required></textarea>:这是另一个文本区域输入框,用于用户输入留言的内容。与留言主题相似,name属性为"messageContent",cols属性定义了文本框的列数,rows属性定义了文本框的行数,required属性表示此字段为必填项。 <input type="submit" value="添加留言">:这是一个提交按钮,点击后将会提交表单数据到指定的URL。 <a href="messagesServlet?action=showAllMessages">返回上一页</a>:这是一个超链接,点击后将会跳转到"messagesServlet?action=showAllMessages",显示所有留言的页面。 核心代码如图3-20所示。
图3-20 user_add_message.jsp核心代码 (3)user_comments.jsp编写 <c:forEach> 标签:用于循环遍历 requestScope.allCommentsByMessageId 中的评论信息。 <div> 标签:用于显示每条评论的内容。 <hr> 标签:水平分割线,用于分隔不同的评论。 <span> 标签:显示评论的用户名、评论内容和评论时间。 <form> 标签:用于提交用户的评论。 <input type="hidden"> 标签:隐藏的表单字段,用于传递消息ID和操作类型。 <input type="text"> 标签:用于用户输入评论的用户名。 <textarea> 标签:用于用户输入评论内容。 <input type="submit"> 标签:提交按钮,用于提交用户输入的评论。 <a> 标签:用于返回到上一页,链接到 messagesServlet?action=showAllMessages。 核心代码如图3-21所示。
图3-21 user_comments.jsp核心代码 (4)user_messages.jsp编写 <h1> 标签:用于显示页面的标题,内容为 "欢迎大家留言"。 <form> 标签:定义了一个表单,虽然这里并没有具体的表单元素,但可能是为了保持HTML的结构完整性。 <table> 标签:创建了一个表格用于展示留言信息,设置了边框和单元格之间的间隔。 <tr> 和 <td> 标签:用于创建表格的行和列。在这个表格中,有五列,分别是留言编号、留言用户、留言主题、评论数和操作。 <c:forEach> 标签:用于循环遍历 ${requestScope.messages} 中的留言信息,${requestScope.messages} 可能是在后台代码中设置的一个请求属性,包含了所有留言的信息。 ${message.messageId}、${message.messageUsername}、${message.messageTopic}、${message.commentsNumber}:这些表达式用于在表格中显示每条留言的编号、用户、主题和评论数。 <a> 标签:在操作列中创建了一个链接,链接到 commentsServlet?action=commentByMessageId&messageId=${message.messageId},点击该链接可以跳转到评论页面,进行对该留言的评论操作。 <a> 标签:创建了一个链接,链接到 views/user_add_message.jsp,点击该链接可以跳转到用户添加留言的页面。 <a> 标签:创建了一个链接,链接到 index.jsp,点击该链接可以返回到上一页。 核心代码如图3-22所示。
图3-22 user_messages.jsp核心代码 (5)manager_comments.jsp编写 <div> 标签:页面的最外层容器。 <h1> 标签:显示页面标题,文本为 "管理员页面"。 <h2> 标签:显示一个副标题,文本为 "如果评论中有违规内容,请将其删除"。 注释部分:用于标记留言和评论的区域。 留言部分: <h2> 标签:显示留言的主题。 <span> 标签:显示留言的主题内容,使用了EL表达式 ${requestScope.messageByMessageId.messageTopic} 来获取主题内容。 <h3> 标签:显示留言的内容标题。 <textarea> 标签:显示留言的内容,使用了EL表达式 ${requestScope.messageByMessageId.messageContent} 来获取内容,并且设定了列数和行数,并且设置了必填项。 评论部分: <div> 标签:用于包裹每一条评论。 <hr> 标签:水平线,用于分隔每条评论。 <c:forEach> 标签:用于遍历所有评论,其中 items="${requestScope.allCommentsByMessageId}" 表示评论列表存储在请求作用域中的变量 allCommentsByMessageId 中。 <span> 标签:显示评论的用户名、内容和时间,分别使用 ${comment.commentUsername}、${comment.commentContent} 和 ${comment.commentTime} 获取。 <a> 标签:用于删除评论的链接,链接的URL中包含了 managerServlet 的action参数,指定了要进行的操作(删除评论),以及评论的ID和留言的ID,以便后台servlet进行处理。 返回链接:最后一个 <a> 标签用于返回上一页,链接到 managerServlet 并指定了进行 "manageAllMessages" 操作。 核心代码如图3-23所示。
图3-23 manager_comments.jsp核心代码 (5)manager_messages.jsp编写 <h1>管理员页面</h1>:这是一个一级标题,显示在页面顶部,指示这是管理员页面。 <h2>请管理留言,删除可能含有违规内容的留言!</h2>:这是一个二级标题,用于提醒管理员管理留言,删除可能含有违规内容的留言。 <form>:这是一个HTML表单,用于将表格中的数据提交到服务器端进行处理。 <table border="1" cellspacing="0">:这是一个HTML表格,设置了边框和单元格之间的间距。 <tr>:这表示表格的一行。 <td>:这表示表格中的一个单元格。 在循环<c:forEach>中,${requestScope.messages} 是一个属性,用于在页面上显示留言信息。var="message" 定义了循环中每个留言对象的变量名。 ${message.messageId}、${message.messageUsername}、${message.messageTopic}、${message.commentsNumber} 分别表示留言的编号、用户、主题和评论数。 <a href="managerServlet?action=manageCommentByMessageId&messageId=${message.messageId}">点击查看此留言信息</a>:这是一个超链接,点击后将调用 managerServlet 的 manageCommentByMessageId 方法,并传递留言的编号(messageId)作为参数,用于查看该留言的信息。 <a href="managerServlet?action=delMessage&messageId=${message.messageId}">点击删除此留言</a>:这也是一个超链接,点击后将调用 managerServlet 的 delMessage 方法,并传递留言的编号(messageId)作为参数,用于删除该留言。 <a href="views/manager_login.jsp">返回上一页</a>:这是一个超链接,点击后将用户导航回管理员登录页面。 核心代码如图3-24所示。
图3-24 manager_messages.jsp核心代码 8.效果实现 (1)启动tomcat服务器,进入主页面。如图3-25所示。
图3-25 主页面 (2)在图3-25中,点击“由此进入留言本”按钮,即可以游客方式进入留言本。如图3-26所示。
图3-26 游客方式进入留言本 (3)在图3-26中,点击“我要留言”按钮,即可进入留言页面。如图3-27所示。
图3-27 留言页面 (4)在图3-26中,点击“点击进行评论”,即可进入到相应留言的评论页面。如图3-28所示。
图3-28 评论页面 (5)在图3-25中,点击“管理员页面”按钮,即可进入到管理员登陆页面。如图3-29所示。
图3-29 管理员登陆页面 (6)在图3-29中,若输入错误的用户名和密码,将会出现错误提示。如图3-30所示。
图3-30 错误提示 (7)在图3-29中,若输入正确的用户名和密码,将会跳转到管理员页面。如图3-31所示。
图3-31 管理员页面 (8)在图3-31中,点击“点击查看此留言信息”,即可查看该留言信息并且进行相应操作。如图3-32所示。
图3-32 留言信息 | |


































2529

被折叠的 条评论
为什么被折叠?



