用JSP做留言板,简易核心其实就三件事:存数据、实现取数据、简易显示数据。实现没有Spring那套依赖注入,简易没有MyBatis的实现映射文件,一个Tomcat加一个MySQL就能跑起来。简易我前阵子帮一个学弟调他的实现课程设计,打开压缩包一看,简易index.jsp里直接连数据库,实现连DAO层都没拆,简易代码全糊在一页里,实现但确实能跑——这大概就是简易JSP最原始的样子。
先说数据库。实现建一张表就够了,简易字段不用多:id自增主键、username存昵称、content存留言正文、create_time记录时间戳。MySQL建表语句三行搞定,字符集选utf8mb4,不然后面有人发emoji直接报错。我见过有人用varchar(255)存留言内容,结果用户打了三百字提交直接截断,页面上啥提示都没有,这种坑踩一次就记住了。
CREATE TABLE message ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), content TEXT, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); 接着是JSP页面本身。很多人习惯在JSP顶部写<%@ page import="java.sql.*" %>,然后一路往下写JDBC代码。能跑,但页面和逻辑搅在一起,改个字段名要翻半天的HTML。我的做法是把数据库连接抽成一个单独的JavaBean或者工具类,JSP里只负责拿结果集渲染。比如写个DBUtil.getConnection(),返回Connection对象,JSP里调一下就行。虽然比不上框架优雅,但至少改连接串的时候不用满屏找。
显示留言用JSTL的<c:forEach>比脚本片段干净得多。脚本片段里写for循环加out.print,HTML标签和Java代码交替出现,看两眼就晕。用JSTL的话,Controller层(其实就是另一个JSP或者Servlet)把List<Message>塞进request,页面里直接遍历:
<c:forEach items="${ messages}" var="msg"> <div class="msg"> <strong>${ msg.username}</strong> <p>${ msg.content}</p> <span>${ msg.createTime}</span> </div> </c:forEach> 提交留言那块,表单action指向一个处理页,POST过去之后用request.getParameter拿值,再拼INSERT语句。这里有个细节:中文乱码。Tomcat默认ISO-8859-1解码,不设request.setCharacterEncoding("UTF-8")的话,存进去全是问号。我当年第一次做的时候不知道,提交了十条留言,数据库里全是“??”,排查了半天以为是数据库字符集问题,其实是请求编码没设。
分页这事看需求。留言少的时候一页全展示无所谓,超过五十条就得考虑LIMIT了。JSP里做分页不用太复杂,传个page参数,算一下offset,SQL里加LIMIT offset, size。页码导航用简单的上一页下一页就行,没必要上分页插件。我见过有人为了一个留言板引入PageHelper,jar包比项目本身还大,属实没必要。
安全方面,至少做一层HTML转义。用户输入<script>alert(1)</script>直接存进去,下次加载页面就弹窗。用JSTL的<c:out>标签默认就会转义,或者自己写个replace把尖括号换掉。SQL注入也得防,别用字符串拼接,老老实实上PreparedStatement。这两条不做,留言板就是个活靶子。
整个项目文件结构可以很简单:一个index.jsp负责展示和提交表单,一个doSubmit.jsp处理插入,一个DBUtil.java管连接。不需要web.xml配置Servlet映射,JSP直接访问就行。部署到Tomcat的webapps目录下,启动服务器,浏览器敲localhost:8080/messageboard/就能用。代码量撑死两百行,但该有的功能都有了。
说白了,JSP留言板就是个练手项目,重点不在技术多先进,而在于把请求、数据库、页面渲染这条链路跑通。跑通之后再去看Spring MVC,会发现很多概念其实是一回事,只是换了个更规整的壳。