首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用jsp编写一个留言簿

好的,下面是一个使用JSP编写的简单留言簿示例。这个示例包括前端页面和后端处理逻辑。

基础概念

JSP(JavaServer Pages) 是一种用于创建动态Web内容的技术。它允许开发者在HTML页面中嵌入Java代码,从而实现动态内容的生成和处理。

优势

  1. 易于开发:JSP页面可以混合HTML和Java代码,便于开发者编写和维护。
  2. 平台独立性:基于Java技术,具有良好的跨平台特性。
  3. 可扩展性:可以通过自定义标签库和Servlet来扩展功能。

类型

  • 静态页面:包含固定内容的页面。
  • 动态页面:根据用户请求动态生成内容的页面。

应用场景

  • 留言簿:用户可以在网页上留下信息。
  • 博客系统:显示和管理博客文章。
  • 电子商务网站:展示商品信息和处理订单。

示例代码

1. 创建数据库表

首先,需要在数据库中创建一个表来存储留言信息。假设使用MySQL数据库:

代码语言:txt
复制
CREATE TABLE messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    message TEXT,
    date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 创建JSP页面

index.jsp(留言簿主页面)

代码语言:txt
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>留言簿</title>
</head>
<body>
    <h1>欢迎来到留言簿</h1>
    <form action="submit_message.jsp" method="post">
        姓名: <input type="text" name="name"><br><br>
        留言: <textarea name="message" rows="4" cols="50"></textarea><br><br>
        <input type="submit" value="提交">
    </form>

    <h2>留言列表</h2>
    <%
        // 连接数据库并获取留言列表
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "your_username";
        String password = "your_password";
        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            String sql = "SELECT * FROM messages ORDER BY date DESC";
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery(sql)) {
                while (rs.next()) {
                    out.println("<p><strong>" + rs.getString("name") + "</strong> (" +
                                rs.getTimestamp("date") + "): " + rs.getString("message") + "</p>");
                }
            }
        } catch (Exception e) {
            out.println("<p style='color:red;'>数据库连接错误: " + e.getMessage() + "</p>");
        }
    %>
</body>
</html>

submit_message.jsp(处理留言提交的页面)

代码语言:txt
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String name = request.getParameter("name");
    String message = request.getParameter("message");

    if (name != null && !name.isEmpty() && message != null && !message.isEmpty()) {
        // 连接数据库并插入留言
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "your_username";
        String password = "your_password";
        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            String sql = "INSERT INTO messages (name, message) VALUES (?, ?)";
            try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
                pstmt.setString(1, name);
                pstmt.setString(2, message);
                pstmt.executeUpdate();
            }
        } catch (Exception e) {
            out.println("<p style='color:red;'>数据库插入错误: " + e.getMessage() + "</p>");
        }
    }
    response.sendRedirect("index.jsp");
%>

可能遇到的问题及解决方法

  1. 数据库连接错误
    • 原因:数据库URL、用户名或密码错误,或者数据库服务未启动。
    • 解决方法:检查数据库配置信息,确保数据库服务正常运行。
  • SQL注入风险
    • 原因:直接拼接SQL语句可能导致SQL注入攻击。
    • 解决方法:使用预编译语句(如示例中的PreparedStatement)来防止SQL注入。
  • 页面刷新导致重复提交
    • 原因:用户刷新页面时可能会重复提交表单数据。
    • 解决方法:使用重定向(如示例中的response.sendRedirect("index.jsp"))来避免重复提交。

希望这个示例能帮助你理解如何使用JSP编写一个简单的留言簿。如果有更多问题,欢迎继续提问!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 用 Python 编写一个模板引擎

    我们编写一个最简单的模板引擎,并且探索一下它的底层实现。如果你想直接看代码的话,GitHub 是你的好朋友 语言设计 这里设计的模板语言非常基础。使用两种标签,变量和块。 一个标签。这里使用正则表达式和 split() 函数分隔文本。...可以看到这个正则的意思是 TOKREGEX 要么是一个变量标签,要么是一个块标签,这是为了让变量标签和块标签都能够分隔文本。表达式的最外层是一个括号,用来捕获匹配到的文本。其中的 ?...当一个 Node 创建了一个新的作用域(scope)的时候,会调用 enter_scope,当退出作用域时,会调用 exit_scope。关于作用域,下面会讲到。...比如说: {% each items %} 是一个 each 类型的块节点,因为块命令是 each。 一个节点也可以创建作用域。

    78510

    前端-用 Vue 编写一个长按指令

    有没有想过只需按住一个按钮几秒钟就能在你的 Vue 应用中触发一个功能? 有没有想过创建一个按钮,按下一次就可以清除单次输入(或者持续按住可以清除所有输入)? 想过?太好了,英雄所见略同。...本文就是讲解如何在按下(或者按住)一个按钮时,既执行一个函数,又清除输入。 首先,我会讲解如何使用纯 JS 实现。而后也会创建一个 Vue 指令。 请系好安全带。好戏在后头呢。...首先,我们必须定义三件事,即: 一个 变量 用于存储计时器。 一个 启动 功能函数,用于启动计时器。 一个 取消 功能函数,用于取消计时器。...启动函数 这个函数包括一个 setTimeout,它是 JavaScript 中的一个基本方法,允许在特定时间之后执行一个函数。 注意,click 事件执行的过程中,会触发另外两个事件。...// 长按事件取消,取消计时器 el.addEventListener("click", cancel); el.addEventListener("mouseout", cancel); 用

    2.3K40

    【JavaWeb】70:用Java编写一个转账案例

    转账,相信基本都接触过,无论是线下用银行卡转账还是线上用手机转账,本质上都是差不多的。 一、转账案例 需要两个账户:刘小爱账户和刘妈妈账户;刘小爱账户转出;刘妈妈账户转入。...刘小爱要给刘妈妈转账,毕竟要攒着将来娶媳妇,emm……就转1000吧(看来是娶不到媳妇了……) 在数据库中用sql语句编写一个账户信息表,同时也是对sql语法的一次回顾: ?...用代码模拟这种情况: 上面有异常是直接throws了,现在要自行处理。 使用IDEA开发工具快捷键Ctrl+Alt+T:可以选择一块代码try……catch ?...③Java中提交事务 collection还有一个rollback()方法,顾名思义也就是回滚的意思。 好,现在代码编写完: 如果有异常,执行③事务回滚,数据库数据不变。...那么问题来了,回滚到底有什么用呢? 这个问题我网上查询了下,暂时还不太清楚,它肯定是有它的应用场景的,只不过说我的水平有限,暂时还没有发现。 最后: 谢谢你的观看。

    1.1K40

    JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署

    如上步骤也可参考更详细的教程:http://www.runoob.com/jsp/eclipse-jsp.html 二、编写一个登录静态页面(login.html),注意静态页面(html)、动态页面(...页面,否则直接输出错误信息,下面就写index.jsp(动态页面): 四、编写index.jsp(动态页面),我这里将所有jsp页面统一放在jsp目录中,以区分静态页面与动态页面,创建jsp页面的方法与创建静态页面方法基本相同...五、编写edit.jsp页面,用于可修改记录或删除记录(即:增、删、改),同样参照index.jsp的创建步骤 创建好edit.jsp空页面后,编写如下代码: 编写一个登录验证过滤器:LoginValidationFilter,以实现对某些目录下页面进行登录限制(如:本文示例的是jsp目录),过滤器必需实现Filter接口,过滤器的主要逻辑写在doFilter...JSP可以HTML与JAVA语言混合,大家也看我上面的DEMO代码,有些地方我用HTML静态页面,而有些我又使用JSP动态页面。

    3.2K30

    Cypress系列-编写第一个用例

    Cypress环境搭建 Cypress系列-使用yarn命令搭建cypress自动化测试环境 Cypress系列-使用npm命令搭建cypress环境 编写第一个测试脚本 在cypress的项目目录下...,在integration文件夹下创建一个first_test_demo.js文件,写入如下内容: describe('My First Test', () => { it('Does not do..., () => { expect(true).to.equal(true) }) }) 然后在命令行窗口执行npx cypress open命令启动cypress,在弹出的窗口中点击自己编写的测试脚本文件...编写第一个打开网站的脚本 可以使用以下的脚本去进行操作: cy.visit('url') #打开网址 cy.contains('content').click() #查找元素,然后进行点击 完整的脚本如下...检查当前页面url是否包含 '/commands/actions' cy.url().should('include', '/commands/actions') // 获取一个输入框

    72530

    用php编写一个以太坊支付系统

    我觉得Stripe的问题在于,它只允许使用美国商家帐户进行比特币支付,所以这对我来说不是一个选择。在以太坊世界,它看起来更糟糕。有一些较新的服务,但他们都想要分享蛋糕。...启用了RPC的专用网络中至少有一个Parity节点。 网络服务器上的虚拟地址生成器,如vanity-eth。 那它是如何工作的?...第2步:编写付款类 首先创建一个名为libs的文件夹,然后将php-ethereum repo克隆到其中。ethereum-php项目是json-rpc类的一个很好的封装。...在API Heaven,我们为每位客户提供一个可以存入资金的ETH地址。cronjob每分钟检查所有客户地址以检测更改。...另一个方法是计算固定价格并将其保存在用户会话中。客户必须在网站上付款,并且您需要向AJAX查询已收到的付款。如果收到全部金额,后端会触发销售。

    1.5K10

    用 Deno 编写一个简单的 REST API

    年的年度突破奖, Deno 作为明日之星的项目,目前生态还不是很完善,和一言不合就造轮子的大佬相比,作为代码搬砖界的小丑 -- Copy攻城狮便只能简单记录下自己的学习历程,今天想分享的是如何使用 Deno 编写一个简单的...先来一个最简单的目录: . ├── mod.ts // 入口文件 ├── caseItem.ts // 接口 ├── controller.ts // 控制器...您可以指定一个可选的,用逗号分隔的域列表,以提供允许域的允许列表。 --allow-plugin 允许加载插件。请注意这是一个不稳定的功能。...使用时只需新建.http或者.rest为后缀的文件,编写请求格式的代码即可,如下图中,只需在api.http中写入GET http://localhost:8080,点击Send Request即可发起一次请求...: REST Client 接着我们编写上面实现的 CRUD 接口调试脚本, api.http: @baseUrl = http://localhost:8080 ### 问候 GET

    89410

    用Rust编写一个简易的游戏引擎

    而从头编写一个简易的游戏引擎,不仅可以深入学习游戏开发的基础知识,还能更好地掌握Rust语言在实践中的使用技巧。本博客的目标是引导开发者从零开始构建一个功能基础但具有完整架构的2D游戏引擎。...我们的目标是:为每个游戏对象创建一个实体(例如玩家、敌人、子弹等)。通过组件为实体赋予属性和行为(如位置、速度、生命值)。提供一个系统来更新这些组件(如处理物理碰撞、移动角色)。...,并设置了一个简单的事件循环来处理窗口关闭和键盘输入。...在这个例子中,我们渲染一个简单的颜色矩形。...总结与扩展在本文中,我们使用Rust编写了一个简易的游戏引擎,涵盖了基本的窗口创建、事件处理、图形渲染和资源管理等核心功能。

    16010

    探秘Java:用ByteBuddy编写一个简单的Agent

    一、从认识ByteBuddy开始   在之前的博客当中我们了解了Java Agent的一些基本概念和如何编写一个简单的Java Agent,但是在之前的博客中所使用的Agent编写方法还是相对原始和繁琐的...二、编写一个简单的Java Agent——方法耗时统计   从上面的描述中我们可以了解到,ByteBuddy的诞生并非单纯为了创建Java Agent,我们只是借助了ByteBuddy提供的API来生成更易维护的...Java Agent,下面我们通过一个简单的例子来了解一下如何使用ByteBuddy来编写一个Java Agent。   ...看到这里是否会感觉和代理模式(或者说我们常用的AOP)有些类似,尤其是TimeInterceptor当中的处理逻辑,只是在这一过程中并没有使用反射机制,这也是使用ByteBuddy的一个优势; 最后,在完成了对于拦截对象的指定和对象处理逻辑的编写后...和原先直接编写一个ClassFileTransformer然后修改其中的二进制文件数据相比,使用AgentBuilder来会让我们对于整个的处理逻辑更加明确和专注,在编写的过程我们只需要关注所需要修改的对象和修改的逻辑

    2.4K40

    Docker 部署一个用 Python 编写的 Web 应用

    编写代码 3. 编写 Dockerfile 4. 上传镜像 5. 修改镜像 learn from 《深入剖析Kubernetes》 1....编写代码 使用 Flask 框架启动了一个 Web 服务器,而它唯一的功能是:如果当前环境中有 “NAME” 这个环境变量,就把它打印在 “Hello” 后,否则就打印 “Hello world”,最后再打印出当前环境的...编写 Dockerfile # 使用官方提供的 Python 开发镜像作为基础镜像 FROM python:3.8-slim # 将工作目录切换为 /app WORKDIR /app # 将当前目录下的所有内容复制到...Hostname: dc1c1343e366 使用容器完成了一个应用的开发与测试 4....14 11:15 user -> 'user:[4026531837]' lrwxrwxrwx 1 root root 0 Sep 14 11:15 uts -> 'uts:[4026532219]' 一个进程

    85120
    领券